{
  "data": {
    "a": {
      "slug": "knock",
      "name": "Knock",
      "vendor": "Knock",
      "vendorUrl": "https://knock.app",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Notification workflow API.",
      "url": "https://www.anchorterminal.com/tools/knock",
      "markdownUrl": "https://www.anchorterminal.com/tools/knock.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/knock.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/knock.json",
      "repo": "https://github.com/knocklabs/knock-node",
      "license": "Apache-2.0 (Node SDK)",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://api.knock.app/v1",
      "packages": [
        {
          "registry": "npm",
          "name": "@knocklabs/node"
        },
        {
          "registry": "pypi",
          "name": "knockapi"
        }
      ],
      "auth": "mixed",
      "authNotes": "Secret API key per environment as a Bearer token for server calls, and a public key plus signed user tokens for client feeds. The hosted MCP signs in with OAuth or takes a service token (`knock_st_...`) as a Bearer credential for headless use.",
      "pricing": "freemium",
      "pricingNotes": "Developer plan free with 10,000 messages a month, 500 guide active users and 500 AI agent credits. Starter $250 a month with 50,000 messages prepaid, then $0.005 a message, 2,500 guide active users ($0.05 each after) and 2,000 agent credits ($0.01 each after). Enterprise is priced by volume or by notified users. A message is one delivery to one user on one channel, and bounced or failed messages aren't billed. No setup fee, billed monthly in arrears (https://knock.app/pricing).",
      "priceSummary": "$250 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": 50,
        "npmWeekly": 926382,
        "pypiWeekly": 233669,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://docs.knock.app",
      "llmsTxt": "https://docs.knock.app/llms.txt",
      "openapi": "https://docs.knock.app/openapi.json",
      "capabilities": [
        "notify.push",
        "notify.in-app",
        "notify.multichannel",
        "notify.preferences",
        "notify.digest"
      ],
      "tags": [
        "hosted",
        "freemium",
        "mcp",
        "llms-txt",
        "openapi",
        "typescript",
        "python",
        "webhooks",
        "enterprise"
      ],
      "lastRelease": "2026-09-29",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 66.8,
        "grade": "B",
        "agentReady": false,
        "rank": 155,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 5,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 64,
          "maintenance": 86,
          "payments": 40,
          "reliability": 58,
          "schema": 88,
          "security": 71,
          "transparency": 63
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Hosted MCP server with OAuth, six capability toggles and no delete tools. Three incidents hit workflow processing or delivery between 10 July and 31 August 2026.",
        "strengths": [
          "Hosted MCP server with OAuth, six capability toggles and no delete tools",
          "Idempotency keys on trigger for 24 hours, plus cancellation keys for delayed runs",
          "Rate limits published in five tiers from 1 to 1,000 requests a second",
          "Audit logs attribute management API changes to the service token that made them",
          "Free plan with 10,000 messages a month and no card"
        ],
        "weaknesses": [
          "Three incidents hit workflow processing or delivery between 10 July and 31 August 2026",
          "No SLA, Retry-After header or backoff guidance found",
          "Service tokens carry the creator's full privileges with no expiry, and skip MCP consent",
          "Starter jumps from free to $250 a month",
          "Email, SMS and push go through providers you configure and pay for separately"
        ],
        "agentNotes": [
          "Create the workflow in the dashboard or through the MCP server before you trigger it. Triggers reference it by key",
          "Send an `Idempotency-Key` on every trigger. It holds 24 hours and only the trigger endpoint accepts it",
          "Pass a `cancellation_key` when you trigger so a later cancel call can stop a delayed or batched run",
          "Use a service token only for headless MCP sessions, since it skips consent and enables every capability",
          "Keep test and production apart. Rate limits and keys are scoped to an environment"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 2,
        "avgRating": 3.5,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "B",
            "methodology": "0.3",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 66.8
          }
        ],
        "editorialScores": {
          "ergonomics": 64,
          "maintenance": 86,
          "payments": 40,
          "reliability": 58,
          "schema": 88,
          "security": 71,
          "transparency": 39
        },
        "provenanceScore": 86
      },
      "connect": {
        "http": "curl -X POST https://api.knock.app/v1/workflows/new-comment/trigger \\\n  -H \"Authorization: Bearer $KNOCK_SECRET_API_KEY\" -H \"Content-Type: application/json\" \\\n  -d '{\"recipients\":[\"user_123\"],\"data\":{\"message\":\"Build finished\"}}'",
        "claudeCode": "claude mcp add --transport http knock https://mcp.knock.app/mcp",
        "config": {
          "mcpServers": {
            "knock": {
              "headers": {
                "Authorization": "Bearer ${KNOCK_SERVICE_TOKEN}"
              },
              "type": "http",
              "url": "https://mcp.knock.app/mcp"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/knock"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Starter",
          "unit": "month",
          "usd": 250,
          "note": "50,000 messages included"
        },
        {
          "item": "Starter overage",
          "unit": "message",
          "usd": 0.005
        },
        {
          "item": "AI agent credit overage",
          "unit": "credit",
          "usd": 0.01
        }
      ],
      "provenance": {
        "legalEntity": "Knock Labs, Inc.",
        "domain": "knock.app",
        "domainRegistered": "2020-08-28",
        "endpointOnVendorDomain": true,
        "terms": "https://knock.app/terms",
        "privacy": "https://knock.app/legal/privacy-policy",
        "statusPage": "https://status.knock.app",
        "changelog": "https://knock.app/changelog",
        "securityTxt": "none",
        "checked": "2026-09-30",
        "notes": [
          "Terms are governed by New York law. A separate data processing addendum is published at knock.app/legal/data-processing-addendum.",
          "The status page tracks the in-dashboard agent as its own component."
        ],
        "score": 86
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/knock.json",
      "live": {
        "slug": "knock",
        "probe": {
          "target": "https://api.knock.app/v1",
          "method": "get",
          "lastAt": "2026-10-05T00:57:22.245336367Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 295,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 293,
          "p95ms24h": 344,
          "samples24h": 272,
          "samples30d": 911,
          "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": 11,
              "ok": 11
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.knock.app",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-05T00:53:54.971655002Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "knocklabs/knock-node",
            "version": "v1.36.0",
            "released": "2026-09-30",
            "seenAt": "2026-10-04T16:30:56.82123424Z"
          },
          {
            "registry": "npm",
            "name": "@knocklabs/node",
            "version": "1.36.0",
            "seenAt": "2026-10-04T16:30:55.666092589Z"
          },
          {
            "registry": "pypi",
            "name": "knockapi",
            "version": "1.31.0",
            "released": "2026-09-30",
            "seenAt": "2026-10-04T16:30:56.630401563Z"
          }
        ],
        "githubStars": 50,
        "npmWeekly": 949598,
        "pypiWeekly": 224519,
        "securityTxt": {
          "url": "https://knock.app/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-04T15:15:50.36077856Z"
        },
        "llmsTxt": {
          "url": "https://docs.knock.app/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-04T15:17:55.693090609Z"
        },
        "domain": {
          "domain": "knock.app",
          "registered": "2020-08-28",
          "source": "https://pubapi.registry.google/rdap/domain/knock.app",
          "checkedAt": "2026-10-04T13:04:01.050922733Z"
        },
        "pages": [
          {
            "url": "https://knock.app/changelog",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-04T15:45:14.239300597Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "5fea3b2edd33"
          },
          {
            "url": "https://knock.app/pricing",
            "kind": "pricing",
            "status": 304,
            "checkedAt": "2026-10-04T15:45:18.436788381Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "fd0ac3be243e"
          },
          {
            "url": "https://knock.app/legal/privacy-policy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:45:16.503972023Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "b126a2e6a38d"
          },
          {
            "url": "https://knock.app/terms",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:45:20.266105197Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "6e48468a84af"
          }
        ],
        "updatedAt": "2026-10-05T00:57:22.245336367Z"
      }
    },
    "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.6,
        "grade": "C",
        "agentReady": false,
        "rank": 226,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 6,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 79
        },
        "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.",
        "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.3",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 61.6
          }
        ],
        "editorialScores": {
          "ergonomics": 66,
          "maintenance": 67,
          "payments": 50,
          "reliability": 83,
          "schema": 53,
          "security": 38,
          "transparency": 82
        },
        "provenanceScore": 75
      },
      "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": 75
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/ntfy.json",
      "live": {
        "slug": "ntfy",
        "probe": {
          "target": "https://ntfy.sh",
          "method": "get",
          "lastAt": "2026-10-05T00:57:24.517171692Z",
          "lastOk": true,
          "lastStatus": 200,
          "lastMs": 231,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 245,
          "p95ms24h": 308,
          "samples24h": 272,
          "samples30d": 911,
          "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": 11,
              "ok": 11
            }
          ]
        },
        "vendorStatus": {
          "page": "https://ntfy.statuspage.io",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-05T00:53:56.963033964Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "binwiederhier/ntfy",
            "version": "v2.28.0",
            "released": "2026-08-27",
            "seenAt": "2026-10-04T16:34:42.599762308Z"
          }
        ],
        "githubStars": 34620,
        "securityTxt": {
          "url": "https://ntfy.sh/.well-known/security.txt",
          "state": "none",
          "checkedAt": "2026-10-04T15:15:56.181795167Z"
        },
        "domain": {
          "domain": "ntfy.sh",
          "checkedAt": "2026-10-04T13:08:41.08288357Z"
        },
        "pages": [
          {
            "url": "https://docs.ntfy.sh/releases/",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-04T15:43:52.329185938Z",
            "changedAt": "2026-10-04T15:43:52.329185938Z",
            "fingerprint": "68ece810e5e5"
          },
          {
            "url": "https://docs.ntfy.sh/privacy/",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:43:50.195547148Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "c956c27ca8f1"
          },
          {
            "url": "https://docs.ntfy.sh/terms/",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:43:54.348128214Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "c6bc41ff43a5"
          }
        ],
        "updatedAt": "2026-10-05T00:57:24.517171692Z"
      }
    },
    "summary": "Knock has a score of 66.8 (B) against ntfy's 61.6 (C). Both do notify push. The largest gap is schema \u0026 documentation, 35 points."
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/knock-vs-ntfy",
    "json": "https://www.anchorterminal.com/compare/knock-vs-ntfy.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/knock-vs-ntfy.md",
    "slim": "https://www.anchorterminal.com/compare/knock-vs-ntfy.min.md"
  },
  "markdown": "Knock has a score of 66.8 (B) against ntfy's 61.6 (C). Both do notify push. The largest gap is schema \u0026 documentation, 35 points.\n\n- Knock: grade B, 66.8/100, rank #155 of 452. Markdown https://www.anchorterminal.com/tools/knock.md · JSON https://www.anchorterminal.com/api/v1/tools/knock.json\n- ntfy: grade C, 61.6/100, rank #226 of 452. Markdown https://www.anchorterminal.com/tools/ntfy.md · JSON https://www.anchorterminal.com/api/v1/tools/ntfy.json\n\n## Which one, for what\n\nPick Knock for schema \u0026 documentation (+35), security \u0026 auth (+33), maintenance \u0026 community (+19).\n\nPick ntfy for reliability (+25), payments \u0026 pricing (+10), transparency \u0026 trust (+16).\n\n## Score by category\n\n| Category | Weight | Knock | ntfy | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 58 | 83 | ntfy +25 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 88 | 53 | Knock +35 |\n| Agent ergonomics | 13% (16.2 this run) | 64 | 66 | ntfy +2 |\n| Security \u0026 auth | 14% (17.5 this run) | 71 | 38 | Knock +33 |\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) | 86 | 67 | Knock +19 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 63 | 79 | ntfy +16 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **66.8 · B** | **61.6 · C** | |\n\n## Facts side by side\n\n| Fact | Knock | ntfy |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Knock | ntfy |\n| Hosted endpoint | `https://api.knock.app/v1` | `https://ntfy.sh` |\n| Transports | HTTP, Streamable HTTP | HTTP |\n| Auth | OAuth or key | OAuth or key |\n| Pricing | Freemium | Freemium |\n| x402 | no | no |\n| Licence | Apache-2.0 (Node SDK) | Apache-2.0 and GPL-2.0 (dual) |\n| Tools exposed | none | none |\n| Context cost (tools/list) | n/a | n/a |\n| p95 latency | not measured yet | not measured yet |\n| Availability (30d) | not measured yet | not measured yet |\n| Read-only variant documented | no | no |\n| llms.txt | yes | no |\n| MCP registry | not listed | not listed |\n| Last release | 2026-09-29 | 2026-08-27 |\n| Popularity | 50 stars, 926k npm/wk, 234k PyPI/wk | 34k stars |\n| Agent reviews | 3.5/5 (2) | 4/5 (2) |\n\n## Verdicts\n\n**Knock.** Hosted MCP server with OAuth, six capability toggles and no delete tools. Three incidents hit workflow processing or delivery between 10 July and 31 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### Knock\n\n1. Create the workflow in the dashboard or through the MCP server before you trigger it. Triggers reference it by key\n2. Send an `Idempotency-Key` on every trigger. It holds 24 hours and only the trigger endpoint accepts it\n3. Pass a `cancellation_key` when you trigger so a later cancel call can stop a delayed or batched run\n4. Use a service token only for headless MCP sessions, since it skips consent and enables every capability\n5. Keep test and production apart. Rate limits and keys are scoped to an environment\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## Other comparisons with Knock or ntfy\n\n- [Courier vs Knock](https://www.anchorterminal.com/compare/courier-vs-knock.md)\n- [Courier vs ntfy](https://www.anchorterminal.com/compare/courier-vs-ntfy.md)\n- [Knock vs Novu](https://www.anchorterminal.com/compare/knock-vs-novu.md)\n- [Knock vs OneSignal](https://www.anchorterminal.com/compare/knock-vs-onesignal.md)\n- [Knock vs Pushover](https://www.anchorterminal.com/compare/knock-vs-pushover.md)\n- [Knock vs SuprSend](https://www.anchorterminal.com/compare/knock-vs-suprsend.md)\n- [Novu vs ntfy](https://www.anchorterminal.com/compare/novu-vs-ntfy.md)\n- [ntfy vs OneSignal](https://www.anchorterminal.com/compare/ntfy-vs-onesignal.md)\n- [ntfy vs Pushover](https://www.anchorterminal.com/compare/ntfy-vs-pushover.md)\n- [ntfy vs SuprSend](https://www.anchorterminal.com/compare/ntfy-vs-suprsend.md)\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "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": "Knock vs ntfy",
        "url": ""
      }
    ],
    "description": "Knock has a score of 66.8 (B) against ntfy's 61.6 (C). Both do notify push. The largest gap is schema \u0026 documentation, 35 points. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Knock B 66.8",
      "ntfy C 61.6",
      "scores"
    ],
    "h1": "Knock vs ntfy",
    "image": "https://www.anchorterminal.com/assets/og/compare-knock-vs-ntfy.png",
    "path": "/compare/knock-vs-ntfy",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Knock vs ntfy for AI agents, B 66.8 vs C 61.6 | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/compare/knock-vs-ntfy"
  },
  "tokens": {
    "markdown": 1300,
    "slim": 330
  },
  "version": 1
}
