Prowl
82/100
prowl
Benchmarked Oct 05, 2026

Ntfy

Send push notifications to your phone or desktop using PUT/POST

developerapi platform_profile
Benchmark Your API

Score Breakdown

Latency10/10
Auth Simplicity9/10
Token Efficiency9/10
Consistency8/10
Documentation8/10
First-Try Success8/10
Parseability8/10
Error Clarity6/10

Benchmark Analysis Log

Full LLM thinking from the 4-phase benchmark pipeline.

Analyze
{
  "service_type": "platform",
  "base_url": "https://ntfy.sh",
  "auth_method": "none",
  "auth_config": {
    "note": "Public server ntfy.sh allows unauthenticated publishing/subscribing to public topics. Self-hosted instances and the paid ntfy Pro tier support access control via username/password (HTTP Basic) and Bearer tokens. Topic-level ACLs can also be configured on self-hosted servers."
  },
  "endpoints": [
    {
      "name": "Publish notification (simple)",
      "method": "POST",
      "path": "/{topic}",
      "description": "Publish a message to a topic. Body is the message content. Response is JSON with notification details.",
      "example": "curl -d 'Backup finished' ntfy.sh/mytopic"
    },
    {
      "name": "Publish notification (with headers)",
      "method": "PUT",
      "path": "/{topic}",
      "description": "Publish a message using HTTP headers for title, priority, tags, click, actions, attachments, etc.",
      "headers": {
        "Title": "Notification title",
        "Priority": "min|low|default|high|max or 1-5",
        "Tags": "Comma-separated emoji shortcodes or tags",
        "Click": "URL to open when notification is tapped",
        "Actions": "Action buttons (view, http, broadcast)",
        "Attach": "Attachment URL",
        "Markdown": "Set to 'yes' to enable Markdown formatting",
        "Filename": "Attachment filename"
      },
      "example": "curl -H 'Title: Backup done' -H 'Priority: high' -H 'Tags: warning,cd' -d 'Backup finished' ntfy.sh/mytopic"
    },
    {
      "name": "Publish as JSON",
      "method": "POST",
      "path": "/",
      "description": "Publish a message using a JSON body with topic and message fields plus optional metadata.",
      "body_schema": {
        "topic": "string (required)",
        "message": "string",
        "title": "string",
        "priority": "int (1-5)",
        "tags": "array of strings",
        "click": "string (URL)",
        "attach": "string (URL)",
        "actions": "array of action objects",
        "markdown": "boolean",
        "delay": "duration string",
        "email": "string"
      },
      "example": "curl -d '{\"topic\":\"mytopic\",\"message\":\"Hello\",\"title\":\"Greeting\"}' ntfy.sh"
    },
    {
      "name": "Subscribe to topic (JSON stream)",
      "method": "GET",
      "path": "/{topic}/json",
      "description": "Stream messages from a topic as newline-delimited JSON. Keeps the connection open.",
      "example": "curl -s ntfy.sh/mytopic/json"
    },
    {
      "name": "Subscribe to topic (SSE)",
      "method": "GET",
      "path": "/{topic}/sse",
      "description": "Server-Sent Events stream of messages for browser clients.",
      "example": "curl -s ntfy.sh/mytopic/sse"
    },
    {
      "name": "Subscribe to topic (raw)",
      "method": "GET",
      "path": "/{topic}/raw",
      "description": "Stream raw message bodies only, one per line.",
      "example": "curl -s ntfy.sh/mytopic/raw"
    },
    {
      "name": "Fetch cached messages",
      "method": "GET",
      "path": "/{topic}/json?poll=1&since=<duration|timestamp>",
      "description": "Poll for messages since a given time (e.g. 10m, 30s, Unix timestamp, or 'all').",
      "example": "curl -s 'ntfy.sh/mytopic/json?poll=1&since=10m'"
    },
    {
      "name": "Server health",
      "method": "GET",
      "path": "/v1/health",
      "description": "Health check endpoint returning {\"healthy\":true}."
    },
    {
      "name": "Server configuration",
      "method": "GET",
      "path": "/v1/config",
      "description": "Returns server configuration and capabilities (e.g. attachment limits, auth status)."
    },
    {
      "name": "Account endpoints (ntfy Pro / self-hosted)",
      "method": "GET/POST/PUT/DELETE",
      "path": "/v1/account",
      "description": "Manage user accounts, tokens, and subscriptions when authentication is enabled."
    },
    {
      "name": "Attachment upload (self-hosted)",
      "method": "PUT",
      "path": "/{topic}",
      "description": "Publish a message with a file attachment by sending the file as the request body and setting filename/attach headers.",
      "example": "curl -T image.jpg -H 'Filename: image.jpg' ntfy.sh/mytopic"
    }
  ],
  "pricing_model": {
    "type": "freemium",
    "details": {
      "free_public_server": "ntfy.sh public server is free to use for public topics. Rate-limited per client IP.",
      "ntfy_pro": "Paid hosted tier (~$6.50/month or yearly) adds account-based access control, private topics, higher limits, and reserved topics.",
      "self_hosted": "Open-source (Apache 2.0 / GPL for Android app) and free to self-host via Docker, binary, apt/rpm packages.",
      "notes": "No vendor lock-in; all functionality available self-hosted."
    }
  },
  "rate_limits": {
    "public_server": "Per-IP rate limiting on the public ntfy.sh instance. Defaults roughly: ~60 requests per visitor per hour for publishing, and limited concurrent subscriptions. Exact val
Execute

1/3 tests passed

TestEndpointStatusLatency
website_uptimeGET /200294ms
robots_txtGET /robots.txt404302ms
llms_txtGET /llms.txt404192ms
Interpret
{
  "overall": 72,
  "dimensions": {
    "token_efficiency": 9.0,
    "first_try_success": 8.5,
    "response_parseability": 8.0,
    "error_clarity": 6.5,
    "doc_quality": 7.5,
    "auth_simplicity": 9.0,
    "latency": 9.5,
    "consistency": 7.5
  },
  "pricing_normalized": {
    "model": "open-source-self-hosted / freemium hosted",
    "free_tier": "generous (self-host unlimited)",
    "paid_tier": "ntfy.sh Pro (per-topic subscriptions)"
  },
  "issues": [
    "Missing robots.txt (404) — search/agent crawlers get no guidance",
    "Missing llms.txt (404) — no structured agent-facing documentation entry point",
    "No security headers detected in uptime response",
    "Auth model not surfaced in provided metadata (API access requires topic naming discipline to stay simple)",
    "No structured API schema/capabilities JSON exposed at root"
  ],
  "recommendations": [
    "Publish llms.txt with concise API summary (PUT/POST to https://ntfy.sh/<topic>) and auth notes",
    "Add robots.txt to allow agent/docs crawling",
    "Add security headers (HSTS, CSP, X-Content-Type-Options) for trust signals",
    "Expose an OpenAPI/JSON schema for the publish endpoint to improve response_parseability",
    "Document rate limits and message-size limits prominently for error_clarity"
  ]
}

Agent Readiness

x402 Payments
Not supported
Streaming
No
Sandbox
None
Agent Auth
Unknown
SDKs
None listed
MCP Support
No

Embed your Prowl badge

Show your live agent-readiness score on your own site. Free, no auth — it updates as your score changes.

Prowl agent-readiness badge
<a href="https://prowl.world/service/ntfy">
  <img src="https://prowl.world/badge/ntfy.svg" height="56" alt="Agent-readiness on Prowl">
</a>

Options: ?style=light|dark · ?size=sm|md · ?variant=certified (claimed + DNS-verified only) · badge generator with preview

Want the full interactive view?

See operational metrics, LLM evaluations, agent readiness, and more.

Open in Dashboard