{
  "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": 170,
        "ranked": true,
        "rankOf": 950,
        "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-cloud-document-ai",
        "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-10T02:54:55.648528921Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 29,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 42,
          "p95ms24h": 136,
          "samples24h": 199,
          "samples30d": 199,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 169,
              "ok": 169
            },
            {
              "date": "2026-10-10",
              "probes": 30,
              "ok": 30
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.firebase.google.com",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-10T00:50:34.166259109Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "firebase/firebase-admin-node",
            "version": "v14.5.0",
            "released": "2026-09-23",
            "seenAt": "2026-10-09T16:53:18.587855434Z"
          },
          {
            "registry": "npm",
            "name": "firebase-admin",
            "version": "14.5.0",
            "seenAt": "2026-10-09T16:53:17.601587804Z"
          },
          {
            "registry": "pypi",
            "name": "firebase-admin",
            "version": "7.7.0",
            "released": "2026-09-23",
            "seenAt": "2026-10-09T16:53:18.42206492Z"
          }
        ],
        "githubStars": 1750,
        "npmWeekly": 9821375,
        "pypiWeekly": 3780074,
        "securityTxt": {
          "url": "https://google.com/.well-known/security.txt",
          "state": "valid",
          "expires": "2030-04-01T00:00:00z",
          "checkedAt": "2026-10-09T15:39:28.443612679Z"
        },
        "llmsTxt": {
          "url": "https://firebase.google.com/docs/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-09T14:02:03.112222164Z"
        },
        "pages": [
          {
            "url": "https://firebase.google.com/support/releases",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-09T18:39:28.508823146Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "55a63ea6d5b0"
          },
          {
            "url": "https://firebase.google.com/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-09T18:39:25.617080484Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "d3dc20920b5b"
          },
          {
            "url": "https://developers.google.com/terms",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-09T18:35:57.610846795Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "2eb11136bf24"
          }
        ],
        "updatedAt": "2026-10-10T02:54:55.648528921Z"
      }
    },
    "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Pingram's 57.4 (C), and leads in 6 of 7 scored categories.",
    "b": {
      "slug": "pingram",
      "name": "Pingram",
      "vendor": "Pingram",
      "vendorUrl": "https://www.pingram.io",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Pingram, formerly NotificationAPI, is a hosted messaging API that sends email and SMS and receives replies by webhook. Agents reach it through a REST API, seven server SDKs, a CLI and a hosted MCP server.",
      "url": "https://www.anchorterminal.com/tools/pingram",
      "markdownUrl": "https://www.anchorterminal.com/tools/pingram.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/pingram.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/pingram.json",
      "repo": "https://github.com/pingram-io/pingram-go",
      "license": "Proprietary service under Pingram's terms of service. The Node.js SDK and CLI are MIT on npm. The Go SDK repository has no licence file",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://mcp.pingram.io",
      "packages": [
        {
          "registry": "npm",
          "name": "pingram"
        },
        {
          "registry": "npm",
          "name": "pingram-cli"
        },
        {
          "registry": "go",
          "name": "github.com/pingram-io/pingram-go"
        }
      ],
      "auth": "mixed",
      "authNotes": "Self-serve. REST calls to `https://api.pingram.io` take an API key as `Authorization: Bearer`. Keys are created in the dashboard or through `POST /keys`, are secret or public, can be tied to one environment and can be revoked. The API reference also lists Basic schemes for client credentials and end users. The hosted MCP server uses OAuth sign-in with the dashboard account (email, Google or Microsoft) and has that user's access on every account they belong to. No scopes were found.",
      "pricing": "freemium",
      "pricingNotes": "Free tier of 3,000 emails and 100 SMS a month with one local number, no card, so an agent's owner can start without a contract. Paid plans are monthly budgets from $20 to $1,000 drawn down at per-message rates, $0.0005 an email and SMS by country ($0.0100 a segment to the United States). Unused balance does not roll over. Enterprise add-on from $800 a month (https://www.pingram.io/pricing).",
      "priceSummary": "$20 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the docs, the pricing page, llms.txt or the API reference (checked 2026-10-09).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 1,
        "npmWeekly": 12699,
        "pypiWeekly": null,
        "asOf": "2026-10-09"
      },
      "docsUrl": "https://www.pingram.io/docs",
      "llmsTxt": "https://www.pingram.io/llms.txt",
      "registryName": "io.pingram/mcp",
      "capabilities": [
        "notify.multichannel",
        "notify.push",
        "notify.in-app",
        "email.send",
        "email.inbound",
        "email.domains",
        "messaging.sms",
        "messaging.mms",
        "messaging.inbound"
      ],
      "tags": [
        "hosted",
        "freemium",
        "mcp",
        "oauth",
        "llms-txt",
        "typescript",
        "python",
        "go",
        "webhooks",
        "status-page",
        "soc2"
      ],
      "lastRelease": "2026-10-08",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 57.4,
        "grade": "C",
        "agentReady": false,
        "rank": 611,
        "ranked": true,
        "rankOf": 950,
        "categoryRank": 11,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 67,
          "maintenance": 81,
          "payments": 40,
          "reliability": 58,
          "schema": 69,
          "security": 51,
          "transparency": 54
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-09"
        },
        "negative": -2,
        "negativeNotes": [
          "2026-10-09. `llms.txt` and `llms-full.txt`, the files Pingram publishes for AI systems, give the paid plan as from $9 a month, while the pricing page's lowest paid budget is $20. `llms.txt` also links the API reference at an address that answers 403 (https://www.pingram.io/llms.txt, https://www.pingram.io/pricing). 2 points."
        ],
        "verdict": "Email and SMS go out through one REST call with built-in delivery, per-message prices are public and the free tier needs no card. No rate limits or idempotency keys were found in the reviewed documentation, and the MCP connector acts with the signed-in user's whole account.",
        "bestFor": "An agent that needs to send transactional email and SMS and read replies through one account without separate carrier or SMTP providers.",
        "strengths": [
          "Email costs $0.0005 a message and SMS is priced per country on a public page, with a free tier of 3,000 emails and 100 SMS a month and no card",
          "Hosted MCP server at `https://mcp.pingram.io` with OAuth sign-in and regional hosts for Canada and the EU, listed in the official MCP registry",
          "Error responses carry a `trackingId` and an `error` object with `code`, `message` and an optional `fix` hint",
          "A dated changelog with a JSON feed shows more than 25 entries between 16 September and 7 October 2026",
          "security.txt valid to 13 September 2027 and a vulnerability disclosure policy with safe harbour, dated 14 September 2026"
        ],
        "weaknesses": [
          "The terms of service forbid using the service for benchmarking. This matters before any probe is run",
          "No request rate limits, 429 handling or idempotency key for sends were found in the reviewed documentation",
          "The MCP connector has the signed-in user's access across every account they belong to, with no scopes or read-only mode found",
          "`llms.txt` gives a paid plan from $9 a month and links an API reference address that answers 403. The pricing page starts paid plans at $20",
          "RBAC, SAML and internal audit logs are sold only in the Enterprise add-on, which starts at $800 a month"
        ],
        "agentNotes": [
          "Use the API host for the account's region. The key and region (`us`, `eu` or `ca`) come from the API Keys page in the dashboard",
          "Keep the `trackingId` from each send and check Logs before retrying. No idempotency key was found, so a blind retry can send twice",
          "Pass `accountId` on MCP tools when the user belongs to several accounts. Without it the tools use the earliest account joined",
          "Create broadcasts as drafts only. Pingram's own skill says a person must send a broadcast from the dashboard",
          "Expect 402 when the monthly budget is spent. Unused balance does not roll over"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 57.4
          }
        ],
        "editorialScores": {
          "ergonomics": 67,
          "maintenance": 81,
          "payments": 40,
          "reliability": 58,
          "schema": 69,
          "security": 51,
          "transparency": 47
        },
        "provenanceScore": 60
      },
      "connect": {
        "install": "npm install pingram",
        "http": "curl -X POST https://api.pingram.io/email \\\n  -H \"Authorization: Bearer $PINGRAM_API_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"type\":\"welcome\",\"to\":\"user@example.com\",\"subject\":\"Welcome\",\"html\":\"\u003cp\u003eHello\u003c/p\u003e\"}'",
        "config": {
          "mcpServers": {
            "pingram": {
              "url": "https://mcp.pingram.io"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/notify.multichannel",
        "tool": "https://letme.dev/pingram"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Email",
          "unit": "1k-emails",
          "usd": 0.5
        },
        {
          "item": "SMS to the United States",
          "unit": "message",
          "usd": 0.01,
          "note": "per segment, carrier fee included"
        },
        {
          "item": "SMS to Canada",
          "unit": "message",
          "usd": 0.015,
          "note": "per segment, carrier fee included"
        },
        {
          "item": "Lowest paid budget",
          "unit": "month",
          "usd": 20,
          "note": "about 2,000 US SMS or 40,000 emails"
        },
        {
          "item": "Extra local phone number",
          "unit": "month",
          "usd": 0.5
        },
        {
          "item": "Enterprise add-on",
          "unit": "month",
          "usd": 800,
          "note": "starting price, on top of a paid budget"
        }
      ],
      "provenance": {
        "legalEntity": "",
        "domain": "pingram.io",
        "domainRegistered": "",
        "endpointOnVendorDomain": true,
        "terms": "https://www.pingram.io/terms-of-service",
        "privacy": "https://www.pingram.io/privacy-policy",
        "statusPage": "https://status.pingram.io",
        "changelog": "https://www.pingram.io/changelog",
        "securityTxt": "valid",
        "checked": "2026-10-09",
        "notes": [
          "No legal entity is named. The terms, privacy policy and footer say Pingram or Pingram™, at 170 Water St., #0200, St. John's, Newfoundland and Labrador, Canada.",
          "The terms (last updated 16 April 2025) cover the website, APIs and related services, and are governed by the law of Newfoundland and Labrador.",
          "The API answers at api.pingram.io and the MCP server at mcp.pingram.io, both on the vendor's domain.",
          "security.txt names security@pingram.io and expires on 13 September 2027.",
          "RDAP for pingram.io answered 404 through rdap.org, so no registration date is recorded."
        ],
        "score": 60
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/pingram.json",
      "live": {
        "slug": "pingram",
        "probe": {
          "target": "https://mcp.pingram.io",
          "method": "get",
          "lastAt": "2026-10-10T02:55:05.848716892Z",
          "lastOk": true,
          "lastStatus": 401,
          "lastMs": 331,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 305,
          "p95ms24h": 883,
          "samples24h": 115,
          "samples30d": 115,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 85,
              "ok": 85
            },
            {
              "date": "2026-10-10",
              "probes": 30,
              "ok": 30
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.pingram.io",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-10T02:50:42.686518356Z"
        },
        "versions": [
          {
            "registry": "npm",
            "name": "pingram",
            "version": "1.0.38",
            "seenAt": "2026-10-09T17:13:00.934046118Z"
          },
          {
            "registry": "npm",
            "name": "pingram-cli",
            "version": "1.0.20",
            "seenAt": "2026-10-09T17:13:01.370409108Z"
          }
        ],
        "githubStars": 1,
        "npmWeekly": 12699,
        "pages": [
          {
            "url": "https://www.pingram.io/changelog",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-09T18:53:04.217531365Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "3ff49dfdb708"
          },
          {
            "url": "https://www.pingram.io/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-09T18:53:06.703182666Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "c41e8c804eec"
          },
          {
            "url": "https://www.pingram.io/privacy-policy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-09T18:53:08.791743628Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "253bc47822ca"
          },
          {
            "url": "https://www.pingram.io/terms-of-service",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-09T18:53:10.238064171Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "bf1565dd261f"
          }
        ],
        "updatedAt": "2026-10-10T02:55:05.848716892Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Google",
        "b": "Pingram",
        "name": "Vendor"
      },
      {
        "a": "https://fcm.googleapis.com",
        "b": "https://mcp.pingram.io",
        "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": "Proprietary service under Pingram's terms of service. The Node.js SDK and CLI are MIT on npm. The Go SDK repository has no licence file",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "llms.txt"
      },
      {
        "a": "not listed",
        "b": "io.pingram/mcp",
        "name": "MCP registry"
      },
      {
        "a": "2026-09-24",
        "b": "2026-10-08",
        "name": "Last release"
      },
      {
        "a": "2021-11-09",
        "b": "2025-04-16",
        "name": "Terms last updated"
      },
      {
        "a": "2026-10-01",
        "b": "2025-04-16",
        "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": "yes",
        "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": "1 stars, 13k npm/wk",
        "name": "Popularity"
      }
    ],
    "faq": [
      {
        "answer": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Pingram's 57.4 (C), and leads in 6 of 7 scored categories.",
        "question": "Which is better for AI agents, Firebase Cloud Messaging or Pingram?"
      },
      {
        "answer": "Firebase Cloud Messaging uses an OAuth sign-in. Pingram takes an API key or an OAuth sign-in.",
        "question": "Do Firebase Cloud Messaging and Pingram need an API key?"
      },
      {
        "answer": "Yes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and Pingram at https://mcp.pingram.io.",
        "question": "Can an agent call Firebase Cloud Messaging and Pingram without installing anything?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Reliability, 66 against 58",
          "Schema \u0026 documentation, 86 against 69",
          "Security \u0026 auth, 68 against 51",
          "Transparency \u0026 trust, 81 against 54"
        ],
        "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": null,
        "also": null,
        "goodFor": "An agent that needs to send transactional email and SMS and read replies through one account without separate carrier or SMTP providers.",
        "slug": "pingram",
        "watchFor": "The terms of service forbid using the service for benchmarking. This matters before any probe is run"
      }
    ],
    "job": {
      "capability": "notify.push",
      "name": "Push notifications"
    },
    "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-pingram.json",
        "title": "Amazon SNS vs Pingram",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-pingram"
      },
      {
        "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-pingram.json",
        "title": "Courier vs Pingram",
        "url": "https://www.anchorterminal.com/compare/courier-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-firebase-cloud-messaging.json",
        "title": "Expo Push Notifications vs Firebase Cloud Messaging",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-firebase-cloud-messaging"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.json",
        "title": "Expo Push Notifications vs Pingram",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram"
      },
      {
        "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-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-pingram.json",
        "title": "Knock vs Pingram",
        "url": "https://www.anchorterminal.com/compare/knock-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magicbell-vs-pingram.json",
        "title": "MagicBell vs Pingram",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/novu-vs-pingram.json",
        "title": "Novu vs Pingram",
        "url": "https://www.anchorterminal.com/compare/novu-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-pingram.json",
        "title": "ntfy vs Pingram",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/onesignal-vs-pingram.json",
        "title": "OneSignal vs Pingram",
        "url": "https://www.anchorterminal.com/compare/onesignal-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/pingram-vs-pushover.json",
        "title": "Pingram vs Pushover",
        "url": "https://www.anchorterminal.com/compare/pingram-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/pingram-vs-suprsend.json",
        "title": "Pingram vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/pingram-vs-suprsend"
      }
    ],
    "scores": [
      {
        "by": 8,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 66,
        "key": "reliability",
        "name": "Reliability",
        "pingram": 58,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 17,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 86,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "pingram": 69,
        "weight": 13
      },
      {
        "by": 3,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 70,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "pingram": 67,
        "weight": 13
      },
      {
        "by": 17,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 68,
        "key": "security",
        "name": "Security \u0026 auth",
        "pingram": 51,
        "weight": 14
      },
      {
        "by": 0,
        "edge": "",
        "firebase-cloud-messaging": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "pingram": 40,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 2,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 83,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "pingram": 81,
        "weight": 7
      },
      {
        "by": 27,
        "edge": "firebase-cloud-messaging",
        "firebase-cloud-messaging": 81,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "pingram": 54,
        "weight": 7
      }
    ],
    "summary": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Pingram's 57.4 (C), and leads in 6 of 7 scored categories. Both do push notifications.",
    "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.",
      "pingram": "Email and SMS go out through one REST call with built-in delivery, per-message prices are public and the free tier needs no card. No rate limits or idempotency keys were found in the reviewed documentation, and the MCP connector acts with the signed-in user's whole account."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram",
    "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.md",
    "slim": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.min.md"
  },
  "markdown": "Firebase Cloud Messaging scores 69.8 (B) on agent readiness against Pingram's 57.4 (C), and leads in 6 of 7 scored categories. Both do push notifications.\n\n- Firebase Cloud Messaging: grade B, 69.8/100, rank #170 of 950. Markdown https://www.anchorterminal.com/tools/firebase-cloud-messaging.md · JSON https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json\n- Pingram: grade C, 57.4/100, rank #611 of 950. Markdown https://www.anchorterminal.com/tools/pingram.md · JSON https://www.anchorterminal.com/api/v1/tools/pingram.json\n- Best notification APIs for AI agents: https://www.anchorterminal.com/best/notifications/index.md\n- All 66 notifications comparisons: https://www.anchorterminal.com/compare/notifications/index.md\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- Reliability, 66 against 58\n- Schema \u0026 documentation, 86 against 69\n- Security \u0026 auth, 68 against 51\n- Transparency \u0026 trust, 81 against 54\n\nWatch for: Push transport only. No in-app feed, email, SMS, user preferences, digests or templates\n\n### Pingram (C)\n\nGood for: An agent that needs to send transactional email and SMS and read replies through one account without separate carrier or SMTP providers.\n\nWatch for: The terms of service forbid using the service for benchmarking. This matters before any probe is run\n\n\n## Score by category\n\n| Category | Weight | Firebase Cloud Messaging | Pingram | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 66 | 58 | Firebase Cloud Messaging +8 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 86 | 69 | Firebase Cloud Messaging +17 |\n| Agent ergonomics | 13% (16.2 this run) | 70 | 67 | Firebase Cloud Messaging +3 |\n| Security \u0026 auth | 14% (17.5 this run) | 68 | 51 | Firebase Cloud Messaging +17 |\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 | 81 | Firebase Cloud Messaging +2 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 81 | 54 | Firebase Cloud Messaging +27 |\n| Negative events | ≤15 | 0 | -2 | |\n| **Total** | | **69.8 · B** | **57.4 · C** | |\n\n## Facts side by side\n\n| Fact | Firebase Cloud Messaging | Pingram |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Google | Pingram |\n| Hosted endpoint | `https://fcm.googleapis.com` | `https://mcp.pingram.io` |\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 | Proprietary service under Pingram's terms of service. The Node.js SDK and CLI are MIT on npm. The Go SDK repository has no licence file |\n| Read-only variant documented | no | no |\n| llms.txt | yes | yes |\n| MCP registry | not listed | `io.pingram/mcp` |\n| Last release | 2026-09-24 | 2026-10-08 |\n| Terms last updated | 2021-11-09 | 2025-04-16 |\n| Privacy policy last updated | 2026-10-01 | 2025-04-16 |\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 | yes |\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 | 1 stars, 13k npm/wk |\n\n## Verdicts\n\n**Firebase Cloud Messaging.** Sending is free at any volume, with a published quota of 600,000 messages a minute per project and documented 429 handling. FCM is push transport only. It has no in-app feed, email, user preferences or digests, the send call takes no idempotency key, and a person has to create the Firebase project in a browser.\n\n**Pingram.** Email and SMS go out through one REST call with built-in delivery, per-message prices are public and the free tier needs no card. No rate limits or idempotency keys were found in the reviewed documentation, and the MCP connector acts with the signed-in user's whole account.\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### Pingram\n\n1. Use the API host for the account's region. The key and region (`us`, `eu` or `ca`) come from the API Keys page in the dashboard\n2. Keep the `trackingId` from each send and check Logs before retrying. No idempotency key was found, so a blind retry can send twice\n3. Pass `accountId` on MCP tools when the user belongs to several accounts. Without it the tools use the earliest account joined\n4. Create broadcasts as drafts only. Pingram's own skill says a person must send a broadcast from the dashboard\n5. Expect 402 when the monthly budget is spent. Unused balance does not roll over\n\n## Questions\n\n### Which is better for AI agents, Firebase Cloud Messaging or Pingram?\n\nFirebase Cloud Messaging scores 69.8 (B) on agent readiness against Pingram's 57.4 (C), and leads in 6 of 7 scored categories.\n\n### Do Firebase Cloud Messaging and Pingram need an API key?\n\nFirebase Cloud Messaging uses an OAuth sign-in. Pingram takes an API key or an OAuth sign-in.\n\n### Can an agent call Firebase Cloud Messaging and Pingram without installing anything?\n\nYes. Firebase Cloud Messaging has a hosted endpoint at https://fcm.googleapis.com and Pingram at https://mcp.pingram.io.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.json, and with the fewest tokens: https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"firebase-cloud-messaging\", \"b\": \"pingram\"}`. From a terminal: `anchor compare firebase-cloud-messaging pingram`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/firebase-cloud-messaging.json and https://www.anchorterminal.com/api/v1/tools/pingram.json\n\n## Other comparisons with Firebase Cloud Messaging or Pingram\n\n- [Amazon SNS vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/amazon-sns-vs-firebase-cloud-messaging.md)\n- [Amazon SNS vs Pingram](https://www.anchorterminal.com/compare/amazon-sns-vs-pingram.md)\n- [Courier vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/courier-vs-firebase-cloud-messaging.md)\n- [Courier vs Pingram](https://www.anchorterminal.com/compare/courier-vs-pingram.md)\n- [Expo Push Notifications vs Firebase Cloud Messaging](https://www.anchorterminal.com/compare/expo-push-notifications-vs-firebase-cloud-messaging.md)\n- [Expo Push Notifications vs Pingram](https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.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 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 Pingram](https://www.anchorterminal.com/compare/knock-vs-pingram.md)\n- [MagicBell vs Pingram](https://www.anchorterminal.com/compare/magicbell-vs-pingram.md)\n- [Novu vs Pingram](https://www.anchorterminal.com/compare/novu-vs-pingram.md)\n- [ntfy vs Pingram](https://www.anchorterminal.com/compare/ntfy-vs-pingram.md)\n- [OneSignal vs Pingram](https://www.anchorterminal.com/compare/onesignal-vs-pingram.md)\n- [Pingram vs Pushover](https://www.anchorterminal.com/compare/pingram-vs-pushover.md)\n- [Pingram vs SuprSend](https://www.anchorterminal.com/compare/pingram-vs-suprsend.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-10",
    "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 Pingram",
        "url": ""
      }
    ],
    "description": "Firebase Cloud Messaging scores 69.8 (B) to Pingram's 57.4 (C) for push notifications. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Firebase Cloud Messaging B 69.8",
      "Pingram C 57.4",
      "scores"
    ],
    "h1": "Firebase Cloud Messaging vs Pingram",
    "image": "https://www.anchorterminal.com/assets/og/compare-firebase-cloud-messaging-vs-pingram.png",
    "path": "/compare/firebase-cloud-messaging-vs-pingram",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Firebase Cloud Messaging vs Pingram for AI agents (2026)",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram"
  },
  "tokens": {
    "markdown": 2450,
    "slim": 680
  },
  "version": 1
}
