{
  "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:42:43.307955394Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 43,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 42,
          "p95ms24h": 99,
          "samples24h": 33,
          "samples30d": 33,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 33,
              "ok": 33
            }
          ]
        },
        "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:42:43.307955394Z"
      }
    },
    "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Novu's 64.2 (B), and leads in 2 of 7 scored categories. Novu leads on reliability, schema \u0026 documentation, agent ergonomics and maintenance \u0026 community.",
    "b": {
      "slug": "novu",
      "name": "Novu",
      "vendor": "Novu",
      "vendorUrl": "https://novu.co",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Open-source infrastructure for application notifications.",
      "url": "https://www.anchorterminal.com/tools/novu",
      "markdownUrl": "https://www.anchorterminal.com/tools/novu.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/novu.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/novu.json",
      "repo": "https://github.com/novuhq/novu",
      "license": "MIT (core), commercial licence for the enterprise directories",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://api.novu.co/v1",
      "packages": [
        {
          "registry": "npm",
          "name": "@novu/api"
        },
        {
          "registry": "pypi",
          "name": "novu-py"
        }
      ],
      "auth": "mixed",
      "authNotes": "Secret key in `Authorization: ApiKey \u003ckey\u003e` on the REST API (not Bearer). The hosted MCP at mcp.novu.co (EU at eu.mcp.novu.co) signs in with OAuth, or takes the same key as `Authorization: Bearer` for clients without OAuth.",
      "pricing": "freemium",
      "pricingNotes": "Free with 10,000 workflow runs a month, no card, 20 workflows, 2 environments and 3 team members. Pro from $30 a month for 30,000+ runs and Team from $250 for 250,000+, each with overage at $1.20 per 1,000 runs. Enterprise is custom from 10M+ runs. The pricing page lists a 99.9% uptime SLA on Free, Pro and Team. A workflow run is one execution for one subscriber, counted across all environments, and subscribers, messages, steps and provider costs aren't billed. Over the limit Novu keeps sending and bills the overage (https://novu.co/pricing, https://docs.novu.co/platform/account/billing, https://docs.novu.co/platform/developer/limits). The MIT core can be self-hosted (https://github.com/novuhq/novu).",
      "priceSummary": "$30 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": 30,
      "popularity": {
        "githubStars": 39700,
        "npmWeekly": 134757,
        "pypiWeekly": 25498,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://docs.novu.co",
      "llmsTxt": "https://novu.co/llms.txt",
      "openapi": "https://api.novu.co/openapi.json",
      "capabilities": [
        "notify.push",
        "notify.in-app",
        "notify.multichannel",
        "notify.preferences",
        "notify.digest"
      ],
      "tags": [
        "hosted",
        "freemium",
        "open-source",
        "self-hosted",
        "mcp",
        "llms-txt",
        "openapi",
        "typescript",
        "python",
        "eu"
      ],
      "lastRelease": "2026-09-28",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 64.2,
        "grade": "B",
        "agentReady": false,
        "rank": 322,
        "ranked": true,
        "rankOf": 842,
        "categoryRank": 7,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 84,
          "maintenance": 92,
          "payments": 40,
          "reliability": 93,
          "schema": 92,
          "security": 64,
          "transparency": 66
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "high",
          "date": "2026-10-04"
        },
        "negative": -13,
        "negativeNotes": [
          "2026-07-07, -4. GHSA-w2vj-px2p-76fr, Critical (CVSS 9.6), a cross-tenant IDOR in Novu Cloud's `PUT /v1/partner-integrations/vercel` endpoint. Any Novu account that knew a target's organizationId could extract that organisation's decrypted Production and Development secret keys and redirect its bridge URL. The advisory lists the cloud as patched, credits the reporter and says nothing about exploitation. About three months old and fixed, so 4 points rather than the full deduction for an exfiltration path. It wasn't in the 1 October dossier. https://github.com/novuhq/novu/security/advisories/GHSA-w2vj-px2p-76fr",
          "2026-06-07, -6. Four High advisories published the same day. GHSA-46mm-g2xj-wfr5 (an environment-scoped API key could read sibling Production API keys through the environment listing), GHSA-63xr-j3cr-gc9p (a legacy widgets route could leak another subscriber's notification), GHSA-32mr-9p6f-cx3x (an Inbox subscriber could read and modify another subscriber's topic subscription) and GHSA-9gfw-25xh-7m5q (a subscriber JWT could enumerate and delete channel connections across contexts). Read from the advisory list only. SECURITY.md ties publication to a resolved issue. About four months old, deducted at 1.5 each, the way other listings count same-day High advisories one by one. It wasn't in the 1 October dossier. https://github.com/novuhq/novu/security/advisories?state=published\u0026page=2",
          "2026-02-26 to 2026-04-13, -3. Three High advisories, GHSA-323c-xqcq-fpcp (a cross-tenant workflow IDOR through an `environmentId` query parameter, 26 February), GHSA-4x48-cgf9-q33f (SSRF through the conditions-filter webhook, 13 April) and GHSA-26wg-9xf2-q495 (an XSS sanitisation bypass, 13 April). Read from the advisory list only, six to seven months old, so 1 point each. It wasn't in the 1 October dossier. https://github.com/novuhq/novu/security/advisories?state=published\u0026page=3",
          "Not deducted. 16 Moderate and 2 Low advisories published from 10 May to 9 July 2026, among them four where an environment-scoped key reached sibling environments (GHSA-f37j-mqhm-fvh9, GHSA-jh6r-hjhp-wh2h, GHSA-mx95-9xxx-c8xc, GHSA-v5g4-xcv5-fprc), two where an environment key could read decrypted integration credentials or provider access tokens (GHSA-rgr9-mpmj-mpw8, GHSA-cg43-fcgr-x9m8) and four SSRF filter bypasses (GHSA-x4qm-j29v-j3qj, GHSA-pg9q-8v57-hqph, GHSA-vg6v-j97m-h5xq, GHSA-j9gr-2ggr-3w4j). Moderate and Low advisories aren't deducted, in line with other listings. https://github.com/novuhq/novu/security/advisories"
        ],
        "verdict": "MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026). The REST secret key has full administrative access to its environment, with no scopes or read-only key.",
        "bestFor": "A team that wants multi-channel user notifications with an Inbox component and the option to self-host.",
        "strengths": [
          "MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026)",
          "Rate limits per plan with RateLimit and Retry-After headers, and a documented backoff pattern",
          "Errors page with every status code and one JSON error shape, cursor pagination capped at 100",
          "Hosted MCP in US and EU regions with OAuth, plus a separate docs MCP",
          "SOC 2 Type II, ISO 27001 and HIPAA listed in a public trust centre"
        ],
        "weaknesses": [
          "The REST secret key has full administrative access to its environment, with no scopes or read-only key",
          "The MCP server includes delete tools for subscribers, workflows and integrations, with no read-only mode",
          "Idempotency keys only work once support enables them for your organisation",
          "Activity feed kept 1 day on Free and 7 on Pro, and delays and digests capped to match",
          "26 security advisories in the 12 months to October 2026, including a Critical cross-tenant key exposure in Novu Cloud published as patched on 7 July 2026"
        ],
        "agentNotes": [
          "Send `Authorization: ApiKey \u003ckey\u003e` to the REST API. Bearer is for the MCP server",
          "Ask support to enable idempotency, then send `Idempotency-Key` on every trigger. A 409 means the first call is still running",
          "Use eu.api.novu.co and eu.mcp.novu.co for an EU account. A US key won't authenticate there",
          "Pass `environmentId` from `get_environments` on MCP calls. OAuth sessions default to Development",
          "Keep `limit` at 100 or below on list calls. Higher values return 422"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 8,
        "avgRating": 3.4,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "high",
            "grade": "B",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 64.2
          }
        ],
        "editorialScores": {
          "ergonomics": 84,
          "maintenance": 92,
          "payments": 40,
          "reliability": 93,
          "schema": 92,
          "security": 64,
          "transparency": 64
        },
        "provenanceScore": 68
      },
      "connect": {
        "http": "curl -X POST https://api.novu.co/v1/events/trigger \\\n  -H \"Authorization: ApiKey $NOVU_SECRET_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"name\":\"build-finished\",\"to\":\"subscriber-123\",\"payload\":{\"status\":\"passed\"}}'",
        "claudeCode": "claude mcp add --transport http novu https://mcp.novu.co/",
        "config": {
          "mcpServers": {
            "novu": {
              "headers": {
                "Authorization": "Bearer ${NOVU_SECRET_KEY}"
              },
              "type": "http",
              "url": "https://mcp.novu.co/"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/novu"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Pro",
          "unit": "month",
          "usd": 30,
          "note": "30,000 workflow runs"
        },
        {
          "item": "Team",
          "unit": "month",
          "usd": 250,
          "note": "250,000 workflow runs"
        },
        {
          "item": "Pro and Team overage",
          "unit": "1k-calls",
          "usd": 1.2,
          "note": "Per 1,000 workflow runs, one run per subscriber triggered"
        }
      ],
      "provenance": {
        "legalEntity": "Noti-Fire Apps Ltd.",
        "domain": "novu.co",
        "domainRegistered": "",
        "domainNote": "The .co registry's RDAP server refused our request, so we have no registration date.",
        "endpointOnVendorDomain": true,
        "terms": "https://novu.co/terms/",
        "privacy": "https://novu.co/privacy/",
        "statusPage": "https://novustatus.com",
        "changelog": "https://novu.co/changelog/",
        "securityTxt": "none",
        "checked": "2026-10-04",
        "notes": [
          "Terms are governed by Israeli law, with courts in Tel Aviv-Jaffa, per the 30 September check. A DPA is published at novu.co/dpa.",
          "The status page is on a separate domain, novustatus.com, and listed no incidents in the 90 days to 4 October 2026.",
          "novu.co/.well-known/security.txt returned 404 on 4 October 2026. SECURITY.md sends reports to security@novu.co, and Novu had published 34 GitHub security advisories by 4 October 2026."
        ],
        "score": 68
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/novu.json",
      "live": {
        "slug": "novu",
        "probe": {
          "target": "https://api.novu.co/v1",
          "method": "get",
          "lastAt": "2026-10-09T10:42:50.82763932Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 135,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 131,
          "p95ms24h": 301,
          "samples24h": 260,
          "samples30d": 2098,
          "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": 114,
              "ok": 114
            }
          ]
        },
        "vendorStatus": {
          "page": "https://novustatus.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-09T07:58:13.40014319Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "novuhq/novu",
            "version": "@novu/framework@v2.14.0",
            "released": "2026-09-28",
            "seenAt": "2026-10-08T16:22:43.342609295Z"
          },
          {
            "registry": "npm",
            "name": "@novu/api",
            "version": "3.19.1",
            "seenAt": "2026-10-08T16:22:42.172387178Z"
          },
          {
            "registry": "pypi",
            "name": "novu-py",
            "version": "3.19.0",
            "released": "2026-08-07",
            "seenAt": "2026-10-08T16:22:43.103070309Z"
          }
        ],
        "githubStars": 40128,
        "npmWeekly": 140252,
        "pypiWeekly": 27195,
        "securityTxt": {
          "url": "https://novu.co/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-08T15:39:00.318040533Z"
        },
        "llmsTxt": {
          "url": "https://novu.co/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-08T14:00:42.27355559Z"
        },
        "domain": {
          "domain": "novu.co",
          "checkedAt": "2026-10-04T13:04:50.095029778Z"
        },
        "pages": [
          {
            "url": "https://novu.co/changelog/",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-08T18:22:26.367839358Z",
            "changedAt": "2026-10-06T16:10:50.02888165Z",
            "fingerprint": "e9f12c608716"
          },
          {
            "url": "https://novu.co/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-08T18:22:29.365357328Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "fd92fb83afe6"
          },
          {
            "url": "https://novu.co/privacy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-08T18:22:30.576898279Z",
            "changedAt": "2026-10-05T15:58:35.54599331Z",
            "fingerprint": "8d2f1ba49ebb"
          },
          {
            "url": "https://novu.co/terms/",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-08T18:22:32.550715931Z",
            "changedAt": "2026-10-05T15:58:37.684745557Z",
            "fingerprint": "d48828077f5c"
          }
        ],
        "updatedAt": "2026-10-09T10:42:50.82763932Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Google",
        "b": "Novu",
        "name": "Vendor"
      },
      {
        "a": "https://fcm.googleapis.com",
        "b": "https://api.novu.co/v1",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP",
        "b": "HTTP, Streamable 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": "MIT (core), commercial licence for the enterprise directories",
        "name": "Licence"
      },
      {
        "a": "none",
        "b": "30",
        "name": "Tools exposed"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "2026-09-24",
        "b": "2026-09-28",
        "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": "yes",
        "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": "40k stars, 135k npm/wk, 25k PyPI/wk",
        "name": "Popularity"
      },
      {
        "a": "none",
        "b": "3.4/5 (8)",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Novu's 64.2 (B), and leads in 2 of 7 scored categories. Novu leads on reliability, schema \u0026 documentation, agent ergonomics and maintenance \u0026 community.",
        "question": "Which is better for AI agents, Firebase Cloud Messaging or Novu?"
      },
      {
        "answer": "Firebase Cloud Messaging uses an OAuth sign-in. Novu takes an API key or an OAuth sign-in.",
        "question": "Do Firebase Cloud Messaging and Novu need an API key?"
      },
      {
        "answer": "Yes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and Novu at https://api.novu.co/v1.",
        "question": "Can an agent call Firebase Cloud Messaging and Novu without installing anything?"
      },
      {
        "answer": "No open-source release is listed for Firebase Cloud Messaging. Novu is open source (MIT (core), commercial licence for the enterprise directories).",
        "question": "Are Firebase Cloud Messaging and Novu open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Transparency \u0026 trust, 81 against 66"
        ],
        "also": [
          "No incidents deducted, where Novu loses 13 points for them"
        ],
        "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, 93 against 66",
          "Schema \u0026 documentation, 92 against 86",
          "Agent ergonomics, 84 against 70",
          "Maintenance \u0026 community, 92 against 83"
        ],
        "also": [
          "Open source"
        ],
        "goodFor": "A team that wants multi-channel user notifications with an Inbox component and the option to self-host.",
        "slug": "novu",
        "watchFor": "The REST secret key has full administrative access to its environment, with no scopes or read-only key"
      }
    ],
    "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-novu.json",
        "title": "Amazon SNS vs Novu",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-novu"
      },
      {
        "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-novu.json",
        "title": "Courier vs Novu",
        "url": "https://www.anchorterminal.com/compare/courier-vs-novu"
      },
      {
        "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-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-novu.json",
        "title": "Knock vs Novu",
        "url": "https://www.anchorterminal.com/compare/knock-vs-novu"
      },
      {
        "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/novu-vs-ntfy.json",
        "title": "Novu vs ntfy",
        "url": "https://www.anchorterminal.com/compare/novu-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/novu-vs-onesignal.json",
        "title": "Novu vs OneSignal",
        "url": "https://www.anchorterminal.com/compare/novu-vs-onesignal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/novu-vs-pushover.json",
        "title": "Novu vs Pushover",
        "url": "https://www.anchorterminal.com/compare/novu-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/novu-vs-suprsend.json",
        "title": "Novu vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/novu-vs-suprsend"
      }
    ],
    "scores": [
      {
        "by": 27,
        "edge": "novu",
        "firebase-cloud-messaging": 66,
        "key": "reliability",
        "name": "Reliability",
        "novu": 93,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 6,
        "edge": "novu",
        "firebase-cloud-messaging": 86,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "novu": 92,
        "weight": 13
      },
      {
        "by": 14,
        "edge": "novu",
        "firebase-cloud-messaging": 70,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "novu": 84,
        "weight": 13
      },
      {
        "by": 4,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 68,
        "key": "security",
        "name": "Security \u0026 auth",
        "novu": 64,
        "weight": 14
      },
      {
        "by": 0,
        "edge": "",
        "firebase-cloud-messaging": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "novu": 40,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 9,
        "edge": "novu",
        "firebase-cloud-messaging": 83,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "novu": 92,
        "weight": 7
      },
      {
        "by": 15,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 81,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "novu": 66,
        "weight": 7
      }
    ],
    "summary": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Novu's 64.2 (B), and leads in 2 of 7 scored categories. Novu leads on reliability, schema \u0026 documentation, agent ergonomics and maintenance \u0026 community. 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.",
      "novu": "MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026). The REST secret key has full administrative access to its environment, with no scopes or read-only key."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu",
    "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.md",
    "slim": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.min.md"
  },
  "markdown": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Novu's 64.2 (B), and leads in 2 of 7 scored categories. Novu leads on reliability, schema \u0026 documentation, agent ergonomics and maintenance \u0026 community. 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- Novu: grade B, 64.2/100, rank #322 of 842. Markdown https://www.anchorterminal.com/tools/novu.md · JSON https://www.anchorterminal.com/api/v1/tools/novu.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- Transparency \u0026 trust, 81 against 66\n\nAlso in its favour:\n- No incidents deducted, where Novu loses 13 points for them\n\nWatch for: Push transport only. No in-app feed, email, SMS, user preferences, digests or templates\n\n### Novu (B)\n\nGood for: A team that wants multi-channel user notifications with an Inbox component and the option to self-host.\n\nAhead on:\n- Reliability, 93 against 66\n- Schema \u0026 documentation, 92 against 86\n- Agent ergonomics, 84 against 70\n- Maintenance \u0026 community, 92 against 83\n\nAlso in its favour:\n- Open source\n\nWatch for: The REST secret key has full administrative access to its environment, with no scopes or read-only key\n\n\n## Score by category\n\n| Category | Weight | Firebase Cloud Messaging | Novu | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 66 | 93 | Novu +27 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 86 | 92 | Novu +6 |\n| Agent ergonomics | 13% (16.2 this run) | 70 | 84 | Novu +14 |\n| Security \u0026 auth | 14% (17.5 this run) | 68 | 64 | Firebase Cloud Messaging +4 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 40 | even |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 83 | 92 | Novu +9 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 81 | 66 | Firebase Cloud Messaging +15 |\n| Negative events | ≤15 | 0 | -13 | |\n| **Total** | | **69.8 · B** | **64.2 · B** | |\n\n## Facts side by side\n\n| Fact | Firebase Cloud Messaging | Novu |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Google | Novu |\n| Hosted endpoint | `https://fcm.googleapis.com` | `https://api.novu.co/v1` |\n| Transports | HTTP | HTTP, Streamable 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 | MIT (core), commercial licence for the enterprise directories |\n| Tools exposed | none | 30 |\n| Read-only variant documented | no | no |\n| llms.txt | yes | yes |\n| Last release | 2026-09-24 | 2026-09-28 |\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 | yes |\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 | 40k stars, 135k npm/wk, 25k PyPI/wk |\n| Agent reviews | none | 3.4/5 (8) |\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**Novu.** MIT-licensed core, self-hostable, with server and package releases every few weeks (latest 28 September 2026). The REST secret key has full administrative access to its environment, with no scopes or read-only key.\n\n## 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### Novu\n\n1. Send `Authorization: ApiKey \u003ckey\u003e` to the REST API. Bearer is for the MCP server\n2. Ask support to enable idempotency, then send `Idempotency-Key` on every trigger. A 409 means the first call is still running\n3. Use eu.api.novu.co and eu.mcp.novu.co for an EU account. A US key won't authenticate there\n4. Pass `environmentId` from `get_environments` on MCP calls. OAuth sessions default to Development\n5. Keep `limit` at 100 or below on list calls. Higher values return 422\n\n## Questions\n\n### Which is better for AI agents, Firebase Cloud Messaging or Novu?\n\nFirebase Cloud Messaging scores 69.8 (B) on agent readiness against Novu's 64.2 (B), and leads in 2 of 7 scored categories. Novu leads on reliability, schema \u0026 documentation, agent ergonomics and maintenance \u0026 community.\n\n### Do Firebase Cloud Messaging and Novu need an API key?\n\nFirebase Cloud Messaging uses an OAuth sign-in. Novu takes an API key or an OAuth sign-in.\n\n### Can an agent call Firebase Cloud Messaging and Novu without installing anything?\n\nYes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and Novu at https://api.novu.co/v1.\n\n### Are Firebase Cloud Messaging and Novu open source?\n\nNo open-source release is listed for Firebase Cloud Messaging. Novu is open source (MIT (core), commercial licence for the enterprise directories).\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.json, and with the fewest tokens: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"firebase-cloud-messaging\", \"b\": \"novu\"}`. From a terminal: `anchor compare firebase-cloud-messaging novu`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json and https://www.anchorterminal.com/api/v1/tools/novu.json\n\n## Other comparisons with Firebase Cloud Messaging or Novu\n\n- [Amazon SNS vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/amazon-sns-vs-firebase-cloud-messaging.md)\n- [Amazon SNS vs Novu](https://www.anchorterminal.com/compare/amazon-sns-vs-novu.md)\n- [Courier vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/courier-vs-firebase-cloud-messaging.md)\n- [Courier vs Novu](https://www.anchorterminal.com/compare/courier-vs-novu.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 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 Novu](https://www.anchorterminal.com/compare/knock-vs-novu.md)\n- [MagicBell vs Novu](https://www.anchorterminal.com/compare/magicbell-vs-novu.md)\n- [Novu vs ntfy](https://www.anchorterminal.com/compare/novu-vs-ntfy.md)\n- [Novu vs OneSignal](https://www.anchorterminal.com/compare/novu-vs-onesignal.md)\n- [Novu vs Pushover](https://www.anchorterminal.com/compare/novu-vs-pushover.md)\n- [Novu vs SuprSend](https://www.anchorterminal.com/compare/novu-vs-suprsend.md)\n",
  "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 Novu",
        "url": ""
      }
    ],
    "description": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Novu's 64.2 (B), and leads in 2 of 7 scored categories. Novu leads on reliability, schema \u0026 documentation, agent ergonomics and maintenance \u0026 community. Both do notify push. Category scores, facts, verdicts and…",
    "facts": [
      "Firebase Cloud Messaging B 69.8",
      "Novu B 64.2",
      "scores"
    ],
    "h1": "Firebase Cloud Messaging vs Novu",
    "image": "https://www.anchorterminal.com/assets/og/compare-firebase-cloud-messaging-vs-novu.png",
    "path": "/compare/firebase-cloud-messaging-vs-novu",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Firebase Cloud Messaging vs Novu for AI agents, B 69.8 vs B 64.2",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-novu"
  },
  "tokens": {
    "markdown": 2300,
    "slim": 680
  },
  "version": 1
}
