{
  "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-09T09:26:50.167166367Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 99,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 39,
          "p95ms24h": 99,
          "samples24h": 20,
          "samples30d": 20,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 20,
              "ok": 20
            }
          ]
        },
        "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-09T09:26:50.167166367Z"
      }
    },
    "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against ntfy's 61.5 (C), and leads in 5 of 7 scored categories. ntfy leads on reliability and payments \u0026 pricing.",
    "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-09T09:26:58.710995319Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 318,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 244,
          "p95ms24h": 279,
          "samples24h": 261,
          "samples30d": 2085,
          "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": 101,
              "ok": 101
            }
          ]
        },
        "vendorStatus": {
          "page": "https://ntfy.statuspage.io",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-09T09:25:19.587847494Z"
        },
        "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-09T09:26:58.710995319Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Google",
        "b": "ntfy",
        "name": "Vendor"
      },
      {
        "a": "https://fcm.googleapis.com",
        "b": "https://ntfy.sh",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP",
        "b": "HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth",
        "b": "OAuth or 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": "Apache-2.0 and GPL-2.0 (dual)",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "no",
        "name": "llms.txt"
      },
      {
        "a": "2026-09-24",
        "b": "2026-08-27",
        "name": "Last release"
      },
      {
        "a": "2021-11-09",
        "b": "2026-01-26",
        "name": "Terms last updated"
      },
      {
        "a": "2026-10-01",
        "b": "2026-06-15",
        "name": "Privacy policy last updated"
      },
      {
        "a": "yes",
        "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": "11.5M npm/wk, 3.8M PyPI/wk",
        "b": "34k stars",
        "name": "Popularity"
      },
      {
        "a": "none",
        "b": "4/5 (2)",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against ntfy's 61.5 (C), and leads in 5 of 7 scored categories. ntfy leads on reliability and payments \u0026 pricing.",
        "question": "Which is better for AI agents, Firebase Cloud Messaging or ntfy?"
      },
      {
        "answer": "Firebase Cloud Messaging uses an OAuth sign-in. ntfy takes an API key or an OAuth sign-in.",
        "question": "Do Firebase Cloud Messaging and ntfy need an API key?"
      },
      {
        "answer": "Yes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and ntfy at https://ntfy.sh.",
        "question": "Can an agent call Firebase Cloud Messaging and ntfy without installing anything?"
      },
      {
        "answer": "No open-source release is listed for Firebase Cloud Messaging. ntfy is open source (Apache-2.0 and GPL-2.0 (dual)).",
        "question": "Are Firebase Cloud Messaging and ntfy open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Schema \u0026 documentation, 86 against 53",
          "Security \u0026 auth, 68 against 38",
          "Maintenance \u0026 community, 83 against 67"
        ],
        "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, 83 against 66",
          "Payments \u0026 pricing, 50 against 40"
        ],
        "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-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-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-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-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-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-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-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-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-ntfy.json",
        "title": "Knock vs ntfy",
        "url": "https://www.anchorterminal.com/compare/knock-vs-ntfy"
      },
      {
        "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/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": 17,
        "edge": "ntfy",
        "firebase-cloud-messaging": 66,
        "key": "reliability",
        "name": "Reliability",
        "ntfy": 83,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 33,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 86,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "ntfy": 53,
        "weight": 13
      },
      {
        "by": 4,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 70,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "ntfy": 66,
        "weight": 13
      },
      {
        "by": 30,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 68,
        "key": "security",
        "name": "Security \u0026 auth",
        "ntfy": 38,
        "weight": 14
      },
      {
        "by": 10,
        "edge": "ntfy",
        "firebase-cloud-messaging": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "ntfy": 50,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 16,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 83,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "ntfy": 67,
        "weight": 7
      },
      {
        "by": 3,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 81,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "ntfy": 78,
        "weight": 7
      }
    ],
    "summary": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against ntfy's 61.5 (C), and leads in 5 of 7 scored categories. ntfy leads on reliability and payments \u0026 pricing. 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.",
      "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/firebase-cloud-messaging-vs-ntfy",
    "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.md",
    "slim": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.min.md"
  },
  "markdown": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against ntfy's 61.5 (C), and leads in 5 of 7 scored categories. ntfy leads on reliability and payments \u0026 pricing. 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- 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### 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 53\n- Security \u0026 auth, 68 against 38\n- Maintenance \u0026 community, 83 against 67\n\nWatch for: Push transport only. No in-app feed, email, SMS, user preferences, digests or templates\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 66\n- Payments \u0026 pricing, 50 against 40\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 | Firebase Cloud Messaging | ntfy | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 66 | 83 | ntfy +17 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 86 | 53 | Firebase Cloud Messaging +33 |\n| Agent ergonomics | 13% (16.2 this run) | 70 | 66 | Firebase Cloud Messaging +4 |\n| Security \u0026 auth | 14% (17.5 this run) | 68 | 38 | Firebase Cloud Messaging +30 |\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) | 83 | 67 | Firebase Cloud Messaging +16 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 81 | 78 | Firebase Cloud Messaging +3 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **69.8 · B** | **61.5 · C** | |\n\n## Facts side by side\n\n| Fact | Firebase Cloud Messaging | ntfy |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Google | ntfy |\n| Hosted endpoint | `https://fcm.googleapis.com` | `https://ntfy.sh` |\n| Transports | HTTP | HTTP |\n| Auth | OAuth | OAuth or 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 | Apache-2.0 and GPL-2.0 (dual) |\n| Read-only variant documented | no | no |\n| llms.txt | yes | no |\n| Last release | 2026-09-24 | 2026-08-27 |\n| Terms last updated | 2021-11-09 | 2026-01-26 |\n| Privacy policy last updated | 2026-10-01 | 2026-06-15 |\n| Customer content may train models | yes | 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 | 11.5M npm/wk, 3.8M PyPI/wk | 34k stars |\n| Agent reviews | none | 4/5 (2) |\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**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### 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### 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, Firebase Cloud Messaging or ntfy?\n\nFirebase Cloud Messaging scores 69.8 (B) on agent readiness against ntfy's 61.5 (C), and leads in 5 of 7 scored categories. ntfy leads on reliability and payments \u0026 pricing.\n\n### Do Firebase Cloud Messaging and ntfy need an API key?\n\nFirebase Cloud Messaging uses an OAuth sign-in. ntfy takes an API key or an OAuth sign-in.\n\n### Can an agent call Firebase Cloud Messaging and ntfy without installing anything?\n\nYes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and ntfy at https://ntfy.sh.\n\n### Are Firebase Cloud Messaging and ntfy open source?\n\nNo open-source release is listed for Firebase Cloud Messaging. 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/firebase-cloud-messaging-vs-ntfy.json, and with the fewest tokens: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"firebase-cloud-messaging\", \"b\": \"ntfy\"}`. From a terminal: `anchor compare firebase-cloud-messaging ntfy`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json and https://www.anchorterminal.com/api/v1/tools/ntfy.json\n\n## Other comparisons with Firebase Cloud Messaging or ntfy\n\n- [Amazon SNS vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/amazon-sns-vs-firebase-cloud-messaging.md)\n- [Amazon SNS vs ntfy](https://www.anchorterminal.com/compare/amazon-sns-vs-ntfy.md)\n- [Courier vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/courier-vs-firebase-cloud-messaging.md)\n- [Courier vs ntfy](https://www.anchorterminal.com/compare/courier-vs-ntfy.md)\n- [Firebase Cloud Messaging vs Knock](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-knock.md)\n- [Firebase Cloud Messaging vs MagicBell](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-magicbell.md)\n- [Firebase Cloud Messaging vs Novu](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.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 ntfy](https://www.anchorterminal.com/compare/knock-vs-ntfy.md)\n- [MagicBell vs ntfy](https://www.anchorterminal.com/compare/magicbell-vs-ntfy.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": "Firebase Cloud Messaging vs ntfy",
        "url": ""
      }
    ],
    "description": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against ntfy's 61.5 (C), and leads in 5 of 7 scored categories. ntfy leads on reliability and payments \u0026 pricing. Both do notify push. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Firebase Cloud Messaging B 69.8",
      "ntfy C 61.5",
      "scores"
    ],
    "h1": "Firebase Cloud Messaging vs ntfy",
    "image": "https://www.anchorterminal.com/assets/og/compare-firebase-cloud-messaging-vs-ntfy.png",
    "path": "/compare/firebase-cloud-messaging-vs-ntfy",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Firebase Cloud Messaging vs ntfy for AI agents, B 69.8 vs C 61.5",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy"
  },
  "tokens": {
    "markdown": 2250,
    "slim": 630
  },
  "version": 1
}
