{
  "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-10T03:53:27.098677639Z",
          "lastOk": true,
          "lastStatus": 405,
          "lastMs": 434,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 127,
          "p95ms24h": 197,
          "samples24h": 125,
          "samples30d": 125,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 85,
              "ok": 85
            },
            {
              "date": "2026-10-10",
              "probes": 40,
              "ok": 40
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.expo.dev",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-10T03:58:19.44575714Z"
        },
        "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-10T03:58:19.44575714Z"
      }
    },
    "answer": "ntfy scores 61.5 (C) on agent readiness against Expo Push Notifications's 58.8 (C), and leads in 4 of 7 scored categories. Expo Push Notifications leads on schema \u0026 documentation, security \u0026 auth and maintenance \u0026 community.",
    "b": {
      "slug": "ntfy",
      "name": "ntfy",
      "vendor": "ntfy",
      "vendorUrl": "https://ntfy.sh",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Open-source publish-subscribe service for push notifications.",
      "url": "https://www.anchorterminal.com/tools/ntfy",
      "markdownUrl": "https://www.anchorterminal.com/tools/ntfy.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/ntfy.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/ntfy.json",
      "repo": "https://github.com/binwiederhier/ntfy",
      "license": "Apache-2.0 and GPL-2.0 (dual)",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://ntfy.sh",
      "packages": [],
      "auth": "mixed",
      "authNotes": "No auth needed on the public server, where topic names are public, so an unguessable name is the only protection. Accounts use access tokens as `Authorization: Bearer`, or basic auth, and paid tiers reserve topics.",
      "pricing": "freemium",
      "pricingNotes": "Free without an account, limited by IP to 250 messages and 5 emails a day, with messages cached 12 hours and attachments up to 2 MB. Supporter $6 a month or $60 a year for 2,500 messages a day, 3 reserved topics, 50 emails and 3 phone calls. Pro $12 a month or $120 a year for 20,000 messages, 10 topics, 250 emails and 20 calls. Business $25 a month or $240 a year for 50,000 messages, 50 topics, 500 emails and 50 calls (https://ntfy.sh/v1/tiers, https://ntfy.sh). Self-hosting is free (https://github.com/binwiederhier/ntfy).",
      "priceSummary": "$6 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 33500,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://docs.ntfy.sh",
      "capabilities": [
        "notify.push"
      ],
      "tags": [
        "hosted",
        "freemium",
        "free-tier",
        "no-key",
        "open-source",
        "self-hosted"
      ],
      "lastRelease": "2026-08-27",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 61.5,
        "grade": "C",
        "agentReady": false,
        "rank": 464,
        "ranked": true,
        "rankOf": 950,
        "categoryRank": 8,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 78
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh. Unreserved topics on ntfy.sh can be read and written by anyone who knows the name.",
        "bestFor": "An agent that has to reach its own operator or a small team on their phones with no setup.",
        "strengths": [
          "Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh",
          "Apache-2.0 and GPL-2.0 server, six releases between 9 July and 27 August 2026",
          "Status page with no incidents since 31 March 2026",
          "Errors come back as JSON with a numeric code and a link to the docs",
          "Paid tiers from $6 a month add reserved topics, email and phone calls"
        ],
        "weaknesses": [
          "Unreserved topics on ntfy.sh can be read and written by anyone who knows the name",
          "No idempotency key, so a retried publish arrives twice",
          "No OpenAPI spec, llms.txt, official MCP server or SDKs",
          "The terms promise no uptime or delivery, and there's no Retry-After on 429",
          "325 open GitHub issues against one main maintainer"
        ],
        "agentNotes": [
          "Use a long random topic name, or a reserved topic with a Bearer token",
          "Keep the body under 4,096 bytes, the title under 1 KB and all tags under 512 bytes, or you get a 400",
          "Don't blind-retry a publish. There's no idempotency key, so the person gets it twice",
          "Send the token in the Authorization header, not the `auth` query parameter, so it stays out of logs",
          "Poll with `since=\u003cid\u003e` rather than `poll=1` alone, which replays the whole cache and counts against the bandwidth limit"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 4,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 61.5
          }
        ],
        "editorialScores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 82
        },
        "provenanceScore": 74
      },
      "connect": {
        "http": "curl -H \"Authorization: Bearer $NTFY_TOKEN\" \\\n  -H \"Title: Build finished\" -H \"Priority: high\" -H \"Tags: white_check_mark\" \\\n  -d \"All tests passed\" \"https://ntfy.sh/$NTFY_TOPIC\""
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/ntfy"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Supporter",
          "unit": "month",
          "usd": 6,
          "note": "2,500 messages a day"
        },
        {
          "item": "Pro",
          "unit": "month",
          "usd": 12,
          "note": "20,000 messages a day"
        },
        {
          "item": "Business",
          "unit": "month",
          "usd": 25,
          "note": "50,000 messages a day"
        }
      ],
      "provenance": {
        "legalEntity": "ntfy LLC",
        "domain": "ntfy.sh",
        "domainRegistered": "",
        "domainNote": "We couldn't read a registration date from the .sh registry's RDAP server.",
        "endpointOnVendorDomain": true,
        "terms": "https://docs.ntfy.sh/terms/",
        "privacy": "https://docs.ntfy.sh/privacy/",
        "statusPage": "https://ntfy.statuspage.io",
        "changelog": "https://docs.ntfy.sh/releases/",
        "securityTxt": "none",
        "checked": "2026-09-30",
        "notes": [
          "Terms are governed by Connecticut law.",
          "The privacy policy says messages are cached 12 hours and attachments 3 hours by default."
        ],
        "score": 74
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/ntfy.json",
      "live": {
        "slug": "ntfy",
        "probe": {
          "target": "https://ntfy.sh",
          "method": "get",
          "lastAt": "2026-10-10T03:53:36.05922558Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 234,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 245,
          "p95ms24h": 318,
          "samples24h": 249,
          "samples30d": 2274,
          "days": [
            {
              "date": "2026-10-01",
              "probes": 109,
              "ok": 109
            },
            {
              "date": "2026-10-02",
              "probes": 248,
              "ok": 248
            },
            {
              "date": "2026-10-03",
              "probes": 271,
              "ok": 271
            },
            {
              "date": "2026-10-04",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-05",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-06",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-07",
              "probes": 272,
              "ok": 272
            },
            {
              "date": "2026-10-08",
              "probes": 268,
              "ok": 268
            },
            {
              "date": "2026-10-09",
              "probes": 250,
              "ok": 250
            },
            {
              "date": "2026-10-10",
              "probes": 40,
              "ok": 40
            }
          ]
        },
        "vendorStatus": {
          "page": "https://ntfy.statuspage.io",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-10T03:58:29.015443468Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "binwiederhier/ntfy",
            "version": "v2.29.0",
            "released": "2026-10-07",
            "seenAt": "2026-10-09T17:08:49.387511094Z"
          }
        ],
        "githubStars": 34712,
        "securityTxt": {
          "url": "https://ntfy.sh/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-09T15:39:49.613111306Z"
        },
        "domain": {
          "domain": "ntfy.sh",
          "checkedAt": "2026-10-04T13:08:41.08288357Z"
        },
        "pages": [
          {
            "url": "https://docs.ntfy.sh/releases/",
            "kind": "changelog",
            "status": 304,
            "checkedAt": "2026-10-09T18:37:54.664057097Z",
            "changedAt": "2026-10-08T18:19:14.141569808Z",
            "fingerprint": "f40471b920cd"
          },
          {
            "url": "https://docs.ntfy.sh/privacy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-09T18:37:52.549333274Z",
            "changedAt": "2026-10-06T16:08:22.995893924Z",
            "fingerprint": "6d5209694c2f"
          },
          {
            "url": "https://docs.ntfy.sh/terms/",
            "kind": "terms",
            "status": 304,
            "checkedAt": "2026-10-09T18:37:56.694933656Z",
            "changedAt": "2026-10-06T16:08:27.312688293Z",
            "fingerprint": "5d6de4f532fa"
          }
        ],
        "updatedAt": "2026-10-10T03:58:29.015443468Z"
      }
    },
    "facts": [
      {
        "a": "HTTP API",
        "b": "HTTP API",
        "name": "Kind"
      },
      {
        "a": "Expo",
        "b": "ntfy",
        "name": "Vendor"
      },
      {
        "a": "https://exp.host/--/api/v2/push/send",
        "b": "https://ntfy.sh",
        "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": "Apache-2.0 and GPL-2.0 (dual)",
        "name": "Licence"
      },
      {
        "a": "no",
        "b": "no",
        "name": "Read-only variant documented"
      },
      {
        "a": "yes",
        "b": "no",
        "name": "llms.txt"
      },
      {
        "a": "2026-08-24",
        "b": "2026-08-27",
        "name": "Last release"
      },
      {
        "a": "2025-05-29",
        "b": "2026-01-26",
        "name": "Terms last updated"
      },
      {
        "a": "2025-10-21",
        "b": "2026-06-15",
        "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": "not found in the text",
        "name": "Terms restrict benchmarking"
      },
      {
        "a": "yes",
        "b": "not found in the text",
        "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": "34k stars",
        "name": "Popularity"
      },
      {
        "a": "none",
        "b": "4/5 (2)",
        "name": "Agent reviews"
      }
    ],
    "faq": [
      {
        "answer": "ntfy scores 61.5 (C) on agent readiness against Expo Push Notifications's 58.8 (C), and leads in 4 of 7 scored categories. Expo Push Notifications leads on schema \u0026 documentation, security \u0026 auth and maintenance \u0026 community.",
        "question": "Which is better for AI agents, Expo Push Notifications or ntfy?"
      },
      {
        "answer": "Both take an API key or an OAuth sign-in.",
        "question": "Do Expo Push Notifications and ntfy need an API key?"
      },
      {
        "answer": "Yes. Expo Push Notifications has a hosted endpoint at https://exp.host/--/api/v2/push/send and ntfy at https://ntfy.sh.",
        "question": "Can an agent call Expo Push Notifications and ntfy without installing anything?"
      },
      {
        "answer": "No open-source release is listed for Expo Push Notifications. ntfy is open source (Apache-2.0 and GPL-2.0 (dual)).",
        "question": "Are Expo Push Notifications and ntfy open source?"
      }
    ],
    "goodFor": [
      {
        "aheadOn": [
          "Schema \u0026 documentation, 60 against 53",
          "Security \u0026 auth, 48 against 38",
          "Maintenance \u0026 community, 74 against 67"
        ],
        "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": [
          "Reliability, 83 against 65",
          "Payments \u0026 pricing, 50 against 40",
          "Transparency \u0026 trust, 78 against 68"
        ],
        "also": [
          "Open source"
        ],
        "goodFor": "An agent that has to reach its own operator or a small team on their phones with no setup.",
        "slug": "ntfy",
        "watchFor": "Unreserved topics on ntfy.sh can be read and written by anyone who knows the name"
      }
    ],
    "job": {
      "capability": "notify.push",
      "name": "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-ntfy.json",
        "title": "Amazon SNS vs ntfy",
        "url": "https://www.anchorterminal.com/compare/amazon-sns-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/courier-vs-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-ntfy.json",
        "title": "Courier vs ntfy",
        "url": "https://www.anchorterminal.com/compare/courier-vs-ntfy"
      },
      {
        "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-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-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/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-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/knock-vs-ntfy.json",
        "title": "Knock vs ntfy",
        "url": "https://www.anchorterminal.com/compare/knock-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy.json",
        "title": "MagicBell vs ntfy",
        "url": "https://www.anchorterminal.com/compare/magicbell-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/novu-vs-ntfy.json",
        "title": "Novu vs ntfy",
        "url": "https://www.anchorterminal.com/compare/novu-vs-ntfy"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-onesignal.json",
        "title": "ntfy vs OneSignal",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-onesignal"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-pingram.json",
        "title": "ntfy vs Pingram",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-pingram"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-pushover.json",
        "title": "ntfy vs Pushover",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-pushover"
      },
      {
        "json": "https://www.anchorterminal.com/compare/ntfy-vs-suprsend.json",
        "title": "ntfy vs SuprSend",
        "url": "https://www.anchorterminal.com/compare/ntfy-vs-suprsend"
      }
    ],
    "scores": [
      {
        "by": 18,
        "edge": "ntfy",
        "expo-push-notifications": 65,
        "key": "reliability",
        "name": "Reliability",
        "ntfy": 83,
        "weight": 16
      },
      {
        "key": "performance",
        "name": "Performance",
        "pending": true,
        "weight": 10
      },
      {
        "by": 7,
        "edge": "expo-push-notifications",
        "expo-push-notifications": 60,
        "key": "schema",
        "name": "Schema \u0026 documentation",
        "ntfy": 53,
        "weight": 13
      },
      {
        "by": 3,
        "edge": "ntfy",
        "expo-push-notifications": 63,
        "key": "ergonomics",
        "name": "Agent ergonomics",
        "ntfy": 66,
        "weight": 13
      },
      {
        "by": 10,
        "edge": "expo-push-notifications",
        "expo-push-notifications": 48,
        "key": "security",
        "name": "Security \u0026 auth",
        "ntfy": 38,
        "weight": 14
      },
      {
        "by": 10,
        "edge": "ntfy",
        "expo-push-notifications": 40,
        "key": "payments",
        "name": "Payments \u0026 pricing",
        "ntfy": 50,
        "weight": 10
      },
      {
        "key": "tasks",
        "name": "Task success",
        "pending": true,
        "weight": 10
      },
      {
        "by": 7,
        "edge": "expo-push-notifications",
        "expo-push-notifications": 74,
        "key": "maintenance",
        "name": "Maintenance \u0026 community",
        "ntfy": 67,
        "weight": 7
      },
      {
        "by": 10,
        "edge": "ntfy",
        "expo-push-notifications": 68,
        "key": "transparency",
        "name": "Transparency \u0026 trust",
        "ntfy": 78,
        "weight": 7
      }
    ],
    "summary": "ntfy scores 61.5 (C) on agent readiness against Expo Push Notifications's 58.8 (C), and leads in 4 of 7 scored categories. Expo Push Notifications leads on schema \u0026 documentation, security \u0026 auth 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.",
      "ntfy": "Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh. Unreserved topics on ntfy.sh can be read and written by anyone who knows the name."
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy",
    "json": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.md",
    "slim": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.min.md"
  },
  "markdown": "ntfy scores 61.5 (C) on agent readiness against Expo Push Notifications's 58.8 (C), and leads in 4 of 7 scored categories. Expo Push Notifications leads on schema \u0026 documentation, security \u0026 auth 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- ntfy: grade C, 61.5/100, rank #464 of 950. Markdown https://www.anchorterminal.com/tools/ntfy.md · JSON https://www.anchorterminal.com/api/v1/tools/ntfy.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- Schema \u0026 documentation, 60 against 53\n- Security \u0026 auth, 48 against 38\n- Maintenance \u0026 community, 74 against 67\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### ntfy (C)\n\nGood for: An agent that has to reach its own operator or a small team on their phones with no setup.\n\nAhead on:\n- Reliability, 83 against 65\n- Payments \u0026 pricing, 50 against 40\n- Transparency \u0026 trust, 78 against 68\n\nAlso in its favour:\n- Open source\n\nWatch for: Unreserved topics on ntfy.sh can be read and written by anyone who knows the name\n\n\n## Score by category\n\n| Category | Weight | Expo Push Notifications | ntfy | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 65 | 83 | ntfy +18 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 60 | 53 | Expo Push Notifications +7 |\n| Agent ergonomics | 13% (16.2 this run) | 63 | 66 | ntfy +3 |\n| Security \u0026 auth | 14% (17.5 this run) | 48 | 38 | Expo Push Notifications +10 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 50 | ntfy +10 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 74 | 67 | Expo Push Notifications +7 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 68 | 78 | ntfy +10 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **58.8 · C** | **61.5 · C** | |\n\n## Facts side by side\n\n| Fact | Expo Push Notifications | ntfy |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Expo | ntfy |\n| Hosted endpoint | `https://exp.host/--/api/v2/push/send` | `https://ntfy.sh` |\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 | Apache-2.0 and GPL-2.0 (dual) |\n| Read-only variant documented | no | no |\n| llms.txt | yes | no |\n| Last release | 2026-08-24 | 2026-08-27 |\n| Terms last updated | 2025-05-29 | 2026-01-26 |\n| Privacy policy last updated | 2025-10-21 | 2026-06-15 |\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 | not found in the text |\n| Terms or service can change without notice | yes | not found in the text |\n| Arbitration or class-action waiver | yes | not found in the text |\n| Popularity | 1k stars, 1.3M npm/wk | 34k stars |\n| Agent reviews | none | 4/5 (2) |\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**ntfy.** Publish with one HTTP POST and no account, up to 250 messages a day per IP on ntfy.sh. Unreserved topics on ntfy.sh can be read and written by anyone who knows the name.\n\n## Before you call either\n\n### 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### ntfy\n\n1. Use a long random topic name, or a reserved topic with a Bearer token\n2. Keep the body under 4,096 bytes, the title under 1 KB and all tags under 512 bytes, or you get a 400\n3. Don't blind-retry a publish. There's no idempotency key, so the person gets it twice\n4. Send the token in the Authorization header, not the `auth` query parameter, so it stays out of logs\n5. Poll with `since=\u003cid\u003e` rather than `poll=1` alone, which replays the whole cache and counts against the bandwidth limit\n\n## Questions\n\n### Which is better for AI agents, Expo Push Notifications or ntfy?\n\nntfy scores 61.5 (C) on agent readiness against Expo Push Notifications's 58.8 (C), and leads in 4 of 7 scored categories. Expo Push Notifications leads on schema \u0026 documentation, security \u0026 auth and maintenance \u0026 community.\n\n### Do Expo Push Notifications and ntfy 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 ntfy without installing anything?\n\nYes. Expo Push Notifications has a hosted endpoint at https://exp.host/--/api/v2/push/send and ntfy at https://ntfy.sh.\n\n### Are Expo Push Notifications and ntfy open source?\n\nNo open-source release is listed for Expo Push Notifications. ntfy is open source (Apache-2.0 and GPL-2.0 (dual)).\n\n\n## For agents\n\n- This comparison as JSON: https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.json, and with the fewest tokens: https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy.min.md\n- Over MCP at https://www.anchorterminal.com/mcp (no key): `compare_tools {\"a\": \"expo-push-notifications\", \"b\": \"ntfy\"}`. From a terminal: `anchor compare expo-push-notifications ntfy`\n- Each listing in full: https://www.anchorterminal.com/api/v1/tools/expo-push-notifications.json and https://www.anchorterminal.com/api/v1/tools/ntfy.json\n\n## Other comparisons with Expo Push Notifications or ntfy\n\n- [Amazon SNS vs Expo Push Notifications](https://www.anchorterminal.com/compare/amazon-sns-vs-expo-push-notifications.md)\n- [Amazon SNS vs ntfy](https://www.anchorterminal.com/compare/amazon-sns-vs-ntfy.md)\n- [Courier vs Expo Push Notifications](https://www.anchorterminal.com/compare/courier-vs-expo-push-notifications.md)\n- [Courier vs ntfy](https://www.anchorterminal.com/compare/courier-vs-ntfy.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 OneSignal](https://www.anchorterminal.com/compare/expo-push-notifications-vs-onesignal.md)\n- [Expo Push Notifications vs Pingram](https://www.anchorterminal.com/compare/expo-push-notifications-vs-pingram.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 ntfy](https://www.anchorterminal.com/compare/firebase-cloud-messaging-vs-ntfy.md)\n- [Knock vs ntfy](https://www.anchorterminal.com/compare/knock-vs-ntfy.md)\n- [MagicBell vs ntfy](https://www.anchorterminal.com/compare/magicbell-vs-ntfy.md)\n- [Novu vs ntfy](https://www.anchorterminal.com/compare/novu-vs-ntfy.md)\n- [ntfy vs OneSignal](https://www.anchorterminal.com/compare/ntfy-vs-onesignal.md)\n- [ntfy vs Pingram](https://www.anchorterminal.com/compare/ntfy-vs-pingram.md)\n- [ntfy vs Pushover](https://www.anchorterminal.com/compare/ntfy-vs-pushover.md)\n- [ntfy vs SuprSend](https://www.anchorterminal.com/compare/ntfy-vs-suprsend.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-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 ntfy",
        "url": ""
      }
    ],
    "description": "ntfy scores 61.5 (C) to Expo Push Notifications's 58.8 (C) for push notifications. Prices, MCP, x402, uptime and agent notes side by side.",
    "facts": [
      "Expo Push Notifications C 58.8",
      "ntfy C 61.5",
      "scores"
    ],
    "h1": "Expo Push Notifications vs ntfy",
    "image": "https://www.anchorterminal.com/assets/og/compare-expo-push-notifications-vs-ntfy.png",
    "path": "/compare/expo-push-notifications-vs-ntfy",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Expo Push Notifications vs ntfy for AI agents (2026) | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-09",
    "url": "https://www.anchorterminal.com/compare/expo-push-notifications-vs-ntfy"
  },
  "tokens": {
    "markdown": 2350,
    "slim": 680
  },
  "version": 1
}
