{
 "$schema": "https://agentdrives.com/schemas/tool.schema.json",
 "id": "prd_01m57vgtngv9g9xt8wkehk4feb",
 "ids": {
  "org": "org_01m57vgtnggda7ypyqb623bm19",
  "surfaces": {
   "web": "srf_01m5y43c64mh2rqsny0h5mkdq4",
   "api": "srf_01m5y43c6459mptp2t9scdr44h",
   "mcp": "srf_01m5y43c64mmzm3zz113w9fvjd"
  },
  "slugs": [
   "useplunk"
  ],
  "domain": "useplunk.com"
 },
 "slug": "useplunk",
 "name": "Plunk",
 "url": "https://www.useplunk.com",
 "domain": "useplunk.com",
 "category": "email-infrastructure",
 "category_name": "Email infrastructure",
 "tested_at": "2026-10-27",
 "run": "20261027T062141Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261027T062141Z",
   "date": "2026-10-27",
   "level": 2,
   "engine": {
    "model": "claude-opus-5-5",
    "driver": 5,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip",
    "version": "2026.10.27",
    "commit": "e48310aedf9e8567bbe57fdff36c027e5f19fed9",
    "prompts": {
     "version": "2026.10.27",
     "commit": "4a18f5abc48d9338c8c7c67f8820899e9dec5a45"
    },
    "rules": {
     "version": "2026.10.27",
     "commit": "e48310aedf9e8567bbe57fdff36c027e5f19fed9"
    }
   },
   "stop": null,
   "paid": false,
   "agent_paid": null
  }
 ],
 "level": 2,
 "level_name": "Gets in",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "not_counted": null,
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: runs locally, key by API, sign-up in a browser",
   "way": "api_signup"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "no",
   "text": "Work done: 29% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "checkout",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "delete": {
    "state": "yes",
    "text": "Deletes its account",
    "why": null
   }
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Learn",
   "state": "yes",
   "text": "Docs it can act on: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ],
   "docs": "complete"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: runs locally, key by API, sign-up in a browser",
   "way": "api_signup",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "no",
   "text": "Work done: 29% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "checkout",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "delete": {
    "state": "yes",
    "text": "Deletes its account",
    "why": null
   },
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "local",
   "label": "Runs locally",
   "routes": [
    "local"
   ],
   "minutes": 5,
   "core": "2/7"
  },
  {
   "key": "key_by_api",
   "label": "Key by API",
   "routes": [
    "api_signup"
   ],
   "minutes": 2,
   "core": "2/7"
  },
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [
    "email_password"
   ],
   "minutes": 4,
   "core": "0/7"
  }
 ],
 "minutes": 2,
 "next": {
  "to": 3,
  "text": "Next: do half of the core work (now 29%)"
 },
 "stop": null,
 "core": "2/7",
 "scores": {
  "coverage": 40,
  "reliability": 92,
  "resilience": 65,
  "setup": 90,
  "surface_coverage": 77,
  "docs_accuracy": 87,
  "docs_completeness": 69
 },
 "parts": {
  "holds_up": 78,
  "docs_match": 82,
  "setup": 90,
  "security": "private",
  "standards": [
   {
    "standard": "MCP discovery",
    "state": "current",
    "behind": null,
    "value": "ok"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 1,
    "value": "3.1.0"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 67,
   "recovery": 96,
   "idempotency": 33
  },
  "summary": {
   "error_legibility": "mixed",
   "recovery": "partial",
   "idempotency": "risky",
   "rate_limits": "none-seen",
   "notes": "Validation errors name each field with a suggestion, but a bad enum gives 500, 404/403 carry INTERNAL_SERVER_ERROR, a failed login is HTTP 200, and a bad step config is accepted and fails at run time. A repeated workflow create with the same Idempotency-Key duplicated; 15 quick reads drew no 429 and no rate-limit headers."
  }
 },
 "stress": [
  {
   "capability": "Build an email automation",
   "probe": "bad enum step type",
   "outcome": "500 {\"success\": false, \"error\": {\"code\": \"INTERNAL_SERVER_ERROR\", \"message\": \"An unexpected error occurred\", \"statusCode\": 500, \"requestId\": \"7667ce10-e9f7-4b8f-9930-aba759bb37a9\", \"suggestion\": \"This",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a contact to an automation",
   "probe": "nonexistent workflow id",
   "outcome": "404 {\"success\": false, \"error\": {\"code\": \"INTERNAL_SERVER_ERROR\", \"message\": \"Workflow not found\", \"statusCode\": 404, \"requestId\": \"175d3d66-0659-4f9c-b65e-262e7760bddd\"}, \"timestamp\": \"27 Oct 2026",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Build an email automation",
   "probe": "missing eventName",
   "outcome": "400 {\"error\": \"Event name is required\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Build an email automation",
   "probe": "repeat create with same Idempotency-Key",
   "outcome": "201 {\"ids\": [\"480b973a-bc11-4015-81c6-6d692a7d0d7f\", \"1af72c6c-a819-4026-88e8-311c6c82b36a\"]}",
   "grade": "silent",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Add a contact to an automation",
   "probe": "repeat contact create (upsert by email)",
   "outcome": "200 {\"isNew\": false, \"isUpdate\": true}",
   "grade": "clear",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "Build an email automation",
   "probe": "burst of 15 GET /workflows",
   "outcome": "[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200] rate headers: []",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Build an email automation",
   "probe": "wrong secret key",
   "outcome": "401 {\"success\": false, \"error\": {\"code\": \"INVALID_API_KEY\", \"message\": \"Invalid secret API key. This endpoint requires a secret key (sk_*), not a public key.\", \"statusCode\": 401, \"requestId\": \"c986439",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Build an email automation",
   "probe": "public key on a secret endpoint",
   "outcome": "401 {\"success\": false, \"error\": {\"code\": \"INVALID_API_KEY\", \"message\": \"Invalid secret API key. This endpoint requires a secret key (sk_*), not a public key.\", \"statusCode\": 401, \"requestId\": \"6114414",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Build an email automation",
   "probe": "interrupted build: step added, transition never made, then enable",
   "outcome": "200 {\"enabled\": true, \"steps\": [[\"TRIGGER\", 0], [\"DELAY\", 0]]}",
   "grade": "silent",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Build an email automation",
   "probe": "login with a wrong password",
   "outcome": "200 {\"success\": false, \"data\": \"Incorrect email or password\"}",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add a contact to an automation",
   "probe": "revoked (rotated) secret key",
   "outcome": "401 {\"success\": false, \"error\": {\"code\": \"INVALID_API_KEY\", \"message\": \"Invalid secret API key. This endpoint requires a secret key (sk_*), not a public key.\", \"statusCode\": 401, \"requestId\": \"bf6d4d9",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": {
  "totals": {
   "items": 174,
   "documented": 169,
   "safe": 160,
   "exercised": 133,
   "passed": 123,
   "skipped": 9,
   "blocked": 27,
   "not_run": 0,
   "match": 116,
   "drift": 11,
   "broken_doc": 6,
   "docs_complete": 65,
   "docs_partial": 104,
   "docs_missing": 0,
   "errors_clear": 15,
   "errors_vague": 2,
   "errors_silent": 1
  }
 },
 "coverage_core": 29,
 "coverage_own": 29,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 5,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false
 },
 "methodology": 42,
 "rules_date": "2026-10-30",
 "engine": {
  "model": "claude-opus-5-5",
  "driver": 5,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip",
  "version": "2026.10.27",
  "commit": "e48310aedf9e8567bbe57fdff36c027e5f19fed9",
  "prompts": {
   "version": "2026.10.27",
   "commit": "4a18f5abc48d9338c8c7c67f8820899e9dec5a45"
  },
  "rules": {
   "version": "2026.10.27",
   "commit": "e48310aedf9e8567bbe57fdff36c027e5f19fed9"
  }
 },
 "same_level_drives": 2,
 "drives": 2,
 "same_stop_drives": 1,
 "works_assisted": null,
 "freshness": "fresh",
 "newer_drives": {
  "count": 1,
  "newest": "2026-11-01"
 },
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-11-01"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "verified",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "llms.txt, markdown docs (Accept: text/markdown and .md URLs), OpenAPI 3.1.0 at docs.useplunk.com/openapi.json, MCP guide."
  },
  "signup": {
   "status": "headless",
   "note": "Documented POST /auth/signup {email,password} -> 200 and a session cookie; no bot check.",
   "way": "api_signup"
  },
  "verify": {
   "status": "headless",
   "note": "Verification mail arrived in seconds; POST /auth/verify-email {token} -> 'Email verified successfully'."
  },
  "credentials": {
   "status": "headless",
   "note": "",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /contacts with the secret key -> 200.",
   "route": "account"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /contacts -> 201, read back. The first send was refused: the project has no verified sending domain."
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe Checkout (card)"
   ],
   "rail_ids": [
    "stripe-checkout"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "route": "card_checkout",
   "checkout": {
    "reached": "card_form",
    "processor": "stripe_checkout",
    "captcha": "invisible",
    "three_ds": "not_seen",
    "card_form": true,
    "phone_field": "none",
    "wallets": [
     "link"
    ],
    "rail_offer": "none",
    "price": "0.001",
    "currency": "EUR",
    "period": "usage",
    "plan": "Pay-as-you-go",
    "last_button": "Subscribe with obligation to pay"
   },
   "person": "none",
   "ours": "no_card",
   "note": "No 402 or agent rail anywhere (nothing was paid: no 402). Settings → Billing → Start Subscription opens Stripe Checkout: '€0.00 due today. Then €0.001 per email, billed monthly based on usage', plus a 2.00 card check at activation. An agent with a card could finish it alone."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "Nothing to cancel: the drive stayed on the free tier. Docs: the subscription is managed in the Stripe billing portal.",
   "docs_grade": "",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "browser",
   "note": "Project deleted without a browser; the account only in the dashboard (Account → Delete account after deleting the project). Afterwards login, session and secret key are refused. An uploaded image stays public.",
   "left": "deleted",
   "after_hours": null,
   "account": true
  }
 },
 "routes": [
  {
   "route": "local",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "nothing",
   "fresh": true,
   "minutes": 5,
   "browser": false
  },
  {
   "route": "api_signup",
   "offered": "documented",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 2,
   "browser": false
  },
  {
   "route": "email_password",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 4,
   "browser": true
  }
 ],
 "checkout": {
  "reached": "card_form",
  "processor": "stripe_checkout",
  "captcha": "invisible",
  "three_ds": "not_seen",
  "phone_field": "none",
  "wallets": [
   "link"
  ],
  "rail_offer": "none",
  "period": "usage",
  "card_form": true,
  "plan": "Pay-as-you-go",
  "last_button": "Subscribe with obligation to pay"
 },
 "docs": {
  "at": "2026-10-27",
  "read": 176,
  "listed": 177,
  "sampled": false,
  "overall": "complete",
  "getting_started": "found",
  "auth": "found",
  "errors": "found",
  "examples": "good",
  "freshness": "fresh",
  "newest": "2026-10-26",
  "core_pages": "7 of 7",
  "capabilities": "covered",
  "label": "No gaps in what we read"
 },
 "claims": {
  "claimed": 6,
  "tried": 2,
  "held": 2,
  "broken": 0,
  "unclear": 0,
  "not_tried": 4,
  "undocumented_works": 0
 },
 "pay_options": {
  "checked": "2026-10-27",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "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": false,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "urls": {
  "docs": "https://docs.useplunk.com/",
  "llms_txt": "https://www.useplunk.com/llms.txt",
  "mcp": null
 },
 "surface_notes": {
  "api": "REST at next-api.useplunk.com, about 115 documented endpoints",
  "openapi": "3.1.0, 18 operations; workflows, domains and events are not in it",
  "mcp": "official stdio server @plunk/mcp 0.17.0, 42 tools",
  "llms_txt": "www.useplunk.com/llms.txt and docs.useplunk.com/llms.txt",
  "webhooks": "WEBHOOK steps in workflows, triggered by email, contact and segment events; no signature"
 },
 "surface_sizes": [
  {
   "kind": "api",
   "listed": 117,
   "tested": 90
  },
  {
   "kind": "mcp",
   "listed": 45,
   "tested": 37
  }
 ],
 "can_do": [
  "Create an account, verify it and get API keys without a browser",
  "Manage contacts, custom fields and CSV imports",
  "Build static and dynamic segments",
  "Track events and validate email addresses",
  "Build, enable and run event-triggered automations that update contacts",
  "Drive the same through the official MCP server"
 ],
 "cannot_do": [
  {
   "what": "Send any email (transactional, template, campaign)",
   "why": "Every send needs a sender domain verified with DNS records; there is no test sender"
  },
  {
   "what": "Create templates or draft campaigns",
   "why": "Both refuse a sender address without a verified domain"
  },
  {
   "what": "Receive inbound email",
   "why": "Needs a verified domain and an MX record"
  },
  {
   "what": "Pay for the paid plan without a card",
   "why": "Only Stripe card checkout; no agent payment rail"
  },
  {
   "what": "Delete the account through the API",
   "why": "Account deletion is only in the dashboard"
  },
  {
   "what": "Finish verifying a sending domain from Plunk",
   "why": "Verification is only by DKIM, SPF and MX records added at the domain's DNS provider"
  }
 ],
 "blockers": [
  "Sending, templates and campaigns need a DNS-verified sending domain"
 ],
 "tips_for_agents": [
  "Use sk_ for everything except POST /v1/track, which takes pk_.",
  "Check GET /domains/project/:projectId (or plunk_list_domains) before sending: without a verified domain every send, template and campaign returns 403.",
  "Workflow steps need a 'position'; UPDATE_CONTACT takes config.updates. Read the execution back: a bad config only fails at run time.",
  "Prefer the MCP server's plunk_add_workflow_steps and plunk_check_workflow: they validate before saving.",
  "Bulk contact jobs take {\"mode\":\"ids\",\"contactIds\":[...]}."
 ],
 "selfhost": {
  "install": {
   "status": "headless",
   "minutes": 5,
   "note": "Official image ghcr.io/useplunk/plunk:latest run daemonless with postgres:16-alpine and redis:7-alpine; entrypoint replaced by 'prisma migrate deploy' + API app.js + jobs/worker.js on port 58080, because the image's own entrypoint runs nginx on port 80 (SERVICE=all only). The API refuses to start without AWS_SES_REGION/ACCESS_KEY/SECRET ('AWS_SES_REGION is not defined in environment variables'); started with placeholder SES values, so nothing can send. Dashboard not started. A second start reused the pulled image: a WEBHOOK step fired on a tracked event and its execution log showed loopback delivery refused ('Webhook URL resolves to a private/internal IP address: 127.0.0.1'), as the Webhooks guide says."
  },
  "ladder": {
   "signup": {
    "status": "headless",
    "note": "POST /auth/signup on the local API"
   },
   "verify": {
    "status": "n/a",
    "note": "no mail verification on a local instance without SES"
   },
   "credentials": {
    "status": "headless",
    "note": ""
   },
   "first_call": {
    "status": "headless",
    "note": ""
   },
   "first_action": {
    "status": "headless",
    "note": "workflow + contact created; sends refused: domain not registered (SES needed)"
   },
   "pay": {
    "status": "n/a",
    "note": "Self-hosted: nothing to pay or cancel."
   },
   "cancel": {
    "status": "n/a",
    "note": "Self-hosted: nothing to pay or cancel."
   }
  },
  "coverage_core": 29,
  "coverage_source": "computed"
 },
 "edge_case": "none",
 "summary": "An agent gets into Plunk fully without a browser through documented API calls (sign-up, email verification, project and keys) in about a minute and a half, with no bot check. Contacts, segments, event tracking and workflows then work through the API and the official MCP server. Every send, template and campaign is refused until the project has a domain verified by DNS records, and there is no test sender, so 5 of the 7 core tasks stop there.",
 "wall": "Sending needs a DNS-verified sender domain",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "terms": null,
 "terms_read": "2026-10-27",
 "email_gate": null,
 "plain": {
  "summary": "Plunk is an email service for sending and automating email. An agent signed up, verified its email and got API keys on its own in about a minute and a half. It could manage contacts, segments and automations, but it could not send any email because sending needs a domain verified with DNS records.",
  "can_do": [
   "Create an account, verify it and get API keys without a browser",
   "Manage contacts, custom fields and CSV imports",
   "Build segments and track events",
   "Build and run automations that update contacts",
   "Use the official MCP server for workflows"
  ],
  "cannot_do": [
   {
    "what": "Send any email, template or campaign",
    "why": "Every send needs a sender domain verified by DNS records"
   },
   {
    "what": "Receive inbound email",
    "why": "Needs a verified domain and an MX record"
   },
   {
    "what": "Pay for the paid plan",
    "why": "Only card checkout exists"
   },
   {
    "what": "Delete the account through documented API",
    "why": "The account is deleted in the dashboard only"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "Set a spend limit",
   "plan": "Pay-as-you-go",
   "evidence": ""
  },
  {
   "capability": "Remove the product's branding from emails",
   "plan": "Pay-as-you-go",
   "evidence": "Dashboard: 'Emails on the free plan include a “Powered by Plunk” badge. Upgrade to remove it.'"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "capability": "Send a transactional email",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/send",
    "mcp": null,
    "cli": null,
    "ui": "Project → Send/Test"
   },
   "check": "GET /contacts/:id shows an email.sent event, or Activity feed shows the send",
   "capability_id": "cap_f606h51a",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/transactional-emails.md; https://docs.useplunk.com/api-reference/overview.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-02",
   "capability": "Send an email from a template",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/send (templateId)",
    "mcp": null,
    "cli": null,
    "ui": "Project → Templates"
   },
   "check": "Activity feed shows the send referencing the template, with override fields applied",
   "capability_id": "cap_c3h6tdt7",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/templates.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-03",
   "capability": "Draft an email campaign",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /campaigns",
    "mcp": null,
    "cli": null,
    "ui": "Project → Campaigns → New"
   },
   "check": "GET /campaigns shows the new campaign in draft state",
   "capability_id": "cap_dy157y6d",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/campaigns.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-04",
   "capability": "Schedule an email campaign",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /campaigns/:id/send",
    "mcp": null,
    "cli": null,
    "ui": "Project → Campaigns → Send/Schedule"
   },
   "check": "GET /campaigns/:id shows status scheduled with the scheduled time",
   "capability_id": "cap_xhr02x42",
   "unmapped": null,
   "source": "https://docs.useplunk.com/api-reference/campaigns/sendCampaign.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-05",
   "capability": "Build an email automation",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /workflows",
    "mcp": null,
    "cli": null,
    "ui": "Project → Workflows (visual builder)"
   },
   "check": "GET /workflows/:id shows the created trigger and steps",
   "capability_id": "cap_zhyba8bd",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/workflows.md; https://www.useplunk.com/index.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "mcp"
   ]
  },
  {
   "id": "cap-06",
   "capability": "Add a contact to an automation",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /workflows/:id/executions",
    "mcp": null,
    "cli": null,
    "ui": "Project → Workflows → contact"
   },
   "check": "GET /workflows/:id/executions shows a new execution for the contact",
   "capability_id": "cap_brfshvkc",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/workflows.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api",
    "mcp"
   ]
  },
  {
   "id": "cap-07",
   "capability": "Receive inbound email",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Activity / Domains → Inbound Email"
   },
   "check": "Activity feed shows the inbound Email record and an email.received event fires on the sender contact",
   "capability_id": "cap_bzws4rsg",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/receiving-emails.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-08",
   "capability": "Add and verify a sending domain",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → Domains"
   },
   "check": "Domains tab shows the domain status as verified after DNS records are added",
   "capability_id": "cap_1gwq82zt",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/verifying-domains.md",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-09",
   "capability": "Validate an email address",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/verify",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "Response body returns the validity verdict (disposable/MX/typo) for the address",
   "capability_id": "cap_3na9b76h",
   "unmapped": null,
   "source": "https://docs.useplunk.com/api-reference/public-api/verifyEmail.md; https://www.useplunk.com/pricing.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-10",
   "capability": "Create a list and add contacts to it",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /contacts",
    "mcp": null,
    "cli": null,
    "ui": "Project → Contacts"
   },
   "check": "GET /contacts/:id shows the new contact record",
   "capability_id": "cap_kwp65xfm",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/contacts.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-11",
   "capability": "Update a contact or subscriber",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /contacts/:id",
    "mcp": null,
    "cli": null,
    "ui": "Project → Contacts → edit"
   },
   "check": "GET /contacts/:id reflects the updated fields",
   "capability_id": "cap_1tb0z82p",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/contacts.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-12",
   "capability": "Delete a contact or subscriber",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "DELETE /contacts/:id",
    "mcp": null,
    "cli": null,
    "ui": "Project → Contacts → delete"
   },
   "check": "GET /contacts/:id returns not found after deletion",
   "capability_id": "cap_8q9mtqpg",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/contacts.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-13",
   "capability": "Import contacts from a CSV file",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /contacts/import",
    "mcp": null,
    "cli": null,
    "ui": "Project → Contacts → Import"
   },
   "check": "GET /contacts/import/:jobId shows completed with the imported count",
   "capability_id": "cap_a8damn1w",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/importing-contacts.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-14",
   "capability": "Track an event for a contact",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /v1/track",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /contacts/:id shows the tracked event in its activity",
   "capability_id": "cap_bkva1x21",
   "unmapped": null,
   "source": "https://docs.useplunk.com/api-reference/public-api/trackEvent.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-15",
   "capability": "Create a custom contact field",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST/PATCH /contacts (data.*)",
    "mcp": null,
    "cli": null,
    "ui": "Project → Contacts"
   },
   "check": "GET /contacts/:id shows the new key under data",
   "capability_id": "cap_dmgwrw28",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/custom-fields.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-16",
   "capability": "Create a segment",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /segments",
    "mcp": null,
    "cli": null,
    "ui": "Project → Segments"
   },
   "check": "GET /segments/:id shows the condition filter and resolving membership",
   "capability_id": "cap_ynachpeg",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/segments.md; https://docs.useplunk.com/guides/segment-filters.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-17",
   "capability": "Create an email template",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /templates",
    "mcp": null,
    "cli": null,
    "ui": "Project → Templates → New"
   },
   "check": "GET /templates/:id shows the created subject/body/from",
   "capability_id": "cap_ca5sezwx",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/templates.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-18",
   "capability": "Read campaign performance",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Campaigns → Analytics"
   },
   "check": "Campaign analytics view shows opens, clicks, bounces, conversions for the sent campaign",
   "capability_id": "cap_17gywz87",
   "unmapped": null,
   "source": "https://www.useplunk.com/index.md; https://www.useplunk.com/pricing.md",
   "result": "blocked",
   "via": "api"
  },
  {
   "id": "cap-19",
   "capability": "Track email opens and clicks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → Tracking"
   },
   "check": "GET /contacts/:id shows email.open / email.click events after tracking is enabled and the email is read",
   "capability_id": "cap_nw8j8qcb",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/tracking.md",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-20",
   "capability": "Register a webhook",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Workflows (Webhook step)"
   },
   "check": "Workflow execution log shows the Webhook step firing an HTTP request to the configured URL",
   "capability_id": "cap_977hxacb",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/webhooks.md",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-21",
   "capability": "Set up a preference centre or unsubscribe page",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Template/Campaign body ({{unsubscribeUrl}}, {{manageUrl}})"
   },
   "check": "Visiting the generated unsubscribeUrl/manageUrl for a recipient shows the hosted page and updates subscription state",
   "capability_id": "cap_k9zqm3we",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/unsubscribe-pages.md",
   "result": "blocked",
   "via": null
  },
  {
   "id": "cap-22",
   "capability": "Manage suppressions (bounce and complaint handling)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /contacts/bulk-unsubscribe",
    "mcp": null,
    "cli": null,
    "ui": "Project → Contacts"
   },
   "check": "GET /contacts/:id shows subscribed:false after a hard bounce or manual unsubscribe",
   "capability_id": "cap_vbg51tww",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/list-hygiene.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-23",
   "capability": "Translate the unsubscribe footer and contact-facing pages",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → Project (default language); contact data.locale"
   },
   "check": "Hosted unsubscribe page renders in the language set by the contact's locale field",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.useplunk.com/guides/localization.md",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-24",
   "capability": "Create an API key",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → API Keys"
   },
   "check": "Settings → API Keys shows the public/secret key pair available for the project",
   "capability_id": "cap_wbg916v9",
   "unmapped": null,
   "source": "https://docs.useplunk.com/guides/api-keys.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-25",
   "capability": "Remove the product's branding from emails",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → Billing (upgrade)"
   },
   "check": "Sent marketing email no longer contains the Plunk-branded footer after upgrading from free tier",
   "capability_id": "cap_n2ya4t0w",
   "unmapped": null,
   "source": "https://www.useplunk.com/pricing.md",
   "result": "plan_gated",
   "via": null,
   "counted": false
  },
  {
   "id": "cap-26",
   "capability": "Read usage and quotas",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → Billing"
   },
   "check": "Billing page shows monthly email consumption and per-category caps",
   "capability_id": "cap_n0zefvzh",
   "unmapped": null,
   "source": "https://docs.useplunk.com/concepts/billing.md",
   "result": "done",
   "via": "api",
   "done_on": [
    "api"
   ]
  },
  {
   "id": "cap-27",
   "capability": "Set a spend limit",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project → Settings → Billing (monthly spend cap)"
   },
   "check": "Billing settings show the configured monthly spend cap applied to the project",
   "capability_id": "cap_fzv501vs",
   "unmapped": null,
   "source": "https://www.useplunk.com/pricing.md",
   "result": "plan_gated",
   "via": "api",
   "counted": false
  },
  {
   "id": "cap-28",
   "capability": "Self-host the platform on your own infrastructure",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Docker Compose deployment"
   },
   "check": "A self-hosted instance, deployed via Docker Compose, serves the dashboard and API on the operator's infrastructure",
   "capability_id": null,
   "unmapped": "own_feature",
   "source": "https://docs.useplunk.com/self-hosting/introduction.md; https://docs.useplunk.com/self-hosting/docker.md",
   "result": "partial",
   "via": "api"
  }
 ],
 "stale": false,
 "unreachable_since": null,
 "not_driven_since": null,
 "icon": null,
 "agent_kinds": {
  "browser": {
   "who": "An assistant in a browser",
   "passed": [
    "signup",
    "verify",
    "first_action"
   ],
   "stop": "work",
   "why": "the rest needs a paid plan",
   "tone": "warn",
   "text": "Signs up, confirms its email and does 29% of the core work, then stops: the rest needs a paid plan."
  },
  "direct": {
   "who": "An agent talking to it directly",
   "passed": [
    "signup",
    "verify",
    "credentials",
    "first_call",
    "first_action"
   ],
   "stop": "work",
   "why": "the rest needs a paid plan",
   "tone": "warn",
   "text": "Signs up, confirms its email, gets an API key, makes its first API call and does 29% of the core work, then stops: the rest needs a paid plan."
  }
 },
 "sdk": null,
 "surface_reach": {
  "surfaces": {
   "api": true,
   "mcp": true
  },
  "read_at": "2026-10-31T01:13:47Z"
 },
 "connect": {
  "api": {
   "base_url": "https://next-api.useplunk.com",
   "state": "documented"
  },
  "signup": {
   "url": "https://next-app.useplunk.com/auth/signup",
   "state": "tested"
  },
  "docs": {
   "url": "https://docs.useplunk.com/",
   "state": "tested"
  }
 },
 "surface_sources": {
  "docs": "https://docs.useplunk.com/",
  "llms_txt": "https://www.useplunk.com/llms.txt",
  "api": "https://docs.useplunk.com/api-reference/public-api/sendEmail",
  "mcp": "https://docs.useplunk.com/guides/mcp-server",
  "openapi": "https://docs.useplunk.com/openapi.json"
 },
 "copilot_connector": null,
 "stripe_directory": null,
 "in_stripe_directory": null,
 "stripe_projects": null,
 "pay_rails": [],
 "stop_evidence": null,
 "wall_vendor": null,
 "mcp_sign_in": null,
 "safety_issues": 0,
 "fix_counts": {
  "small": 7,
  "medium": 2,
  "large": 2,
  "total": 11
 },
 "evidence_sha256": "fddaba49c634189cbd57a778f06d5d9be840c818cd521c31b09c71d83386e8a1",
 "first_seen": "2026-10-27",
 "license": {
  "name": "CC BY 4.0",
  "url": "https://creativecommons.org/licenses/by/4.0/"
 },
 "correction": {
  "status": "none",
  "open": 0,
  "since": null,
  "reply_by": null
 },
 "attribution": null,
 "confirmation": {
  "state": "confirmed",
  "drives": 2,
  "agree": 2,
  "review": null,
  "text": "2 drives agree"
 },
 "stop_shot": null,
 "stop_shot_hash": null,
 "attempts_count": 98,
 "detail": {
  "public": false,
  "in": [
   "report",
   "api"
  ],
  "since": "2026-10-17"
 },
 "what_it_does": "Plunk is an email service for sending and automating email.",
 "kind": "product",
 "rules_version": "rules-2026-10-30-42",
 "rules_url": "https://agentdrives.com/method/changelog#rules-2026-10-30-42",
 "category_median": null,
 "peers": {
  "API-03": {
   "basis": "all",
   "n": 88,
   "below": 35,
   "above": 10,
   "percentile": 64
  },
  "API-04": {
   "basis": "all",
   "n": 86,
   "below": 24,
   "above": 0,
   "percentile": 64
  },
  "API-07": {
   "basis": "category",
   "n": 5,
   "below": 0,
   "above": 3
  },
  "DOCS-08": {
   "basis": "category",
   "n": 6,
   "below": 3,
   "above": 0
  },
  "DOCS-10": {
   "basis": "category",
   "n": 6,
   "below": 1,
   "above": 1
  },
  "DOCS-11": {
   "basis": "category",
   "n": 6,
   "below": 3,
   "above": 0
  },
  "ERR-01": {
   "basis": "all",
   "n": 128,
   "below": 0,
   "above": 126,
   "percentile": 1
  },
  "ERR-02": {
   "basis": "all",
   "n": 105,
   "below": 40,
   "above": 21,
   "percentile": 59
  },
  "ERR-03": {
   "basis": "all",
   "n": 104,
   "below": 24,
   "above": 23,
   "percentile": 50
  },
  "ERR-07": {
   "basis": "all",
   "n": 104,
   "below": 34,
   "above": 40,
   "percentile": 47
  },
  "FIND-06": {
   "basis": "category",
   "n": 6,
   "below": 0,
   "above": 0
  },
  "IN-03": {
   "basis": "all",
   "n": 86,
   "below": 14,
   "above": 0,
   "percentile": 58
  },
  "IN-09": {
   "basis": "all",
   "n": 10,
   "below": 0,
   "above": 6,
   "quartile": 1
  },
  "IN-11": {
   "basis": "category",
   "n": 6,
   "below": 5,
   "above": 0
  },
  "IN-12": {
   "basis": "category",
   "n": 6,
   "below": 4,
   "above": 0
  },
  "LEAVE-03": {
   "basis": "category",
   "n": 6,
   "below": 0,
   "above": 2
  },
  "LIM-02": {
   "basis": "all",
   "n": 48,
   "below": 27,
   "above": 15,
   "percentile": 63
  },
  "PROTO-02": {
   "basis": "all",
   "n": 94,
   "below": 0,
   "above": 2,
   "percentile": 49
  }
 },
 "probe": {
  "checked": "2026-11-01",
  "status": "ok",
  "sign_up_page": "page",
  "wall": "none",
  "llms_txt": true,
  "mcp": "none",
  "openapi": true,
  "payment_402": false,
  "payment_rails": [],
  "files": {
   "openapi": {
    "url": "https://docs.useplunk.com/openapi.json",
    "found": true
   },
   "llms_txt": {
    "url": "https://www.useplunk.com/llms.txt",
    "found": true
   },
   "llms_full": {
    "url": null,
    "found": false
   }
  }
 },
 "probe_history": [
  {
   "checked": "2026-11-01",
   "status": "ok",
   "sign_up_page": "page",
   "wall": "none",
   "llms_txt": true,
   "mcp": "none",
   "openapi": true,
   "payment_402": false,
   "payment_rails": []
  },
  {
   "checked": "2026-10-31",
   "status": "ok",
   "sign_up_page": "page",
   "wall": "none",
   "llms_txt": true,
   "mcp": "none",
   "openapi": true,
   "payment_402": false,
   "payment_rails": []
  },
  {
   "checked": "2026-10-30",
   "status": "ok",
   "sign_up_page": "page",
   "wall": "none",
   "llms_txt": true,
   "mcp": "none",
   "openapi": true,
   "payment_402": false,
   "payment_rails": []
  },
  {
   "checked": "2026-10-29",
   "status": "ok",
   "sign_up_page": "page",
   "wall": "none",
   "llms_txt": true,
   "mcp": "none",
   "openapi": true,
   "payment_402": false,
   "payment_rails": []
  },
  {
   "checked": "2026-10-28",
   "status": "ok",
   "sign_up_page": "page",
   "wall": "none",
   "llms_txt": true,
   "mcp": "none",
   "openapi": true,
   "payment_402": false,
   "payment_rails": []
  }
 ],
 "surface_changes": [],
 "agent_reports": null,
 "verdict": "L2 · Gets in: our agent got in on its own, with no bot check, and no checkpoint stopped it. Sign-up, email confirmation, the key and a GET /contacts call passed through documented API routes. Contacts were created and read back through the API, and the official MCP server was available. Plunk refused the send because the project has no sending domain set up with DNS records, and it offers no test sender. Paying is a Stripe card checkout in the dashboard, with no agent payment rail. Deleting the account needed the dashboard.",
 "changes": {
  "source": "store",
  "drives": [
   {
    "run": "20261027T062141Z",
    "date": "2026-10-27",
    "level": 2,
    "stop": null,
    "entry": "self-start",
    "driver": 5,
    "listed": true,
    "paid": false,
    "agent_paid": null
   },
   {
    "run": "20261101T220213Z",
    "date": "2026-11-01",
    "level": 2,
    "stop": null,
    "entry": "self-start",
    "driver": 5,
    "listed": true,
    "paid": false,
    "agent_paid": null
   }
  ],
  "events": [],
  "feed": "https://agentdrives.com/api/tools/useplunk/changes.json"
 },
 "agreement": {
  "drives": 2,
  "agree": 2
 },
 "method_release": "2026-Q4.27",
 "found": {
  "agent_blockers": 1,
  "surface_issues": 18
 },
 "agent_surfaces": {
  "api": {
   "state": "tested",
   "reachable": true,
   "documented": 117,
   "tested": 90,
   "source": "https://docs.useplunk.com/api-reference/public-api/sendEmail"
  },
  "mcp": {
   "state": "tested",
   "reachable": true,
   "documented": 45,
   "tested": 37,
   "source": "https://docs.useplunk.com/guides/mcp-server"
  },
  "cli": {
   "state": "none_found",
   "reachable": null,
   "documented": null,
   "tested": null,
   "source": null
  },
  "sdk": {
   "state": "none_found",
   "documented": null,
   "tested": null,
   "source": null
  },
  "docs": {
   "state": "tested",
   "documented": 177,
   "tested": 176,
   "source": "https://docs.useplunk.com/"
  },
  "payment": {
   "state": "none_found",
   "documented": null,
   "tested": null,
   "source": null
  }
 },
 "issues_found": 19,
 "rank": 2,
 "rank_of": 2,
 "rank_change": null,
 "rank_since": "2026-10-27",
 "links": {
  "category": [
   {
    "label": "Communication APIs",
    "href": "https://agentdrives.com/categories/communication"
   },
   {
    "label": "Email infrastructure",
    "href": "https://agentdrives.com/categories/email-infrastructure"
   }
  ],
  "tasks": [
   {
    "label": "Create an API key",
    "href": "https://agentdrives.com/tasks/create-an-api-key"
   },
   {
    "label": "Import data from a file or another tool",
    "href": "https://agentdrives.com/tasks/import-data-from-a-file-or-another-tool"
   },
   {
    "label": "Read usage and quotas",
    "href": "https://agentdrives.com/tasks/read-usage-and-quotas"
   },
   {
    "label": "Build an email automation",
    "href": "https://agentdrives.com/tasks#build-an-email-automation"
   },
   {
    "label": "Create a segment",
    "href": "https://agentdrives.com/tasks#create-a-segment"
   },
   {
    "label": "Update a contact or subscriber",
    "href": "https://agentdrives.com/tasks#update-a-contact-or-subscriber"
   }
  ],
  "walls": [],
  "vendors": [],
  "standards": [
   {
    "label": "MCP",
    "href": "https://agentdrives.com/standards/mcp",
    "note": "tools an agent can call"
   },
   {
    "label": "OpenAPI",
    "href": "https://agentdrives.com/standards/openapi",
    "note": "its API, described"
   },
   {
    "label": "llms.txt",
    "href": "https://agentdrives.com/standards/llms-txt",
    "note": "its docs, listed for agents"
   }
  ],
  "steps": [
   {
    "label": "Find",
    "href": "https://agentdrives.com/access/find"
   },
   {
    "label": "Get in",
    "href": "https://agentdrives.com/access/get-in"
   },
   {
    "label": "Use",
    "href": "https://agentdrives.com/access/use"
   },
   {
    "label": "Pay",
    "href": "https://agentdrives.com/access/pay"
   },
   {
    "label": "Leave",
    "href": "https://agentdrives.com/access/leave"
   }
  ],
  "rivals": [
   {
    "label": "MailerSend",
    "href": "https://agentdrives.com/tools/mailersend",
    "slug": "mailersend",
    "level": 1
   },
   {
    "label": "Mailgun",
    "href": "https://agentdrives.com/tools/mailgun",
    "slug": "mailgun",
    "level": 1
   },
   {
    "label": "Mailtrap",
    "href": "https://agentdrives.com/tools/mailtrap",
    "slug": "mailtrap",
    "level": 1
   }
  ],
  "compare": [],
  "rail": [
   {
    "label": "Watch this product",
    "href": "https://agentdrives.com/watch"
   },
   {
    "label": "Get the data",
    "href": "https://agentdrives.com/data#plans"
   }
  ]
 },
 "capability_matrix": [
  {
   "id": "cap-01",
   "name": "Send a transactional email",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-02",
   "name": "Send an email from a template",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-03",
   "name": "Draft an email campaign",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-04",
   "name": "Schedule an email campaign",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-05",
   "name": "Build an email automation",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "done",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-06",
   "name": "Add a contact to an automation",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "done",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-07",
   "name": "Receive inbound email",
   "core": true,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-08",
   "name": "Add and verify a sending domain",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-09",
   "name": "Validate an email address",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "none"
   }
  },
  {
   "id": "cap-10",
   "name": "Create a list and add contacts to it",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-11",
   "name": "Update a contact or subscriber",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-12",
   "name": "Delete a contact or subscriber",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-13",
   "name": "Import contacts from a CSV file",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-14",
   "name": "Track an event for a contact",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "none"
   }
  },
  {
   "id": "cap-15",
   "name": "Create a custom contact field",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-16",
   "name": "Create a segment",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-17",
   "name": "Create an email template",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-18",
   "name": "Read campaign performance",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-19",
   "name": "Track email opens and clicks",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-20",
   "name": "Register a webhook",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-21",
   "name": "Set up a preference centre or unsubscribe page",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-22",
   "name": "Manage suppressions (bounce and complaint handling)",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-23",
   "name": "Translate the unsubscribe footer and contact-facing pages",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-24",
   "name": "Create an API key",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-25",
   "name": "Remove the product's branding from emails",
   "core": false,
   "result": "plan",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-26",
   "name": "Read usage and quotas",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-27",
   "name": "Set a spend limit",
   "core": false,
   "result": "plan",
   "surfaces": {
    "api": "plan",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-28",
   "name": "Self-host the platform on your own infrastructure",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  }
 ],
 "category_place": {
  "category": "email-infrastructure",
  "products": 8,
  "higher": 1,
  "same_level": 0,
  "as_of": "2026-10-31",
  "stop": null,
  "rivals_by": "level",
  "rivals": []
 },
 "page": "https://agentdrives.com/tools/useplunk?via=api"
}