{
  "data": {
    "a": {
      "slug": "expo-push-notifications",
      "name": "Expo Push Notifications",
      "vendor": "Expo",
      "vendorUrl": "https://expo.dev",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Hosted push service from Expo that takes one HTTPS request and relays it to Apple's APNs and Google's FCM for apps built with Expo. It issues push tickets and receipts, and sending is free.",
      "url": "https://www.anchorterminal.com/tools/expo-push-notifications",
      "markdownUrl": "https://www.anchorterminal.com/tools/expo-push-notifications.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/expo-push-notifications.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/expo-push-notifications.json",
      "repo": "https://github.com/expo/expo-server-sdk-node",
      "license": "Proprietary service under Expo's terms of service. The Node.js server SDK is MIT",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://exp.host/--/api/v2/push/send",
      "packages": [
        {
          "registry": "npm",
          "name": "expo-server-sdk"
        }
      ],
      "auth": "mixed",
      "authNotes": "No credential by default. The docs say the API \"currently does not require any authentication\", and a send needs only an Expo push token. An owner can turn on enhanced push security in the EAS dashboard, after which every call needs `Authorization: Bearer \u003caccess token\u003e` or fails with `UNAUTHORIZED`. Tokens are personal access tokens, which act on everything the person can reach, or robot user tokens limited by role. Both are created and revoked by a person in the dashboard.",
      "pricing": "free",
      "pricingNotes": "Free. The push FAQ says there is no cost for sending through the service, and the pricing page lists no push charge. A send needs an Expo project with APNs and FCM credentials, which a person sets up on an Expo account. The Free plan is $0 a month, Starter $19 and Production $199, and those prices buy builds and updates, not push. Whether signup asks for a card was not stated.",
      "priceSummary": "Free",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the push docs, the pricing page or the Node SDK source (checked 2026-10-09).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 1037,
        "npmWeekly": 1348515,
        "pypiWeekly": null,
        "asOf": "2026-10-09"
      },
      "docsUrl": "https://docs.expo.dev/push-notifications/sending-notifications/",
      "llmsTxt": "https://docs.expo.dev/llms.txt",
      "capabilities": [
        "notify.push"
      ],
      "tags": [
        "hosted",
        "free",
        "push",
        "no-key",
        "llms-txt",
        "typescript",
        "closed-source",
        "status-page",
        "soc2"
      ],
      "lastRelease": "2026-08-24",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 58.8,
        "grade": "C",
        "agentReady": false,
        "rank": 571,
        "ranked": true,
        "rankOf": 950,
        "categoryRank": 9,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 63,
          "maintenance": 74,
          "payments": 40,
          "reliability": 65,
          "schema": 60,
          "security": 48,
          "transparency": 68
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-09"
        },
        "negative": 0,
        "verdict": "A free push relay with a small, well documented HTTP API, published limits of 600 notifications a second and written error codes. Sending needs no credential unless the owner turns on access tokens, there is no idempotency key or SLA, and the status page records three iOS push incidents since 4 August 2026.",
        "bestFor": "An agent that must push to an app already built with Expo, at no cost and with one call for both platforms.",
        "strengths": [
          "One POST to `https://exp.host/--/api/v2/push/send` reaches both APNs and FCM, with up to 100 messages a request",
          "Sending is free, per the push FAQ, and the Free plan costs $0 a month",
          "Limits are published. 600 notifications a second per project, 100 messages a request, 1,000 receipt IDs a request",
          "Docs are served as Markdown with an `llms.txt` index, and every message field is mapped to its APNs or FCM equivalent",
          "Expo states notification content is held only in memory and queues until handed to Apple or Google"
        ],
        "weaknesses": [
          "The send API needs no authentication by default, so anyone holding a push token can send to that device until the owner enables access tokens",
          "No idempotency key. Expo says a notification may reach Apple or Google more than once, or not at all",
          "No SLA for the push service, stated in the docs",
          "Three iOS push incidents on the status page since 4 August 2026, one a partial outage of 83 minutes and one a backlog of 4 hours 41 minutes",
          "No OpenAPI file or push API changelog was found, and only the Node.js SDK is maintained by Expo",
          "Expo's terms say accounts registered by bots, agents or other automated means are not permitted. This matters before any probe is run"
        ],
        "agentNotes": [
          "Send an array of up to 100 messages per request, all for one project, and stay under 600 notifications a second",
          "Keep each ticket `id` and POST them to `/--/api/v2/push/getReceipts` about 15 minutes later. Receipts are cleared after 24 hours",
          "Stop sending to a token when a ticket or receipt returns `DeviceNotRegistered`",
          "If the project has enhanced push security on, send `Authorization: Bearer \u003caccess token\u003e` or the call fails with `UNAUTHORIZED`",
          "Retry 429 and 5xx with exponential backoff, and expect an occasional duplicate because there is no idempotency key"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 58.8
          }
        ],
        "editorialScores": {
          "ergonomics": 63,
          "maintenance": 74,
          "payments": 40,
          "reliability": 65,
          "schema": 60,
          "security": 48,
          "transparency": 60
        },
        "provenanceScore": 76
      },
      "connect": {
        "install": "yarn add expo-server-sdk",
        "http": "curl -H \"Content-Type: application/json\" -X POST \"https://exp.host/--/api/v2/push/send\" -d '{\n  \"to\": \"ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]\",\n  \"title\":\"hello\",\n  \"body\": \"world\"\n}'"
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/expo-push-notifications"
      },
      "area": "everyday",
      "provenance": {
        "legalEntity": "650 Industries, Inc.",
        "domain": "expo.dev",
        "domainRegistered": "2019-02-22",
        "endpointOnVendorDomain": false,
        "terms": "https://expo.dev/terms",
        "privacy": "https://expo.dev/privacy",
        "statusPage": "https://status.expo.dev",
        "changelog": "https://github.com/expo/expo-server-sdk-node/blob/main/CHANGELOG.md",
        "securityTxt": "valid",
        "checked": "2026-10-09",
        "notes": [
          "The terms (last updated 29 May 2025, effective 30 June 2025) are a contract with 650 Industries, Inc. and cover any product or service Expo makes available. They list EAS Build, Update, Submit, Hosting and Workflows by name and do not name the push service.",
          "The push API answers at exp.host, a second domain. Expo's docs and its Node SDK source name that host.",
          "expo.dev/.well-known/security.txt gives vulnerability-disclosures@expo.dev and a Canonical line and has no Expires field, which RFC 9116 requires.",
          "The privacy policy (last updated 21 October 2025) says Expo may collect end users' push tokens when the push service is used.",
          "expo.dev/robots.txt disallows `/expo-subscription-agreement`, so that agreement was not read.",
          "The registry's RDAP record for expo.dev gives a registration date of 2019-02-22. The changelog link is the Node SDK's, because no changelog for the push API itself was found."
        ],
        "score": 76
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/expo-push-notifications.json",
      "live": {
        "slug": "expo-push-notifications",
        "probe": {
          "target": "https://exp.host/--/api/v2/push/send",
          "method": "get",
          "lastAt": "2026-10-10T02:54:55.058129772Z",
          "lastOk": true,
          "lastStatus": 405,
          "lastMs": 121,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 127,
          "p95ms24h": 197,
          "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.expo.dev",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-10T02:50:18.829667993Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "expo/expo-server-sdk-node",
            "version": "v7.2.0",
            "released": "2026-08-24",
            "seenAt": "2026-10-09T16:52:32.455380467Z"
          },
          {
            "registry": "npm",
            "name": "expo-server-sdk",
            "version": "7.2.0",
            "seenAt": "2026-10-09T16:52:31.59453516Z"
          }
        ],
        "githubStars": 1037,
        "npmWeekly": 1348515,
        "pages": [
          {
            "url": "https://raw.githubusercontent.com/expo/expo-server-sdk-node/main/CHANGELOG.md",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-09T18:45:09.224081599Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "851125e2dd50"
          },
          {
            "url": "https://expo.dev/privacy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-09T18:39:14.02772659Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "42bd6fab5bc9"
          },
          {
            "url": "https://expo.dev/terms",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-09T18:39:16.223165435Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "d061e1a55580"
          }
        ],
        "updatedAt": "2026-10-10T02:54:55.058129772Z"
      }
    },
    "answer": "Expo Push Notifications scores 58.8 (C) on agent readiness against Pingram's 57.4 (C), and leads in 2 of 7 scored categories. Pingram leads on schema \u0026 documentation and maintenance \u0026 community.",
    "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": "Expo",
        "b": "Pingram",
        "name": "Vendor"
      },
      {
        "a": "https://exp.host/--/api/v2/push/send",
        "b": "https://mcp.pingram.io",
        "name": "Hosted endpoint"
      },
      {
        "a": "HTTP",
        "b": "HTTP",
        "name": "Transports"
      },
      {
        "a": "OAuth or key",
        "b": "OAuth or key",
        "name": "Auth"
      },
      {
        "a": "Free",
        "b": "Freemium",
        "name": "Pricing"
      },
      {
        "a": "no",
        "b": "no",
        "name": "x402"
      },
      {
        "a": "Proprietary service under Expo's terms of service. The Node.js server SDK is MIT",
        "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-08-24",
        "b": "2026-10-08",
        "name": "Last release"
      },
      {
        "a": "2025-05-29",
        "b": "2025-04-16",
        "name": "Terms last updated"
      },
      {
        "a": "2025-10-21",
        "b": "2025-04-16",
        "name": "Privacy policy last updated"
      },
      {
        "a": "not found in the text",
        "b": "not found in the text",
        "name": "Customer content may train models"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Terms restrict automated access"
      },
      {
        "a": "not found in the text",
        "b": "yes",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "yes",
        "b": "yes",
        "name": "Terms or service can change without notice"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "name": "Arbitration or class-action waiver"
      },
      {
        "a": "1k stars, 1.3M npm/wk",
        "b": "1 stars, 13k npm/wk",
        "name": "Popularity"
      }
    ],
    "faq": [
      {
        "answer": "Expo Push Notifications scores 58.8 (C) on agent readiness against Pingram's 57.4 (C), and leads in 2 of 7 scored categories. Pingram leads on schema \u0026 documentation and maintenance \u0026 community.",
        "question": "Which is better for AI agents, Expo Push Notifications or Pingram?"
      },
      {
        "answer": "Both take an API key or an OAuth sign-in.",
        "question": "Do Expo Push Notifications and Pingram need an API key?"
      },
      {
        "answer": "Yes. Expo Push Notifications has a hosted endpoint at https://exp.host/--/api/v2/push/send and Pingram at https://mcp.pingram.io.",
        "question": "Can an agent call Expo Push Notifications and Pingram without installing anything?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Reliability, 65 against 58",
          "Transparency \u0026 trust, 68 against 54"
        ],
        "also": null,
        "goodFor": "An agent that must push to an app already built with Expo, at no cost and with one call for both platforms.",
        "slug": "expo-push-notifications",
        "watchFor": "The send API needs no authentication by default, so anyone holding a push token can send to that device until the owner enables access tokens"
      },
      {
        "aheadOn": [
          "Schema \u0026 documentation, 69 against 60",
          "Maintenance \u0026 community, 81 against 74"
        ],
        "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-expo-push-notifications.json",
        "title": "Amazon SNS vs Expo Push Notifications",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-expo-push-notifications"
      },
      {
        "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-expo-push-notifications.json",
        "title": "Courier vs Expo Push Notifications",
        "url": "https://www.anchorterminal.com/compare/courier-vs-expo-push-notifications"
      },
      {
        "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-knock.json",
        "title": "Expo Push Notifications vs Knock",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-knock"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-magicbell.json",
        "title": "Expo Push Notifications vs MagicBell",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-magicbell"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-novu.json",
        "title": "Expo Push Notifications vs Novu",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-novu"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.json",
        "title": "Expo Push Notifications vs ntfy",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-onesignal.json",
        "title": "Expo Push Notifications vs OneSignal",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-onesignal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pushover.json",
        "title": "Expo Push Notifications vs Pushover",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-suprsend.json",
        "title": "Expo Push Notifications vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-suprsend"
      },
      {
        "json": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.json",
        "title": "Firebase Cloud Messaging vs Pingram",
        "url": "https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram"
      },
      {
        "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": 7,
        "edge": "expo-push-notifications",
        "expo-push-notifications": 65,
        "key": "reliability",
        "name": "Reliability",
        "pingram": 58,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 9,
        "edge": "pingram",
        "expo-push-notifications": 60,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "pingram": 69,
        "weight": 13
      },
      {
        "by": 4,
        "edge": "pingram",
        "expo-push-notifications": 63,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "pingram": 67,
        "weight": 13
      },
      {
        "by": 3,
        "edge": "pingram",
        "expo-push-notifications": 48,
        "key": "security",
        "name": "Security \u0026 auth",
        "pingram": 51,
        "weight": 14
      },
      {
        "by": 0,
        "edge": "",
        "expo-push-notifications": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "pingram": 40,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 7,
        "edge": "pingram",
        "expo-push-notifications": 74,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "pingram": 81,
        "weight": 7
      },
      {
        "by": 14,
        "edge": "expo-push-notifications",
        "expo-push-notifications": 68,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "pingram": 54,
        "weight": 7
      }
    ],
    "summary": "Expo Push Notifications scores 58.8 (C) on agent readiness against Pingram's 57.4 (C), and leads in 2 of 7 scored categories. Pingram leads on schema \u0026 documentation and maintenance \u0026 community. Both do push notifications.",
    "verdicts": {
      "expo-push-notifications": "A free push relay with a small, well documented HTTP API, published limits of 600 notifications a second and written error codes. Sending needs no credential unless the owner turns on access tokens, there is no idempotency key or SLA, and the status page records three iOS push incidents since 4 August 2026.",
      "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/expo-push-notifications-vs-pingram",
    "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.md",
    "slim": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.min.md"
  },
  "markdown": "Expo Push Notifications scores 58.8 (C) on agent readiness against Pingram's 57.4 (C), and leads in 2 of 7 scored categories. Pingram leads on schema \u0026 documentation and maintenance \u0026 community. Both do push notifications.\n\n- Expo Push Notifications: grade C, 58.8/100, rank #571 of 950. Markdown https://www.anchorterminal.com/tools/expo-push-notifications.md · JSON https://www.anchorterminal.com/api/v1/tools/expo-push-notifications.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### Expo Push Notifications (C)\n\nGood for: An agent that must push to an app already built with Expo, at no cost and with one call for both platforms.\n\nAhead on:\n- Reliability, 65 against 58\n- Transparency \u0026 trust, 68 against 54\n\nWatch for: The send API needs no authentication by default, so anyone holding a push token can send to that device until the owner enables access tokens\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\nAhead on:\n- Schema \u0026 documentation, 69 against 60\n- Maintenance \u0026 community, 81 against 74\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 | Expo Push Notifications | Pingram | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 65 | 58 | Expo Push Notifications +7 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 60 | 69 | Pingram +9 |\n| Agent ergonomics | 13% (16.2 this run) | 63 | 67 | Pingram +4 |\n| Security \u0026 auth | 14% (17.5 this run) | 48 | 51 | Pingram +3 |\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) | 74 | 81 | Pingram +7 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 68 | 54 | Expo Push Notifications +14 |\n| Negative events | ≤15 | 0 | -2 | |\n| **Total** | | **58.8 · C** | **57.4 · C** | |\n\n## Facts side by side\n\n| Fact | Expo Push Notifications | Pingram |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Expo | Pingram |\n| Hosted endpoint | `https://exp.host/--/api/v2/push/send` | `https://mcp.pingram.io` |\n| Transports | HTTP | HTTP |\n| Auth | OAuth or key | OAuth or key |\n| Pricing | Free | Freemium |\n| x402 | no | no |\n| Licence | Proprietary service under Expo's terms of service. The Node.js server SDK is MIT | 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-08-24 | 2026-10-08 |\n| Terms last updated | 2025-05-29 | 2025-04-16 |\n| Privacy policy last updated | 2025-10-21 | 2025-04-16 |\n| Customer content may train models | not found in the text | not found in the text |\n| Terms restrict automated access | yes | not found in the text |\n| Terms restrict benchmarking | not found in the text | yes |\n| Terms or service can change without notice | yes | yes |\n| Arbitration or class-action waiver | yes | not found in the text |\n| Popularity | 1k stars, 1.3M npm/wk | 1 stars, 13k npm/wk |\n\n## Verdicts\n\n**Expo Push Notifications.** A free push relay with a small, well documented HTTP API, published limits of 600 notifications a second and written error codes. Sending needs no credential unless the owner turns on access tokens, there is no idempotency key or SLA, and the status page records three iOS push incidents since 4 August 2026.\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### Expo Push Notifications\n\n1. Send an array of up to 100 messages per request, all for one project, and stay under 600 notifications a second\n2. Keep each ticket `id` and POST them to `/--/api/v2/push/getReceipts` about 15 minutes later. Receipts are cleared after 24 hours\n3. Stop sending to a token when a ticket or receipt returns `DeviceNotRegistered`\n4. If the project has enhanced push security on, send `Authorization: Bearer \u003caccess token\u003e` or the call fails with `UNAUTHORIZED`\n5. Retry 429 and 5xx with exponential backoff, and expect an occasional duplicate because there is no idempotency key\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, Expo Push Notifications or Pingram?\n\nExpo Push Notifications scores 58.8 (C) on agent readiness against Pingram's 57.4 (C), and leads in 2 of 7 scored categories. Pingram leads on schema \u0026 documentation and maintenance \u0026 community.\n\n### Do Expo Push Notifications and Pingram need an API key?\n\nBoth take an API key or an OAuth sign-in.\n\n### Can an agent call Expo Push Notifications and Pingram without installing anything?\n\nYes. Expo Push Notifications has a hosted endpoint at https://exp.host/--/api/v2/push/send and Pingram at https://mcp.pingram.io.\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.json, and with the fewest tokens: https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"expo-push-notifications\", \"b\": \"pingram\"}`. From a terminal: `anchor compare expo-push-notifications pingram`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/expo-push-notifications.json and https://www.anchorterminal.com/api/v1/tools/pingram.json\n\n## Other comparisons with Expo Push Notifications or Pingram\n\n- [Amazon SNS vs Expo Push Notifications](https://www.anchorterminal.com/compare/amazon-sns-vs-expo-push-notifications.md)\n- [Amazon SNS vs Pingram](https://www.anchorterminal.com/compare/amazon-sns-vs-pingram.md)\n- [Courier vs Expo Push Notifications](https://www.anchorterminal.com/compare/courier-vs-expo-push-notifications.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 Knock](https://www.anchorterminal.com/compare/expo-push-notifications-vs-knock.md)\n- [Expo Push Notifications vs MagicBell](https://www.anchorterminal.com/compare/expo-push-notifications-vs-magicbell.md)\n- [Expo Push Notifications vs Novu](https://www.anchorterminal.com/compare/expo-push-notifications-vs-novu.md)\n- [Expo Push Notifications vs ntfy](https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.md)\n- [Expo Push Notifications vs OneSignal](https://www.anchorterminal.com/compare/expo-push-notifications-vs-onesignal.md)\n- [Expo Push Notifications vs Pushover](https://www.anchorterminal.com/compare/expo-push-notifications-vs-pushover.md)\n- [Expo Push Notifications vs SuprSend](https://www.anchorterminal.com/compare/expo-push-notifications-vs-suprsend.md)\n- [Firebase Cloud Messaging vs Pingram](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-pingram.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": "Expo Push Notifications vs Pingram",
        "url": ""
      }
    ],
    "description": "Expo Push Notifications scores 58.8 (C) to Pingram's 57.4 (C) for push notifications. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Expo Push Notifications C 58.8",
      "Pingram C 57.4",
      "scores"
    ],
    "h1": "Expo Push Notifications vs Pingram",
    "image": "https://www.anchorterminal.com/assets/og/compare-expo-push-notifications-vs-pingram.png",
    "path": "/compare/expo-push-notifications-vs-pingram",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Expo Push Notifications vs Pingram for AI agents (2026)",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram"
  },
  "tokens": {
    "markdown": 2400,
    "slim": 680
  },
  "version": 1
}
