{
 "slug": "postmarkapp",
 "name": "Postmark",
 "url": "https://postmarkapp.com",
 "domain": "postmarkapp.com",
 "category": "email-infrastructure",
 "category_name": "Email infrastructure",
 "tested_at": "2026-10-06",
 "run": "20261006T090157Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261001T231417Z",
   "date": "2026-10-01",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": null,
    "driver": null,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  },
  {
   "run": "20261006T090157Z",
   "date": "2026-10-06",
   "level": 1,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "start"
   }
  }
 ],
 "level": 1,
 "level_name": "Needs a person",
 "level_selfhost": null,
 "entry": "closed",
 "door": {
  "passed": 0,
  "tries": 2,
  "self_start": false
 },
 "badges": [],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "yes",
   "text": "Docs agents can read: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "no",
   "text": "Can't get in on its own",
   "at": "signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "unreached",
   "text": "Work not measured",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "unreached",
   "text": "Payment not reached",
   "value": "unreached",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "unreached",
   "text": "Leaving not reached",
   "how": "no-account",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "person",
   "label": "A person sets it up",
   "routes": [],
   "minutes": null,
   "core": null
  }
 ],
 "minutes": null,
 "next": {
  "to": 2,
  "text": "Next: let an agent sign up on its own"
 },
 "stop": "signup",
 "core": "0/10",
 "scores": {
  "coverage": null,
  "reliability": null,
  "resilience": null,
  "setup": 100,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 100,
  "security": null,
  "standards": [
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 3,
    "value": "2.0"
   }
  ]
 },
 "reliability_method": null,
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": null,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "start"
 },
 "same_level_drives": 2,
 "drives": 2,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": {
  "rung": "signup",
  "vendor": "Google reCAPTCHA v2 (invisible, escalated to image challenge); eHawk Talon fingerprint field also on the form",
  "visible": true,
  "type": "network",
  "human": null,
  "how": "Check the Web Bot Auth signature on the sign-up request and skip reCAPTCHA (or lower the score threshold) for signed agents; or offer a documented sign-up API with email verification.",
  "signed": true
 },
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "form"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-12"
  },
  "browser": {
   "state": "through",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt, AI catalog, RFC 9727 api-catalog, Swagger 2.0 specs for Server and Account API, auth.md, agent-skills index and markdown docs via Accept: text/markdown, all fetched headless."
  },
  "signup": {
   "status": "human",
   "note": "Web form only (no sign-up API). Headless POST returns 400 with an empty body; in the browser the invisible reCAPTCHA escalated to a visible picture challenge (crosswalks)."
  },
  "verify": {
   "status": "",
   "note": "Not reached: sign-up never completed.",
   "reached": false
  },
  "credentials": {
   "status": "",
   "note": "Tokens are issued only by a human in the web UI (auth.md); no OAuth, device flow or agent registration. Not reached because sign-up was blocked.",
   "via": "",
   "reached": false
  },
  "first_call": {
   "status": "headless",
   "note": "POST /email with the documented test token POSTMARK_API_TEST, no account needed: 200 'Test job accepted'. The test token works only on /email and /email/batch."
  },
  "first_action": {
   "status": "",
   "note": "Nothing can be created without a real Server token; test-token sends are accepted but not stored or delivered.",
   "reached": false
  },
  "pay": {
   "status": "",
   "grade": "P1",
   "rails": [],
   "rail_ids": [],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "Free Developer plan (100 emails/month, never expires). Paid plans: 'Buy Now' goes to the same reCAPTCHA-gated sign-up form; no 402, x402, MPP, UCP or billing API found, and not listed in the x402 Bazaar or mpp.dev. The checkout itself was not seen; the human gate is the reCAPTCHA in front of it.",
   "reached": false
  },
  "cancel": {
   "status": "",
   "grade": "n/a",
   "note": "No plan was started (no account). Account API has no billing endpoints.",
   "reached": false
  },
  "delete": {
   "status": "",
   "note": "No account was created. The Account API has no account-delete endpoint; deletion route not tested.",
   "account": false,
   "reached": false
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": false,
  "sdk": true,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": true
 },
 "surface_notes": {
  "api": "REST, Server API 38 paths + Account API 14 paths, header tokens",
  "openapi": "Swagger 2.0 (server.yml 1.0.0, account.yml 0.9.0), linked from an RFC 9727 api-catalog",
  "mcp": "official stdio server, 24 tools per CHANGELOG; needs a real Server token to start",
  "llms_txt": "/llms.txt 28.8 KB; also AI catalog, auth.md and Agent Skills index"
 },
 "can_do": [
  "Read the full docs, OpenAPI, auth.md and Agent Skills without an account",
  "Validate /email and /email/batch request shapes with the test token POSTMARK_API_TEST, without delivering mail"
 ],
 "cannot_do": [
  {
   "what": "Create an account",
   "why": "reCAPTCHA picture challenge on the web-only sign-up form"
  },
  {
   "what": "Get a Server or Account API token",
   "why": "tokens are issued only in the web UI by a human"
  },
  {
   "what": "Send real mail, manage templates, domains, senders, bounces",
   "why": "all need a real token"
  },
  {
   "what": "Run the official MCP server",
   "why": "it exits on startup unless given a real Server token"
  }
 ],
 "blockers": [
  "reCAPTCHA v2 picture challenge on account.postmarkapp.com/sign_up",
  "No API, OAuth or agent registration route to a token"
 ],
 "tips_for_owner": [
  "Let verified agents sign up without CAPTCHA",
  "Offer a headless path to a Server token",
  "Let the MCP server start with the test token",
  "Publish OpenAPI 3.x specs",
  "Add a billing and account-delete API"
 ],
 "tips_for_agents": [
  "Start with POSTMARK_API_TEST: it validates /email and /email/batch shapes without sending; every other endpoint answers 403 ErrorCode 10.",
  "Auth is X-Postmark-Server-Token / X-Postmark-Account-Token headers, never Bearer; 401 ErrorCode 10 is terminal.",
  "Read /auth.md and /.well-known/ai-catalog.json first; the api-catalog links both Swagger specs.",
  "Ask your human for a dedicated server's Server token: sign-up has a reCAPTCHA picture challenge and tokens come only from the UI.",
  "The MCP server needs a real Server token at startup; it will not start with the test token."
 ],
 "selfhost": null,
 "summary": "Postmark's agent-facing docs are unusually complete (llms.txt, AI catalog, auth.md, api-catalog, Agent Skills, MCP server card) and the test token lets an agent dry-run sends with no account. But sign-up is a web form whose reCAPTCHA escalated to a picture challenge for our agent's browser, and tokens can only be issued by a human in the UI, so no real send, template or domain work was possible.",
 "wall": "reCAPTCHA picture challenge on sign-up form",
 "plan_scope": "",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "Postmark is an email-sending service for developers. An AI agent could read all the documentation and even test-run a 'send email' request without creating an account, but it could not actually sign up: the sign-up form showed a picture puzzle (pick the crosswalks) that only a human can solve.",
  "can_do": [
   "Read the full documentation, including guides written specifically for AI agents",
   "Try out the 'send a test email' request without creating an account, though nothing is actually delivered"
  ],
  "cannot_do": [
   {
    "what": "Create an account",
    "why": "the sign-up form showed a picture puzzle only a human can solve"
   },
   {
    "what": "Get a real API key",
    "why": "Postmark only hands out API keys through a person using the website"
   },
   {
    "what": "Send a real email, build a template, or check domains/bounces",
    "why": "all of these need a real account, which could not be created"
   },
   {
    "what": "Use Postmark's official AI-agent plugin (MCP server)",
    "why": "it refuses to start without a real API key"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Receive and parse inbound email",
   "plan": "Pro or Platform",
   "evidence": "pricing page lists 'Inbound email processing' under Pro and Platform; not under Basic or Free"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Sending",
   "capability": "Send a single transactional email",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /email",
    "mcp": "send-email (postmark-mcp)",
    "cli": "postmark send",
    "ui": "Server > Message streams > send test"
   },
   "check": "GET /messages/outbound/{id}/details shows the message with Status delivered/sent",
   "source": "https://postmarkapp.com/developer/api/email-api, https://postmarkapp.com/"
  },
  {
   "id": "cap-02",
   "group": "Sending",
   "capability": "Send batch emails in one request",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /email/batch",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response array returns a MessageID per recipient; each appears in Activity",
   "source": "https://postmarkapp.com/developer/api/email-api, https://postmarkapp.com/developer/user-guide/send-email-with-api"
  },
  {
   "id": "cap-04",
   "group": "Sending",
   "capability": "Send bulk/broadcast emails at scale",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /email/withTemplate (Bulk API), POST /email/batch",
    "mcp": null,
    "cli": null,
    "ui": "Broadcast message stream"
   },
   "check": "GET /messages/outbound lists each recipient's delivery status for the bulk request",
   "source": "https://postmarkapp.com/developer/api/bulk-email, https://postmarkapp.com/pricing"
  },
  {
   "id": "cap-05",
   "group": "Sending",
   "capability": "Send email using a reusable template",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /email/withTemplate",
    "mcp": null,
    "cli": null,
    "ui": "Templates > Send test"
   },
   "check": "Outbound message details show the TemplateId used and rendered content",
   "source": "https://postmarkapp.com/developer/api/templates-api"
  },
  {
   "id": "cap-06",
   "group": "Templates",
   "capability": "Create and edit email templates",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /templates, PUT /templates/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Templates > New template / editor"
   },
   "check": "GET /templates/{id} returns the updated HtmlBody/Subject",
   "source": "https://postmarkapp.com/developer/api/templates-api"
  },
  {
   "id": "cap-09",
   "group": "Receiving",
   "capability": "Receive and parse inbound email",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "GET /messages/inbound, inbound webhook",
    "mcp": null,
    "cli": null,
    "ui": "Server > Inbound stream"
   },
   "check": "GET /messages/inbound/{id}/details returns parsed From/To/Subject/attachments for a received message",
   "source": "https://postmarkapp.com/developer/user-guide/inbound, https://postmarkapp.com/pricing"
  },
  {
   "id": "cap-12",
   "group": "Tracking",
   "capability": "Track email opens",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /messages/outbound/opens",
    "mcp": null,
    "cli": null,
    "ui": "Server > Activity > message detail"
   },
   "check": "GET /messages/{id}/opens returns an open event with timestamp/client after recipient opens the email",
   "source": "https://postmarkapp.com/developer/user-guide/tracking-opens, https://postmarkapp.com/developer/api/messages-api"
  },
  {
   "id": "cap-14",
   "group": "Deliverability",
   "capability": "Verify a sending domain (DKIM/Return-Path/SPF)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /domains, PUT /domains/{id}/verifyDkim, PUT /domains/{id}/verifyReturnPath",
    "mcp": null,
    "cli": null,
    "ui": "Sender signatures > Domains"
   },
   "check": "GET /domains/{id} shows DKIMVerified and ReturnPathDomainVerified true",
   "source": "https://postmarkapp.com/developer/api/domains-api"
  },
  {
   "id": "cap-15",
   "group": "Deliverability",
   "capability": "Create and verify a sender signature",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /signatures, PUT /signatures/{id}/resend",
    "mcp": null,
    "cli": null,
    "ui": "Sender signatures"
   },
   "check": "GET /signatures/{id} returns Confirmed true after clicking the confirmation email",
   "source": "https://postmarkapp.com/developer/api/signatures-api"
  },
  {
   "id": "cap-17",
   "group": "Bounce handling",
   "capability": "View and manage bounced messages",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET /bounces, PUT /bounces/{id}/activate",
    "mcp": null,
    "cli": null,
    "ui": "Server > Activity > Bounces"
   },
   "check": "GET /bounces/{id} shows Inactive false after activating a previously bounced address",
   "source": "https://postmarkapp.com/developer/api/bounce-api"
  },
  {
   "id": "cap-03",
   "group": "Sending",
   "capability": "Send email via SMTP",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Server > SMTP settings"
   },
   "check": "Message sent via SMTP relay shows up in outbound Activity",
   "source": "https://postmarkapp.com/developer/user-guide/send-email-with-smtp"
  },
  {
   "id": "cap-07",
   "group": "Templates",
   "capability": "Push templates from one server to another",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "PUT /templates/push",
    "mcp": null,
    "cli": null,
    "ui": "Templates > Push templates"
   },
   "check": "GET /templates on destination server lists the pushed template",
   "source": "https://postmarkapp.com/developer/api/templates-api"
  },
  {
   "id": "cap-08",
   "group": "Templates",
   "capability": "Validate a template before sending",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /templates/validate",
    "mcp": null,
    "cli": null,
    "ui": "Templates > editor preview"
   },
   "check": "Response reports AllContentIsValid true/false with per-field errors",
   "source": "https://postmarkapp.com/developer/api/templates-api"
  },
  {
   "id": "cap-10",
   "group": "Receiving",
   "capability": "Configure inbound domain forwarding and blocking rules",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /triggers/inboundrules",
    "mcp": null,
    "cli": null,
    "ui": "Server > Inbound > Block list"
   },
   "check": "GET /triggers/inboundrules lists the created rule and future messages from that address bounce",
   "source": "https://postmarkapp.com/developer/api/inbound-rules-triggers-api, https://postmarkapp.com/developer/user-guide/inbound"
  },
  {
   "id": "cap-11",
   "group": "Receiving",
   "capability": "Retry or bypass a blocked inbound message",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "PUT /messages/inbound/{id}/bypass, PUT /messages/inbound/{id}/retry",
    "mcp": null,
    "cli": null,
    "ui": "Server > Inbound > message detail"
   },
   "check": "GET /messages/inbound/{id}/details shows Status changed from blocked to processed",
   "source": "https://postmarkapp.com/developer/api/messages-api"
  },
  {
   "id": "cap-13",
   "group": "Tracking",
   "capability": "Track link clicks",
   "weight": "secondary",
   "plan": "basic",
   "surfaces": {
    "api": "GET /messages/outbound/clicks",
    "mcp": null,
    "cli": null,
    "ui": "Server > Activity > message detail"
   },
   "check": "GET /messages/{id}/clicks returns a click event with the OriginalLink after a recipient clicks",
   "source": "https://postmarkapp.com/developer/user-guide/tracking-links, https://postmarkapp.com/developer/api/messages-api"
  },
  {
   "id": "cap-19",
   "group": "Suppressions",
   "capability": "Manage suppressed (unsubscribed/bounced) recipients",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /suppressions/dump, POST /suppressions, DELETE via suppressions/.../delete",
    "mcp": null,
    "cli": null,
    "ui": "Server > Suppressions"
   },
   "check": "GET /suppressions/dump no longer lists the address after it is deleted from suppression",
   "source": "https://postmarkapp.com/developer/api/suppressions-api"
  },
  {
   "id": "cap-20",
   "group": "Organization",
   "capability": "Create and manage servers (sending environments)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /servers, PUT /servers/{id}, DELETE /servers/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Account > Servers"
   },
   "check": "GET /servers/{id} reflects the updated Name/Color, or GET /servers no longer lists a deleted server",
   "source": "https://postmarkapp.com/developer/api/servers-api"
  },
  {
   "id": "cap-21",
   "group": "Organization",
   "capability": "Create and manage message streams per server",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /message-streams, PUT /message-streams/{id}, PUT /message-streams/{id}/archive",
    "mcp": null,
    "cli": null,
    "ui": "Server > Message streams"
   },
   "check": "GET /message-streams/{id} shows ArchivedAt set after archiving a stream",
   "source": "https://postmarkapp.com/developer/api/message-streams-api"
  },
  {
   "id": "cap-22",
   "group": "Automation",
   "capability": "Register webhooks for delivery/bounce/open/click/spam/inbound events",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /webhooks, PUT /webhooks/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Server > Webhooks"
   },
   "check": "GET /webhooks/{id} returns the configured URL and Triggers; a matching event posts JSON to that URL",
   "source": "https://postmarkapp.com/developer/api/webhooks-api, https://postmarkapp.com/developer/webhooks/webhooks-overview"
  },
  {
   "id": "cap-24",
   "group": "Automation",
   "capability": "Test sending without delivering real mail (sandbox mode)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POSTMARK_API_TEST token",
    "mcp": null,
    "cli": null,
    "ui": "Server > sandbox toggle"
   },
   "check": "Message sent with the sandbox token appears accepted in the API response but never leaves Postmark",
   "source": "https://postmarkapp.com/developer/user-guide/sandbox-mode"
  },
  {
   "id": "cap-26",
   "group": "Search & reporting",
   "capability": "Search and inspect outbound/inbound message history",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /messages/outbound, GET /messages/inbound, GET /messages/outbound/{id}/dump",
    "mcp": null,
    "cli": null,
    "ui": "Server > Activity"
   },
   "check": "GET /messages/outbound?subject=... returns matching messages with status and recipients",
   "source": "https://postmarkapp.com/developer/api/messages-api"
  },
  {
   "id": "cap-27",
   "group": "Search & reporting",
   "capability": "View delivery, bounce, spam, and open/click statistics",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET /stats/outbound, GET /stats/outbound/bounces, GET /stats/outbound/opens",
    "mcp": null,
    "cli": null,
    "ui": "Server > Overview / Stats"
   },
   "check": "GET /stats/outbound returns counts (Sent, Bounced, etc.) matching the selected date range",
   "source": "https://postmarkapp.com/developer/api/stats-api"
  },
  {
   "id": "cap-28",
   "group": "Search & reporting",
   "capability": "Tag messages for custom reporting",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "Tag field on /email, GET /messages/outbound?tag=",
    "mcp": null,
    "cli": null,
    "ui": "Server > Activity filter by tag"
   },
   "check": "GET /messages/outbound?tag=welcome returns only messages sent with that Tag value",
   "source": "https://postmarkapp.com/pricing, https://postmarkapp.com/developer/api/messages-api"
  },
  {
   "id": "cap-16",
   "group": "Deliverability",
   "capability": "Rotate DKIM keys",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "PUT /domains/{id}/rotatedkim",
    "mcp": null,
    "cli": null,
    "ui": "Sender signatures > Domains > DNS settings"
   },
   "check": "GET /domains/{id} shows a new DKIMPendingHost/DKIMTextValue after rotation",
   "source": "https://postmarkapp.com/developer/api/domains-api"
  },
  {
   "id": "cap-18",
   "group": "Bounce handling",
   "capability": "Download raw bounce dump (SMTP transcript)",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "GET /bounces/{id}/dump",
    "mcp": null,
    "cli": null,
    "ui": "Server > Activity > bounce detail"
   },
   "check": "Response Body field returns the raw SMTP conversation text for that bounce",
   "source": "https://postmarkapp.com/developer/api/bounce-api"
  },
  {
   "id": "cap-23",
   "group": "Automation",
   "capability": "Verify webhook authenticity",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "webhook signing per docs",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Webhook request includes verifiable signature header matching documented verification steps",
   "source": "https://postmarkapp.com/developer/webhooks/webhooks-overview"
  },
  {
   "id": "cap-25",
   "group": "Automation",
   "capability": "Generate fake bounces for testing",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "fake bounce addresses per docs",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Sending to a documented fake-bounce address produces a bounce event visible in GET /bounces",
   "source": "https://postmarkapp.com/developer/user-guide/sandbox-mode"
  },
  {
   "id": "cap-29",
   "group": "Compliance",
   "capability": "Request GDPR data removal",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /data-removals, GET /data-removals/{id}",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /data-removals/{id} shows Status progressing to Complete",
   "source": "https://postmarkapp.com/developer/api/data-removals-api"
  },
  {
   "id": "cap-30",
   "group": "Access control",
   "capability": "Manage team members and user roles",
   "weight": "peripheral",
   "plan": "basic",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Account > Users"
   },
   "check": "Account > Users list shows the invited teammate with assigned role",
   "source": "https://postmarkapp.com/pricing"
  },
  {
   "id": "cap-31",
   "group": "Access control",
   "capability": "Restrict API access by IP allowlist",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Server > Settings > IP Allowlisting"
   },
   "check": "API calls from a non-allowlisted IP are rejected after the allowlist is configured",
   "source": "https://postmarkapp.com/developer/user-guide/ip-allowlisting"
  }
 ],
 "attempts": [
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "robots/aipref",
   "task": "robots.txt Content-Usage / Content-Signal",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "robots.txt 200: every group (incl. *) has 'Content-Signal: search=yes, ai-input=yes, ai-train=no' + 'Allow: /'; no Content-Usage line. Cloudflare Content Signals scheme (parses: lowercase, yes/no), though the file comment calls it aipref.",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "llms.txt",
   "task": "GET /llms.txt",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://postmarkapp.com/llms.txt 200 text/plain 28808 bytes, H1 '# Postmark'; /llms-full.txt 404",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "AI catalog",
   "task": "GET /.well-known/ai-catalog.json",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 application/ai-catalog+json, specVersion 1.0, 7 entries (MCP card, api-catalog, OpenAPI server/account, skills index, auth.md, llms.txt)",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "MCP server card",
   "task": "GET /.well-known/mcp/server-card.json",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 application/mcp-server-card+json: com.postmarkapp/postmark 2.1.1, transport stdio npx -y @activecampaign/postmark-mcp, auth api-key env POSTMARK_SERVER_TOKEN. No remote MCP endpoint, so no /server-card on an HTTP URL.",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "A2A card",
   "task": "GET /.well-known/agent-card.json, agent.json",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "both 404 text/html",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "auth.md / OAuth",
   "task": "GET /auth.md, oauth well-knowns",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "/auth.md 200 (application/octet-stream): says no OAuth, header tokens X-Postmark-Server-Token / X-Postmark-Account-Token, tokens issued only by a human in the UI; no agent_auth registration. /.well-known/oauth-protected-resource on api 404, oauth-authorization-server 404 (deliberate per auth.md).",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "API catalog / OpenAPI",
   "task": "GET /.well-known/api-catalog, swagger",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "RFC 9727 linkset 200 application/linkset+json -> swagger/server.yml (swagger: '2.0', 71 KB) and swagger/account.yml (swagger: '2.0'). Swagger 2.0 is behind current OpenAPI 3.2.1.",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "Agent skills",
   "task": "GET /.well-known/agent-skills/index.json",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 application/json, agentskills discovery 0.2.0 schema, skills postmark, postmark-email-best-practices, postmark-inbound, postmark-send-email, postmark-templates ...",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "discovery",
   "capability": "Markdown docs",
   "task": "Accept: text/markdown on /developer/api/email-api; .md URL",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Accept: text/markdown -> content-type text/markdown; vary: accept-encoding, accept. /developer/api/email-api.md -> 404",
   "notes": ""
  },
  {
   "t": "00:51",
   "cap": "first_call",
   "capability": "First API call",
   "task": "POST /email with documented test token POSTMARK_API_TEST (no account)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 {ErrorCode:0, Message:'Test job accepted', MessageID:84451fae-...}; headers ratelimit-limit 5000, ratelimit-remaining, ratelimit-reset (old draft-06 names) + x-ratelimit-*-second",
   "notes": "",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "01:09",
   "cap": "signup",
   "capability": "Sign up",
   "task": "POST /sign_up form headless (no JS, so no reCAPTCHA/eHawk token)",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": false,
   "evidence": "HTTP 400, empty body (content-length 0). Form carries invisible reCAPTCHA (recaptcha.net, data-size=invisible) and eHawk Talon device fingerprint (user[talon6]); no signup API documented (auth.md: account and tokens are created by a human in the UI).",
   "notes": "",
   "quality": {
    "error_legibility": "silent"
   }
  },
  {
   "t": "07:17",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Browser: fill sign-up form and click 'Let's get started'",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "After submit, reCAPTCHA (invisible v2) escalated to a visible picture challenge 'Select all images with crosswalks' (visible_challenge: true, shot 004.png). Not solved by the agent.",
   "notes": "",
   "quality": {
    "error_legibility": "n/a"
   }
  },
  {
   "t": "07:28",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Human handoff for the reCAPTCHA picture challenge",
   "route": "browser",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "(reCAPTCHA v2 image challenge).",
   "notes": ""
  },
  {
   "t": "07:44",
   "cap": "cap-01",
   "capability": "Send a single transactional email",
   "task": "POST /email with documented test token POSTMARK_API_TEST to our inbox",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "200 'Test job accepted' MessageID 47dada84-...; sandbox only, nothing delivered; read-back via GET /messages/outbound/{id}/details needs a real Server token we could not get (sign-up blocked by reCAPTCHA).",
   "notes": "",
   "quality": {
    "docs_match": "match",
    "verify_route": "no"
   }
  },
  {
   "t": "07:44",
   "cap": "cap-02",
   "capability": "Send batch emails in one request",
   "task": "POST /email/batch with POSTMARK_API_TEST, 2 messages",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": false,
   "evidence": "200, array of 2 'Test job accepted' with MessageIDs b1a6dedf-..., d00c7ec9-...; no Activity read-back without a real token.",
   "notes": "",
   "quality": {
    "docs_match": "match",
    "verify_route": "no"
   }
  },
  {
   "t": "07:44",
   "cap": "cap-05",
   "capability": "Send email using a reusable template",
   "task": "POST /email/withTemplate with POSTMARK_API_TEST",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "403 {ErrorCode:10, 'The Postmark Test API Token may only be used on the /email endpoint.'}; real token needs an account (sign-up blocked).",
   "notes": "",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "no"
   }
  },
  {
   "t": "07:44",
   "cap": "cap-08",
   "capability": "Validate a template before sending",
   "task": "POST /templates/validate with POSTMARK_API_TEST",
   "route": "api",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "403 ErrorCode 10 'test token only on /email'. Needs a real Server token.",
   "notes": "",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "07:44",
   "cap": "first_call",
   "capability": "Error legibility",
   "task": "POST /email with empty From (test token)",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "422 application/json {ErrorCode:300, Message:\"Invalid 'From' value.\"}: clear, not problem+json.",
   "notes": "",
   "quality": {
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "08:17",
   "cap": "discovery",
   "capability": "MCP server",
   "task": "Install @activecampaign/postmark-mcp 2.1.1 (stdio) in run dir; send server/discover (2026-07-28), then initialize, tools/list with POSTMARK_SERVER_TOKEN=POSTMARK_API_TEST",
   "route": "mcp",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Server exits before reading stdin: 'Server initialization failed: Postmark rejected the server token (401 Unauthorized). → Verify POSTMARK_SERVER_TOKEN is correct'. No reply to server/discover or initialize. Package uses @modelcontextprotocol/sdk 1.29.0 (LATEST_PROTOCOL_VERSION '2025-11-25', i.e. a legacy-protocol stdio server); CHANGELOG states 24 tools (sendEmail, sendEmailWithTemplate, sendBatch, sendBatchWithTemplate, list/get/create/edit/delete/validateTemplate, searchOutboundMessages, getMessageDetails, diagnoseDelivery, searchBounces, getBounceDump, activateBounce, list/create/deleteSuppressions, ...).",
   "notes": "",
   "quality": {
    "error_legibility": "clear"
   }
  },
  {
   "t": "10:28",
   "cap": "cap-24",
   "capability": "Test sending without delivering real mail (sandbox mode)",
   "task": "POST /email and /email/batch with POSTMARK_API_TEST addressed to our own inbox the agent's inbox, then watch the inbox",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "3 messages accepted (200 'Test job accepted', MessageIDs 47dada84-..., b1a6dedf-..., d00c7ec9-...) at 09:09:26Z; inbox read at ~09:12 and after a further 90 s wait: 'no mail for the agent's inbox'. Test token refused on every other endpoint (403 'may only be used on the /email endpoint').",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "error_legibility": "clear"
   }
  },
  {
   "t": "10:28",
   "cap": "cap-04",
   "capability": "Send bulk/broadcast emails at scale",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "cap-06",
   "capability": "Create and edit email templates",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "cap-09",
   "capability": "Receive and parse inbound email",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "cap-12",
   "capability": "Track email opens",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "cap-14",
   "capability": "Verify a sending domain (DKIM/Return-Path/SPF)",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "cap-15",
   "capability": "Create and verify a sender signature",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "cap-17",
   "capability": "View and manage bounced messages",
   "task": "Needs a Server or Account API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account: sign-up blocked by a reCAPTCHA picture challenge; per auth.md tokens are only issued by a human in the UI; the test token works only on /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "verify",
   "capability": "Verify email",
   "task": "Verification mail",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "Not reached: sign-up never completed (reCAPTCHA). Inbox an inbox received nothing.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Server API token",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No API or OAuth/device flow issues tokens (auth.md: 'There is no endpoint that issues tokens... a human account holder in the Postmark UI'). Only POSTMARK_API_TEST, limited to /email.",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "pay",
   "capability": "Pay step",
   "task": "Probe 402/agent rails and billing",
   "route": "none",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "api.postmarkapp.com/ 302 to /developer, /servers 401 JSON (no 402, no PAYMENT-REQUIRED / WWW-Authenticate Payment); x402./mpp./agents.postmarkapp.com resolve to 50.31.156.110 but connect times out; /openapi.json 404, /.well-known/ucp 404; x402 Bazaar and mpp.dev/api/services: 0 mentions of postmark; llms.txt: no x402/MPP/USDC; account.yml has no billing paths. Pricing: free Developer plan 100 emails/month, never expires; paid Basic $15/mo, Pro $16.50, Platform $18 'Buy Now' -> account.postmarkapp.com/sign_up (same reCAPTCHA form).",
   "notes": ""
  },
  {
   "t": "10:28",
   "cap": "delete",
   "capability": "Delete account",
   "task": "Find a headless delete route",
   "route": "none",
   "documented": true,
   "result": "blocked",
   "verified": false,
   "evidence": "No account was created. Account API (account.yml) lists only servers, senders, domains, templates/push: no account delete or billing endpoint.",
   "notes": ""
  }
 ],
 "stale": false,
 "icon": "/logos/postmarkapp.png",
 "monitored": false,
 "verdict": "L1 · Needs a person: an agent cannot get itself a working account today. It never got past signup: the invisible reCAPTCHA escalated to a picture challenge. Before that wall, headless docs are unusually complete: llms.txt, an AI catalog, auth.md, and a documented test token that let our agent POST to /email and get a real \"Test job accepted\" with no account. That token never stores or delivers mail, and tokens for real sends are issued only by a human in the web UI. No plan was ever started, so paying, cancelling, and deleting were never reached.",
 "page": "https://agentdrives.com/tools/postmarkapp?via=api"
}