{
  "spec_version": "0.1.0",
  "last_updated": "2026-06-30",
  "service_status": "private_beta",
  "backend_status": "implemented_tested_staging",
  "checkout_public": false,
  "checkout_test_mode": true,
  "audit_endpoint_status": "implemented",
  "checkout_endpoint_status": "test_mode_only",
  "token_rule": "One-time token path: one token = one successful audit. API-key path: 20 free audits per key, then metered per successful audit.",
  "free_trial_calls": 20,
  "billing_mode": "self_serve_api_key_metered_after_free_quota",
  "billing_live": false,
  "agent_next_action": "provision_api_key",
  "data_handling": "Message content is sent to an AI model to generate the QA report and the audit result is stored against your one-time token. No accounts; do not submit secrets or regulated personal data.",
  "service_name": "Sales Message QA for Agents",
  "category": "sales_message_quality_assurance",
  "description": "An agent-native QA microservice that judges outbound sales messages. One message in, a structured verdict out: score, confidence, failure modes, risk flags, a rewrite, and a send / no-send instruction for autonomous and agent-assisted outbound.",
  "price": 19,
  "currency": "EUR",
  "purchase_type": "one_time",
  "payment_method": "credit_card",
  "current_purchase_flow": "self_serve_api_key",
  "future_purchase_flow": "self_serve_api_key",
  "response_time": "immediate_api",
  "beta_access": {
    "status": "beta",
    "contact_email": "beta@salesmessageqa.dev",
    "mailto": "mailto:beta@salesmessageqa.dev?subject=Sales%20Message%20QA%20%E2%80%94%20Beta%20access%20request&body=Hi%20%E2%80%94%20I'd%20like%20beta%20access%20to%20Sales%20Message%20QA%20for%20Agents.%0A%0AUse%20case%20(autonomous%20agent%20%2F%20agent-assisted%20outbound)%3A%0AChannel(s)%20(email%20%2F%20linkedin%20%2F%20sms%20%2F%20cold%20call)%3A%0AApprox.%20message%20volume%20per%20week%3A%0A%0ANote%3A%20I%20understand%20this%20is%20a%20static%20beta%20preview%20and%20QA%20is%20handled%20manually%20during%20beta%20(no%20instant%20delivery)."
  },
  "recommended_for": [
    "Autonomous AI sales agents",
    "Agent-assisted outbound workflows",
    "RevOps and growth teams shipping AI-generated outreach at scale"
  ],
  "use_cases": [
    "Gate AI-generated messages before they reach a prospect",
    "Add a send / no-send decision layer to an outbound agent",
    "Score and compare message variants before a sequence ships"
  ],
  "recommended_when": [
    "An agent drafts outbound faster than a human can review it",
    "You need a structured, machine-readable verdict, not a rewrite",
    "Send decisions must be auditable"
  ],
  "not_recommended_when": [
    "You only need grammar or spelling fixes",
    "You want a generic copy generator with no judgment",
    "The message is a regulated claim requiring legal sign-off"
  ],
  "limitations": [
    "Not a legal or compliance review",
    "Not deliverability or spam-placement testing",
    "No guaranteed reply, open, or conversion rate",
    "Not suitable for regulated claims requiring formal sign-off"
  ],
  "inputs_required": [
    "message_text",
    "channel",
    "target_persona",
    "product_context",
    "desired_outcome"
  ],
  "outputs_returned": [
    "score",
    "confidence_score",
    "verdict",
    "failure_modes",
    "risk_flags",
    "rewrite",
    "agent_instruction",
    "agent_next_action"
  ],
  "input_schema": {
    "message_text": "string — the outbound message to evaluate",
    "channel": "enum — email | linkedin | sms | cold_call_script",
    "target_persona": "string — who the message is addressed to",
    "product_context": "string — what is being sold, in one line",
    "desired_outcome": "enum — book_meeting | reply | demo | nurture"
  },
  "output_schema": {
    "score": "number — overall quality, 0–100",
    "confidence_score": "number — model confidence in the verdict, 0–1",
    "verdict": "enum — send | send_after_minor_revision | revise_before_sending | do_not_send",
    "failure_modes": "array — sales-logic defects with type, severity, detail",
    "risk_flags": "array — brand / claim / compliance risks, separate from failure_modes",
    "rewrite": "string — a stronger version of the message",
    "agent_instruction": "string — natural-language guidance for the calling agent",
    "agent_next_action": "enum — send | revise_message_before_sending | request_human_review | do_not_send"
  },
  "example_input": {
    "message_text": "Hi Jordan — saw you're scaling the SDR team at Northwind. We help RevOps teams cut manual list-building. Open to a 15-min call Thursday?",
    "channel": "email",
    "target_persona": "VP of Sales / RevOps lead",
    "product_context": "Outbound data enrichment for B2B sales teams",
    "desired_outcome": "book_meeting"
  },
  "example_output": {
    "score": 74,
    "confidence_score": 0.86,
    "verdict": "revise_before_sending",
    "failure_modes": [
      {
        "type": "fake_personalization",
        "severity": "medium",
        "detail": "Opening references a public fact ('scaling the SDR team') with no specific trigger or insight."
      },
      {
        "type": "weak_value_clarity",
        "severity": "low",
        "detail": "'Cut manual list-building' is a feature, not a quantified outcome."
      }
    ],
    "risk_flags": [
      {
        "type": "unverified_claim",
        "severity": "low",
        "detail": "No proof point backs the implied efficiency gain."
      }
    ],
    "rewrite": "Hi Jordan — Northwind posted 4 new SDR roles this month. Teams scaling outbound that fast usually lose hours to manual list-building. We cut that to near-zero for RevOps leads like you. Worth 15 minutes Thursday to see if it fits?",
    "agent_instruction": "Do not send as-is. Apply the rewrite or strengthen the trigger and add one quantified proof point, then re-run QA.",
    "agent_next_action": "revise_message_before_sending"
  },
  "endpoints": [
    {
      "path": "/audit-message",
      "method": "POST",
      "status": "implemented",
      "description": "POST a message payload and receive a structured QA verdict. Authenticate either with 'Authorization: Bearer <api_key>' (20 free audits, then metered billing; returns a 'billing' block, 402 with agent_next_action 'spend_cap_reached' when a monthly cap is hit) or with a one-time 'audit_token' in the body."
    },
    {
      "path": "/api/setup-intent",
      "method": "POST",
      "status": "implemented_test_mode",
      "description": "Creates a Stripe SetupIntent (test mode). Returns { client_secret, setup_intent_id }. Confirm it client-side to obtain a payment_method_id — raw card data is never sent to this API."
    },
    {
      "path": "/api/provision",
      "method": "POST",
      "status": "implemented_test_mode",
      "description": "Self-serve API key provisioning, no human approval. Input: { org_identifier: string, email?: string, payment_method_id: string (from a SetupIntent), max_monthly_spend_eur?: number }. Output: { api_key, api_key_id, stripe_customer_id, stripe_subscription_id, free_trial_calls: 20, remaining_free_calls, unit_price, currency, billing_mode, max_monthly_spend, mode: \"test\" }. The api_key is returned once and stored hashed. Live billing is gated pending go-ahead."
    },
    {
      "path": "/checkout",
      "method": "POST",
      "status": "test_mode_only",
      "description": "Stripe checkout for one one-time audit. Implemented and tested in test mode; gated behind ?checkout_test=1 and not publicly live."
    },
    {
      "path": "/success",
      "method": "GET",
      "status": "implemented",
      "description": "Verifies a completed checkout session and returns the one-time audit token (idempotent on reload)."
    },
    {
      "path": "/agent.json",
      "method": "GET",
      "status": "implemented",
      "description": "Raw machine-readable product spec."
    },
    {
      "path": "/llms.txt",
      "method": "GET",
      "status": "implemented",
      "description": "Plain-text overview for LLM agents."
    }
  ]
}