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.
Endpoints
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.
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
- ReactionCheck costs $1.00 in USDC; ProposalCheck costs $2.00 in USDC on Base mainnet.
- A successful paid call returns a standard x402 payment-response settlement header alongside the JSON result.
- Reusing an idempotency key with different content returns HTTP
409. - The API is the product. The separate browser checkout is a ReactionCheck-only internal/manual integration test surface, not required for programmatic callers.