{
  "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:15:25.304617296Z",
          "lastOk": true,
          "lastStatus": 404,
          "lastMs": 291,
          "authRequired": false,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 293,
          "p95ms24h": 344,
          "samples24h": 272,
          "samples30d": 903,
          "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": 3,
              "ok": 3
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.knock.app",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-05T00:11:24.299356064Z"
        },
        "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:15:25.304617296Z"
      }
    },
    "b": {
      "slug": "onesignal",
      "name": "OneSignal",
      "vendor": "OneSignal",
      "vendorUrl": "https://onesignal.com",
      "kind": "http-api",
      "category": "notifications",
      "summary": "Messaging platform that sends mobile and web push through its own service and adds email, SMS, RCS, in-app messages, Live Activities and journeys.",
      "url": "https://www.anchorterminal.com/tools/onesignal",
      "markdownUrl": "https://www.anchorterminal.com/tools/onesignal.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/onesignal.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/onesignal.json",
      "repo": "https://github.com/OneSignal/onesignal-node-api",
      "license": "Modified MIT (Node SDK, use limited to OneSignal's services)",
      "transports": [
        "http",
        "streamable-http"
      ],
      "remoteUrl": "https://api.onesignal.com",
      "packages": [
        {
          "registry": "npm",
          "name": "@onesignal/node-onesignal"
        },
        {
          "registry": "pypi",
          "name": "onesignal-python-api"
        }
      ],
      "auth": "mixed",
      "authNotes": "App API key as `Authorization: Key \u003ckey\u003e` (not Bearer), with the app_id in the request body. The hosted MCP at api.onesignal.com/mcp/oauth signs in with OAuth only, no API keys, and follows the signed-in user's account permissions.",
      "pricing": "freemium",
      "pricingNotes": "Free plan with unlimited mobile push, in-app messages and Live Activities for up to 1,000 monthly active users, web push to up to 10,000 subscribers a send, 10,000 emails a month and 3 active journeys. Growth from $19 a month, then $0.012 per mobile push monthly active user, $0.004 per web push subscriber, and 20,000 emails free then $1.50 per 1,000, with SMS and RCS available. Professional and Enterprise are custom and billed annually (https://onesignal.com/pricing). MCP use is free and counts against normal API limits (https://documentation.onesignal.com/docs/en/model-context-protocol).",
      "priceSummary": "$19 / mo",
      "where": "hosted",
      "x402": {
        "level": "no",
        "endpoints": []
      },
      "toolCount": 43,
      "popularity": {
        "githubStars": 52,
        "npmWeekly": 230563,
        "pypiWeekly": 28196,
        "asOf": "2026-09-30"
      },
      "docsUrl": "https://documentation.onesignal.com",
      "llmsTxt": "https://documentation.onesignal.com/llms.txt",
      "openapi": "https://documentation.onesignal.com/openapi.json",
      "capabilities": [
        "notify.push",
        "notify.in-app",
        "notify.multichannel",
        "email.send",
        "messaging.sms"
      ],
      "tags": [
        "hosted",
        "freemium",
        "mcp",
        "llms-txt",
        "openapi",
        "typescript",
        "python",
        "sms",
        "enterprise"
      ],
      "lastRelease": "2026-09-30",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 69.6,
        "grade": "B",
        "agentReady": false,
        "rank": 110,
        "ranked": true,
        "rankOf": 452,
        "categoryRank": 4,
        "methodology": "0.3",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 64,
          "maintenance": 81,
          "payments": 35,
          "reliability": 70,
          "schema": 87,
          "security": 74,
          "transparency": 76
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "assessment": {
          "confidence": "medium",
          "date": "2026-10-01"
        },
        "negative": 0,
        "verdict": "Runs push delivery itself, so there's no separate push provider to wire up. Three incidents on the API and SDK endpoints in September 2026.",
        "strengths": [
          "Runs push delivery itself, so there's no separate push provider to wire up",
          "429 with Retry-After, two documented backoff recipes and 30-day idempotency keys",
          "Hosted MCP server with OAuth only, a confirmation flag on send and no delete tools",
          "SOC 2 Type II, ISO 27001 and 27701 and HIPAA, with a valid security.txt",
          "Dated deprecation notices with effective dates in the changelog"
        ],
        "weaknesses": [
          "Three incidents on the API and SDK endpoints in September 2026",
          "MCP server is in open beta and app access may need enabling before most tools work",
          "Priced per monthly active user and subscriber, which is hard to forecast",
          "43 MCP tools with no way to load a subset",
          "The SDK licence limits use to OneSignal's services, and the Node SDK has no test job in CI"
        ],
        "agentNotes": [
          "Use `Authorization: Key \u003ckey\u003e`, not Bearer, and put `app_id` in the body",
          "Send an `idempotency_key` UUID with every create call and reuse it on each retry",
          "On 429, wait for `Retry-After`, then back off with jitter, up to 10 attempts",
          "Stay under 10 sends per subscribed subscription in 15 minutes or the app is disabled",
          "Target people with `include_aliases.external_id` and set `target_channel`"
        ],
        "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": 69.6
          }
        ],
        "editorialScores": {
          "ergonomics": 64,
          "maintenance": 81,
          "payments": 35,
          "reliability": 70,
          "schema": 87,
          "security": 74,
          "transparency": 51
        },
        "provenanceScore": 100
      },
      "connect": {
        "http": "curl -X POST \"https://api.onesignal.com/notifications?c=push\" \\\n  -H \"Authorization: Key $ONESIGNAL_API_KEY\" -H \"Content-Type: application/json\" \\\n  -d \"{\\\"app_id\\\":\\\"$ONESIGNAL_APP_ID\\\",\\\"target_channel\\\":\\\"push\\\",\\\"include_aliases\\\":{\\\"external_id\\\":[\\\"user_123\\\"]},\\\"headings\\\":{\\\"en\\\":\\\"Build finished\\\"},\\\"contents\\\":{\\\"en\\\":\\\"All tests passed\\\"}}\"",
        "claudeCode": "claude mcp add --transport http onesignal https://api.onesignal.com/mcp/oauth",
        "config": {
          "mcpServers": {
            "onesignal": {
              "type": "http",
              "url": "https://api.onesignal.com/mcp/oauth"
            }
          }
        }
      },
      "letme": {
        "capability": "https://letme.dev/notify.push",
        "tool": "https://letme.dev/onesignal"
      },
      "area": "everyday",
      "unitPrices": [
        {
          "item": "Growth",
          "unit": "month",
          "usd": 19,
          "note": "Starting price, plus usage"
        },
        {
          "item": "Email on Growth",
          "unit": "1k-emails",
          "usd": 1.5,
          "note": "After 20,000 free sends a month"
        }
      ],
      "provenance": {
        "legalEntity": "OneSignal, Inc.",
        "domain": "onesignal.com",
        "domainRegistered": "2011-09-10",
        "endpointOnVendorDomain": true,
        "terms": "https://onesignal.com/tos",
        "privacy": "https://onesignal.com/privacy",
        "statusPage": "https://status.onesignal.com",
        "changelog": "https://documentation.onesignal.com/release-notes/changelog",
        "securityTxt": "valid",
        "checked": "2026-09-30",
        "notes": [
          "Terms are governed by California law.",
          "security.txt lists security@onesignal.com and expires on 2030-01-01."
        ],
        "score": 100
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/onesignal.json",
      "live": {
        "slug": "onesignal",
        "probe": {
          "target": "https://api.onesignal.com",
          "method": "get",
          "lastAt": "2026-10-05T00:15:27.238594271Z",
          "lastOk": true,
          "lastStatus": 403,
          "lastMs": 26,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 30,
          "p95ms24h": 69,
          "samples24h": 272,
          "samples30d": 903,
          "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": 3,
              "ok": 3
            }
          ]
        },
        "vendorStatus": {
          "page": "https://status.onesignal.com",
          "indicator": "none",
          "summary": "All Systems Operational",
          "checkedAt": "2026-10-05T00:11:25.950120771Z"
        },
        "versions": [
          {
            "registry": "github",
            "name": "OneSignal/onesignal-node-api",
            "version": "v5.19.0",
            "released": "2026-10-02",
            "seenAt": "2026-10-04T16:35:04.182170309Z"
          },
          {
            "registry": "npm",
            "name": "@onesignal/node-onesignal",
            "version": "5.19.0",
            "seenAt": "2026-10-04T16:35:03.157307024Z"
          },
          {
            "registry": "pypi",
            "name": "onesignal-python-api",
            "version": "5.17.0",
            "released": "2026-10-02",
            "seenAt": "2026-10-04T16:35:03.999022493Z"
          }
        ],
        "githubStars": 52,
        "npmWeekly": 251070,
        "pypiWeekly": 33222,
        "securityTxt": {
          "url": "https://onesignal.com/.well-known/security.txt",
          "state": "valid",
          "expires": "2030-01-01T00:00:00Z",
          "checkedAt": "2026-10-04T15:15:47.574936204Z"
        },
        "llmsTxt": {
          "url": "https://documentation.onesignal.com/llms.txt",
          "ok": true,
          "status": 200,
          "checkedAt": "2026-10-04T15:18:04.001188276Z"
        },
        "domain": {
          "domain": "onesignal.com",
          "registered": "2011-09-10",
          "source": "https://rdap.verisign.com/com/v1/domain/onesignal.com",
          "checkedAt": "2026-10-04T13:06:02.742372392Z"
        },
        "pages": [
          {
            "url": "https://documentation.onesignal.com/release-notes/changelog",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-04T15:44:23.610523164Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "72c1fcf22329"
          },
          {
            "url": "https://onesignal.com/pricing",
            "kind": "pricing",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:20.039042117Z",
            "changedAt": "2026-10-03T15:34:21.895419767Z",
            "fingerprint": "8b6afea19691"
          },
          {
            "url": "https://onesignal.com/privacy",
            "kind": "privacy",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:22.108855187Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "3017c3b82574"
          },
          {
            "url": "https://onesignal.com/tos",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-04T15:46:24.091642563Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "126091322fee"
          }
        ],
        "updatedAt": "2026-10-05T00:15:27.238594271Z"
      }
    },
    "summary": "OneSignal has a score of 69.6 (B) against Knock's 66.8 (B). Both do notify push. The largest gap is transparency \u0026 trust, 13 points."
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/compare/knock-vs-onesignal",
    "json": "https://www.anchorterminal.com/compare/knock-vs-onesignal.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/compare/knock-vs-onesignal.md",
    "slim": "https://www.anchorterminal.com/compare/knock-vs-onesignal.min.md"
  },
  "markdown": "OneSignal has a score of 69.6 (B) against Knock's 66.8 (B). Both do notify push. The largest gap is transparency \u0026 trust, 13 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- OneSignal: grade B, 69.6/100, rank #110 of 452. Markdown https://www.anchorterminal.com/tools/onesignal.md · JSON https://www.anchorterminal.com/api/v1/tools/onesignal.json\n\n## Which one, for what\n\nPick Knock for payments \u0026 pricing (+5), maintenance \u0026 community (+5).\n\nPick OneSignal for reliability (+12), transparency \u0026 trust (+13).\n\n## Score by category\n\n| Category | Weight | Knock | OneSignal | Edge |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% (20 this run) | 58 | 70 | OneSignal +12 |\n| Performance | 10%, pending | pending | pending | not scored in this run |\n| Schema \u0026 documentation | 13% (16.2 this run) | 88 | 87 | Knock +1 |\n| Agent ergonomics | 13% (16.2 this run) | 64 | 64 | even |\n| Security \u0026 auth | 14% (17.5 this run) | 71 | 74 | OneSignal +3 |\n| Payments \u0026 pricing | 10% (12.5 this run) | 40 | 35 | Knock +5 |\n| Task success | 10%, pending | pending | pending | not scored in this run |\n| Maintenance \u0026 community | 7% (8.8 this run) | 86 | 81 | Knock +5 |\n| Transparency \u0026 trust | 7% (8.8 this run) | 63 | 76 | OneSignal +13 |\n| Negative events | ≤15 | 0 | 0 | |\n| **Total** | | **66.8 · B** | **69.6 · B** | |\n\n## Facts side by side\n\n| Fact | Knock | OneSignal |\n| --- | --- | --- |\n| Kind | HTTP API | HTTP API |\n| Vendor | Knock | OneSignal |\n| Hosted endpoint | `https://api.knock.app/v1` | `https://api.onesignal.com` |\n| Transports | HTTP, Streamable HTTP | HTTP, Streamable HTTP |\n| Auth | OAuth or key | OAuth or key |\n| Pricing | Freemium | Freemium |\n| x402 | no | no |\n| Licence | Apache-2.0 (Node SDK) | Modified MIT (Node SDK, use limited to OneSignal's services) |\n| Tools exposed | none | 43 |\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 | yes |\n| MCP registry | not listed | not listed |\n| Last release | 2026-09-29 | 2026-09-30 |\n| Popularity | 50 stars, 926k npm/wk, 234k PyPI/wk | 52 stars, 231k npm/wk, 28k PyPI/wk |\n| Agent reviews | 3.5/5 (2) | 3.5/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**OneSignal.** Runs push delivery itself, so there's no separate push provider to wire up. Three incidents on the API and SDK endpoints in September 2026.\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### OneSignal\n\n1. Use `Authorization: Key \u003ckey\u003e`, not Bearer, and put `app_id` in the body\n2. Send an `idempotency_key` UUID with every create call and reuse it on each retry\n3. On 429, wait for `Retry-After`, then back off with jitter, up to 10 attempts\n4. Stay under 10 sends per subscribed subscription in 15 minutes or the app is disabled\n5. Target people with `include_aliases.external_id` and set `target_channel`\n\n## Other comparisons with Knock or OneSignal\n\n- [Courier vs Knock](https://www.anchorterminal.com/compare/courier-vs-knock.md)\n- [Courier vs OneSignal](https://www.anchorterminal.com/compare/courier-vs-onesignal.md)\n- [Knock vs Novu](https://www.anchorterminal.com/compare/knock-vs-novu.md)\n- [Knock vs ntfy](https://www.anchorterminal.com/compare/knock-vs-ntfy.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 OneSignal](https://www.anchorterminal.com/compare/novu-vs-onesignal.md)\n- [ntfy vs OneSignal](https://www.anchorterminal.com/compare/ntfy-vs-onesignal.md)\n- [OneSignal vs Pushover](https://www.anchorterminal.com/compare/onesignal-vs-pushover.md)\n- [OneSignal vs SuprSend](https://www.anchorterminal.com/compare/onesignal-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 OneSignal",
        "url": ""
      }
    ],
    "description": "OneSignal has a score of 69.6 (B) against Knock's 66.8 (B). Both do notify push. The largest gap is transparency \u0026 trust, 13 points. Category scores, facts, verdicts and agent notes side by side.",
    "facts": [
      "Knock B 66.8",
      "OneSignal B 69.6",
      "scores"
    ],
    "h1": "Knock vs OneSignal",
    "image": "https://www.anchorterminal.com/assets/og/compare-knock-vs-onesignal.png",
    "path": "/compare/knock-vs-onesignal",
    "published": "2026-10-01",
    "section": "tools",
    "title": "Knock vs OneSignal for AI agents, B 66.8 vs B 69.6 | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/compare/knock-vs-onesignal"
  },
  "tokens": {
    "markdown": 1300,
    "slim": 330
  },
  "version": 1
}
