For AI agents
RoastWeb for AI agents
Your coding agent can roast a website, fix what it finds, and roast it again to show the score went up. Every roast an agent starts costs $1. Nothing is free for agents.
Price
$1 a roast, which is 1 credit. Credits come in packs on Pricing, from $5 for 5. Reading and comparing roasts you already paid for is free.
What your agent gets
- Scores for speed, SEO, accessibility, best practices, mobile and AI search readiness (GEO, AEO, LLMO, SXO).
- Every problem found: what's wrong, where when the check knows, why it matters, how to fix it, and a code snippet when there is one.
- A fix brief in markdown, written for a coding agent to follow.
- A private link to the full report, to show the person.
- When the same site was roasted before: the score change and which problems are fixed or new.
Pay with an API key
1. Buy credits on Pricing. 2. Make a key under Dashboard, API Keys. 3. Start a roast:
curl -X POST https://roastweb.com/api/v1/roasts \
-H "Authorization: Bearer rw_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-site-check-1" \
-d '{"url": "https://example.com"}'A roast takes about 30 to 45 seconds. Check it every 10 seconds until its status is done:
curl "https://roastweb.com/api/v1/roasts/ROAST_ID" \
-H "Authorization: Bearer rw_live_..."Send the same Idempotency-Key again and you get the first roast back without paying twice.
Connect over MCP
RoastWeb runs an MCP server at https://roastweb.com/mcp (Streamable HTTP, no login to connect). In Claude Code, with a key:
claude mcp add --transport http roastweb https://roastweb.com/mcp \
--header "Authorization: Bearer rw_live_..."Without a key, each roast comes back as a Stripe link for the person to pay:
claude mcp add --transport http roastweb https://roastweb.com/mcpTools: roast_site, check_roast, compare_roasts, list_roasts, publish_roast and get_prices. Cursor, Codex and other MCP clients take the same URL and header.
No key? Have the person pay
Your agent asks without a payment and gets a Stripe link for its person:
curl -X POST https://roastweb.com/api/v1/roasts/card \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'The answer is a 402 with checkoutUrl. The person pays $5 for 5 roasts on Stripe (send "pack" for a bigger one), and the roast starts once they do. The agent polls statusUrl: once paid, it returns the roast and, until its first use, a new API key holding the other credits. The person sees the key on the page after paying, and in the receipt email.
To top up a key, send POST /api/v1/credits with it. The answer is a Stripe link for the person, and the credits land on that key's account.
Pay with USDC (x402), no account
An agent with a USDC wallet on Base pays $1 a roast with x402. A call without a payment gets a 402 with the terms:
curl -i -X POST https://roastweb.com/api/v1/roasts/x402 \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'The PAYMENT-REQUIRED header holds the terms: exactly $1 (1000000 units) of USDC on Base (eip155:8453), signed for 600 seconds. An x402 client signs them and sends the same request again with PAYMENT-SIGNATURE. The answer is a 202 with the roast id, its token and statusUrl. With the official client:
import { x402Client } from '@x402/core/client';
import { ExactEvmScheme } from '@x402/evm/exact/client';
import { wrapFetchWithPayment } from '@x402/fetch';
const client = x402Client.fromConfig({
schemes: [{ network: 'eip155:8453', client: new ExactEvmScheme(account) }],
});
const pay = wrapFetchWithPayment(fetch, client);
const res = await pay('https://roastweb.com/api/v1/roasts/x402', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ url: 'https://example.com' }),
});
const { roast, statusUrl } = await res.json(); // 202: check statusUrl until doneThe USDC moves only when the roast is done. If the roast fails, the payment is never collected, so there is nothing to refund. The official client's default limit is $1 a payment, and a roast is exactly $1.
Pay a pack by card with a token
An agent whose app can grant a Stripe shared payment token (spt_...) for RoastWeb's seller profile pays a pack itself:
curl -X POST https://roastweb.com/api/v1/roasts/card \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "sharedPaymentToken": "spt_...", "pack": "5"}'One charge for the pack ($5 for 5 roasts unless pack says otherwise), keyed by the token, so the same token is never charged twice. The answer is a 201 with the roast and a new API key holding the other credits. With an API key, the pack lands on that key's account instead. Top up a key the same way: POST /api/v1/credits with sharedPaymentToken.
A card that asks the person to confirm (3-D Secure) isn't charged: the answer has a checkoutUrl for the person instead.
RoastWeb's Stripe seller profile, for granting the token:
profile_61VeyR3hCkiQhotJjA6VeyR2QXSQA1bh0Ss0fmIHwIEaThe answer
{
"roast": {
"id": "...",
"status": "done",
"scores": { "overall": 61, "speed": 40, "seo": 80, "accessibility": 70,
"bestPractices": 90, "mobile": 55,
"aiSearch": { "geo": 50, "aeo": 60, "llmo": 40, "sxo": 70 } },
"problems": [
{ "id": "performance:remove-unused-css", "severity": "warning",
"title": "Remove unused CSS (120KB wasted)",
"why": "...", "fix": "...", "snippet": "..." }
],
"fixPrompt": "# Fix these issues ...",
"reportUrl": "https://roastweb.com/report/...?k=...",
"change": { "scoreChange": 14, "fixed": ["..."], "new": ["..."] }
},
"token": "...",
"statusUrl": "https://roastweb.com/api/v1/roasts/...?token=..."
}Statuses: awaiting_payment, expired (the link ran out, nothing was charged), queued, running, done, failed (nothing was charged), refunded (the roast failed and the credit is back) and, for x402, payment_failed (the USDC payment didn't go through, so the report is held; nothing was charged).
Roast again after fixing
Fix the site, start a new roast, and read change: the score change and the ids of the problems that are fixed or new. Each new roast is $1.
Limits
Two roasts running at once per account or wallet, and 100 roasts in 24 hours. Only public websites: a site on localhost needs a deployed preview URL. X profiles aren't website roasts.
Refunds
Before anything is charged, RoastWeb checks that the URL is a public web page that answers. If the roast still fails after you paid, or Google PageSpeed doesn't answer, the credit goes back by itself. With x402 the USDC moves only after the roast is done, so a failed roast costs nothing.
Privacy
Agent roasts are private. Only the key that paid for one, or its token, opens it. To share a roast, publish it: POST /api/v1/roasts/ROAST_ID/publish makes it a public page.
More
- OpenAPI: roastweb.com/openapi.json
- Prices as JSON: roastweb.com/api/v1/prices
- These docs as plain text: roastweb.com/llms-full.txt
- Questions: contact