Agent-native decision review

LaunchCheck

A two-step review ladder: stress-test launch copy for $1.00, or examine a product and technical proposal in greater depth for $2.00.

ReactionCheck $1.00ProposalCheck $2.00 x402 v2 Base mainnet USDC No LaunchCheck account or API key

Endpoints

POST https://launchcheck-x402.fly.dev/v1/reaction-check

ReactionCheck stress-tests launch and marketing copy through eight audience lenses, then returns risks, likely questions, required changes, and a fact-preserving rewrite.

Network: eip155:8453. Use a unique idempotency-key for every new logical request; retry the same request with the same key.

POST https://launchcheck-x402.fly.dev/v1/proposal-check

ProposalCheck reviews a product, feature, API, implementation, or business proposal before meaningful investment. It returns a structured decision covering the thesis, risks, assumptions, differentiation, feasibility, economics, scope cuts, validation plan, kill criteria, and build sequence.

Price: $2.00. Use a unique idempotency-key for every new logical request; retry the same request with the same key.

The first unpaid request to either paid endpoint returns HTTP 402 Payment Required with the x402 payment requirements. An x402-aware client signs the exact USDC authorization, retries the same request with the payment payload, and receives the analysis after successful settlement.

ReactionCheck request

{
  "content": "Your launch copy here. Minimum 40 characters.",
  "contentType": "product-announcement",
  "productContext": "Optional context about the product.",
  "targetAudience": "Optional intended audience.",
  "desiredAction": "Optional action the reader should take.",
  "constraints": ["Do not invent customer metrics"]
}

contentType may be landing-page, product-announcement, changelog, pricing-page, app-store-listing, email, or other. Content is limited to 12,000 characters and constraints to 10 entries.

ReactionCheck response

{
  "requestId": "2e847847-52da-46c6-b627-f95dbd66919f",
  "report": {
    "verdict": "revise",
    "score": 74,
    "inputIntegrity": {
      "status": "clean",
      "evidence": []
    },
    "executiveSummary": "Clear value, but the differentiation needs stronger evidence.",
    "topRisks": [
      {
        "severity": "medium",
        "title": "Differentiation is vague",
        "evidence": "The copy lists checks without explaining why they beat a generic critique.",
        "whyItMatters": "Readers may not see why the specialized review is worth using.",
        "fix": "State the specific pre-launch decision the review helps make."
      }
    ],
    "audienceReactions": [
      {
        "lens": "Skeptical technical buyer",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "Busy nontechnical decision-maker",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "Price-sensitive solo user",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "Privacy and security-conscious evaluator",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "Existing customer scanning for regressions",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "First-time visitor with low context",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "Enthusiastic early adopter",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      },
      {
        "lens": "Support-minded operator anticipating questions",
        "reaction": "mixed",
        "confidence": 0.82,
        "likelyThought": "Useful, but why not use a generic model?",
        "friction": "Differentiation is unclear."
      }
    ],
    "likelyQuestions": [
      "Why use this instead of a generic model?"
    ],
    "claimsNeedingEvidence": [],
    "strongestElements": [
      "The pre-launch use case is clear."
    ],
    "requiredChanges": [
      "Clarify the specialized value."
    ],
    "optionalImprovements": [],
    "suggestedRewrite": "Stress-test launch copy before you publish with eight audience lenses, evidence checks, concrete fixes, and a fact-preserving rewrite."
  },
  "meta": {
    "engine": "openai-compatible",
    "model": "example-model",
    "generatedAt": "2026-07-26T12:00:00.000Z",
    "cached": false
  }
}

ProposalCheck request

{
  "proposal": "Describe the proposal, why it should exist, the smallest next step, and how success or failure will be measured.",
  "proposalType": "api-service",
  "productContext": "Optional product, company, market, or technical context.",
  "targetAudience": "Optional intended users, buyers, developers, or stakeholders.",
  "desiredDecision": "Decide whether to green-light the bounded MVP.",
  "constraints": ["Do not invent traction or external market facts"]
}

proposalType may be product, feature, api-service, implementation, business, or other. The proposal is limited to 32,000 characters.

ProposalCheck response

{
  "requestId": "example",
  "report": {
    "verdict": "revise",
    "score": 70,
    "inputIntegrity": {
      "status": "clean",
      "evidence": []
    },
    "executiveSummary": "The proposal needs a smaller validation step.",
    "coreThesis": "Validate demand before expanding the build.",
    "strengths": [],
    "risks": [],
    "assumptions": [],
    "differentiationAssessment": {
      "rating": "unclear",
      "summary": "Differentiation still needs evidence.",
      "keyQuestion": null
    },
    "feasibilityAssessment": {
      "rating": "credible",
      "summary": "A bounded test is feasible.",
      "keyQuestion": null
    },
    "economicsAssessment": {
      "rating": "unclear",
      "summary": "Measure real cost and demand.",
      "keyQuestion": null
    },
    "scopeCuts": [],
    "requiredChanges": [
      "Define the cheapest demand test."
    ],
    "optionalImprovements": [],
    "validationPlan": [],
    "killCriteria": [],
    "recommendedBuildSequence": [],
    "recommendation": "Revise around one measurable validation step."
  },
  "meta": {
    "engine": "openai-compatible",
    "model": "openai/gpt-5.6-terra",
    "generatedAt": "2026-08-13T12:00:00.000Z",
    "cached": false
  }
}

Call it with an x402 client

Any x402 v2 client that supports the exact EVM flow on Base can call LaunchCheck. This example uses Coinbase's current managed-wallet client; its CDP credentials belong to the caller and are never sent to LaunchCheck.

npm install @coinbase/cdp-sdk @x402/core @x402/evm @x402/svm @x402/extensions @x402/fetch

export CDP_API_KEY_ID="your-api-key-id"
export CDP_API_KEY_SECRET="your-api-key-secret"
export CDP_WALLET_SECRET="your-wallet-secret"
import { CdpX402Client } from "@coinbase/cdp-sdk/x402";
import { wrapFetchWithPayment } from "@x402/fetch";

// Pay the network advertised by the 402 challenge (eip155:8453).
const client = new CdpX402Client();
const paidFetch = wrapFetchWithPayment(globalThis.fetch, client);

const response = await paidFetch("https://launchcheck-x402.fly.dev/v1/reaction-check", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    "idempotency-key": crypto.randomUUID(),
  },
  body: JSON.stringify({
    content: "Your launch copy here. It must be at least forty characters long.",
    contentType: "product-announcement",
    targetAudience: "Solo developers and small product teams"
  }),
});

console.log(await response.json());

Use the same client flow for ProposalCheck: change the URL to https://launchcheck-x402.fly.dev/v1/proposal-check and send the ProposalCheck request shape shown above. The unpaid challenge carries the $2.00 authorization.

What the eight lenses cover

The report models a skeptical technical buyer, a busy nontechnical decision-maker, a price-sensitive solo user, a privacy/security evaluator, an existing customer scanning for regressions, a low-context first-time visitor, an enthusiastic early adopter, and a support-minded operator anticipating questions.

Operational notes