OVERVIEWAPI Reference · v1
The Weavn API returns a structured conversion audit for any URL. POST a URL, get back a JSON object with a score, ranked findings, AI-rewritten copy, and industry benchmarks.
Base URL
https://weavn.app/api/v1OVERVIEWAuthentication
All API requests require a Bearer token in the Authorization header. Get your API key from the developer portal.
Authorization: Bearer weavn_live_••••Keep your API key secret. Do not expose it in client-side code.
OVERVIEWErrors
Weavn uses standard HTTP status codes. Error responses include a machine-readable code field for programmatic handling.
CODEMEANING
400INVALID_URL / INVALID_REQUEST — URL missing, malformed, or no valid domain.
401AUTH_INVALID — Bearer token absent, malformed, or revoked.
402INSUFFICIENT_CREDITS — multi-page scan requested with no remaining credits.
402TRIAL_EXHAUSTED — free 25-scan trial exhausted; upgrade plan to continue.
422BOT_BLOCKED — URL is protected by bot detection (e.g. Cloudflare Enterprise) that prevents automated access. Try a different URL.
422EXTRACTION_FAILED — Could not extract content from this URL after two attempts. The page may require authentication or be otherwise inaccessible.
429RATE_LIMITED — request rate limit exceeded; back off and retry.
500SCAN_FAILED / INTERNAL_ERROR — analysis or infrastructure error; safe to retry with exponential backoff.
Retry 429 and 5xx responses with exponential backoff. Do not retry 400, 401, 402, or 422 — they will fail identically until the request or account state changes.
OVERVIEWRate limits
60 requests per minute per API key — a 429 with a Retry-After header (seconds) when exceeded. Each key also has a monthly scan quota, surfaced via the X-RateLimit-* response headers. The batch endpoint accepts up to 10 URLs per request.
ENDPOINTSPOST /api/v1/scan
Submit a URL for a full conversion audit. Returns synchronously by default, or via webhook in async mode.
PARAMETERTYPEREQUIREDDESCRIPTION
urlstringrequiredThe URL to scan. Must include protocol.
fieldsarrayoptionalFields to include in response. Default: all.
finding_depthstringoptional'brief' or 'full'. Default: 'full'.
finding_limitnumberoptionalMax findings to return. Default: 10.
asyncbooleanoptionalReturn immediately with scan_id. Default: false.
webhook_urlstringoptionalRequired if async: true.
pagesnumber | string[]optionalPage count (1–5), or an explicit array of paths (max 5) to scan beyond the base URL. An array returns 202 with a poll_url. Each page consumes one scan credit. Example: ["/pricing", "/about"]
RESPONSE · 200 OK
{ "scan_id": "sc_3f9a2c7e8b1d4f60", "url": "https://acme-saas.com", "score": 61, "verdict": "Fair", "scanned_at": "2026-06-14T12:00:00.000Z", "pages_scanned": 1, "page_type": "homepage", "findings_summary": 23, "dimensions": { "conversion_architecture": 58, "trust_signals": 79, "message_clarity": 71, "traffic_readiness": 44, "technical_foundation": 65, "objection_handling": 41, "offer_clarity": 53 }, "findings": [ { "id": "finding_001", "title": "Hero headline is feature-led, not outcome-led", "severity": "critical", "dimension": "Conversion Architecture", "impact": "high", "impact_estimate": "12-18% conversion lift", "explanation": "Headline names the feature set, not the customer outcome.", "fix_steps": ["Lead with the outcome", "Name the audience", "Trim to one supporting line"], "rewritten_copy": "Ship every project on time — wherever your team works.", "confidence": "high", "fix_effort": "hours", "priority": 1 } ], "copy_rewrites": { "headline": "Ship every project on time — wherever your team works", "subheadline": "The project workspace built for distributed teams.", "cta": "Start free" }, "metadata": { "word_count": 1240, "cta_count": 3, "tech_stack": ["Next.js", "Vercel"] }, "scan_meta": { "site_type": "saas", "duration_ms": 87340, "cost_usd": 0.15, "tokens_used": 18240, "cached": false }}ENDPOINTSPOST /api/v1/scan/batch
Submit up to 10 URLs in a single request. Synchronous by default — returns a results array plus a summary object. Pass async: true for a 202 with batch_id, scan_ids, and poll_urls; each result is delivered to your registered webhook endpoints as it completes.
PARAMETERTYPEREQUIREDDESCRIPTION
urlsarrayrequiredArray of URLs to scan. Max 10 per request.
asyncbooleanoptionalReturn a 202 immediately with batch_id and scan_ids; results delivered to registered webhooks. Default: false (synchronous).
fieldsarrayoptionalFields to include in response. Default: all.
finding_depthstringoptional'brief' or 'full'. Default: 'full'.
finding_limitnumberoptionalMax findings per scan. Default: 10.
ENDPOINTSGET /api/v1/scans
Retrieve a list of your scans, most recent first.
PARAMETERTYPEDESCRIPTION
limitnumberResults per page. Default: 20. Max: 100 (out-of-range values are clamped).
cursorstringOpaque keyset cursor. Pass next_cursor from the previous response to fetch the next page.
Each response adds next_cursor (a string, or null on the last page) and has_more (boolean) alongside scans. Paginate by passing next_cursor back as cursor until has_more is false.
ENDPOINTSGET /api/v1/scans/{id}
Retrieve a single scan by ID.
PARAMETERTYPEDESCRIPTION
idstringThe scan_id returned from a scan response.
ENDPOINTSPOST /api/v1/webhooks
Register a webhook endpoint. Weavn will POST a signed payload to your URL whenever the specified events occur.
PARAMETERTYPEREQUIREDDESCRIPTION
urlstringrequiredThe delivery endpoint that will receive webhook payloads.
eventsarrayoptionalEvents to subscribe to. Default: all. Options: 'scan.completed' | 'scan.failed'
ENDPOINTSGET /api/v1/webhooks
List all registered webhook endpoints for your API key.
ENDPOINTSDELETE /api/v1/webhooks
Remove a registered webhook by id, passed in the JSON body. No further deliveries are attempted to that endpoint. Returns a deleted:true acknowledgement.
PARAMETERTYPEREQUIREDDESCRIPTION
idstringrequiredThe id (UUID) returned when the webhook was created.
WEBHOOKSWebhooks
Weavn sends a POST request to your webhook URL when an async scan completes or fails.
Register webhooks in the developer portal or via the webhooks API.
WEBHOOKSEvents
scan.completed
Fires when a scan finishes successfully. Payload: event, scan_id, url, score, and a data object with domain and verdict.
scan.failed
Fires when a scan fails. Payload: event, scan_id, url, score (null), and a data object with domain, blocked, and code.
WEBHOOKSDelivery
Every webhook POST includes an X-Weavn-Signature header containing the HMAC-SHA256 hex of the raw request body. Verify it against your webhook secret using timing-safe comparison.
Your endpoint must respond with HTTP 200 within 10 seconds. Non-200 responses trigger a retry.
WEBHOOKSRetries
Webhooks are retried up to 3 times on failure. Attempt 1: immediate. Attempt 2: 5 minutes after failure. Attempt 3: 30 minutes after failure. Each attempt has a 10-second timeout. After 3 failures the webhook is marked failed and no further retries occur. Acknowledge immediately with 200 and process asynchronously to avoid timeouts.
RESPONSE SCHEMAScore
Integer 0–100. Benchmarked against all sites Weavn has scanned in the same industry category.
FIELDTYPEDESCRIPTION
scoreintegerOverall conversion score, 0–100.
verdictstringQuality band derived from score. One of: 'Poor' | 'Needs Work' | 'Fair' | 'Good' | 'Excellent'.
benchmark.industry_averageintegerMean score across scanned sites in this site's vertical.
benchmark.industry_percentileintegerPercentile rank vs. vertical peers (0–99).
benchmark.top_10_percent_scoreinteger90th-percentile score for the vertical.
benchmark.sample_sizeintegerNumber of sites in the benchmark pool.
RESPONSE SCHEMAPage type
The page type classified by the scanner before check execution. Determines which page-type-specific checks apply.
FIELDTYPEDESCRIPTION
page_typestringClassified page type. One of: 'homepage' | 'pricing' | 'product' | 'about' | 'landing' | 'other'
RESPONSE SCHEMAScore profile
How the overall score was weighted for this site's classification. An object carrying the weighted score, the profile label, and the per-dimension weights applied.
FIELDTYPEDESCRIPTION
score_profile.weighted_scoreintegerThe overall score, recomputed as the weighted sum of the 7 dimension scores.
score_profile.profile_usedstringProfile label. Format: [site_type]_[complexity]. Example: 'saas_medium'.
score_profile.weightsobjectPer-dimension weights (keyed by dimension) used in the weighted sum; sum to 1.0.
RESPONSE SCHEMAFindings
Full-depth findings (the default). With finding_depth: 'brief', each finding is trimmed to id, title, severity, dimension, explanation, and confidence.
FIELDTYPEDESCRIPTION
idstringFinding identifier, e.g. "finding_001".
titlestringShort headline for the finding (≈10 words).
severitystring'critical' | 'high' | 'medium' | 'low'.
dimensionstringThe revenue dimension label, e.g. 'Conversion Architecture'.
impactstring'high' | 'medium' | 'low'.
impact_estimatestringDirectional projection, e.g. "12-18% conversion lift".
explanationstringWhat was found — quotes the exact on-page element or cites the named absence.
fix_stepsstring[]Ordered, actionable steps specific to this page (3 items at full depth).
rewritten_copystringReady-to-paste replacement copy for the cited element.
confidencestring'high' | 'medium' | 'low'.
fix_effortstring'hours' | 'days' | 'weeks'.
priorityinteger1-based rank; lower is higher priority. Findings are sorted by this. Display as "P" + priority.
RESPONSE SCHEMAFindings summary
A single integer: the total number of findings in the findings array. Use it for dashboard display without iterating the array.
FIELDTYPEDESCRIPTION
findings_summaryintegerTotal count of findings returned in the findings array.
RESPONSE SCHEMABenchmark
FIELDTYPEDESCRIPTION
industry_averageintegerMean score across scanned sites in this site's vertical.
industry_percentileintegerWhere this site ranks among vertical peers (0–99).
top_10_percent_scoreinteger90th-percentile score for the vertical.
sample_sizeintegerNumber of sites in the benchmark pool.
RESPONSE SCHEMAStrengths
Top passing checks where this site performs genuinely above average. Only returned when checks pass with specific visible evidence. Array may be empty — never padded.
FIELDTYPEDESCRIPTION
check_idstringThe diagnostic check ID.
labelstringShort strength label.
observationstringOne sentence describing specifically what the site does well, referencing visible page content.
RESPONSE SCHEMARewritten copy
AI-rewritten alternatives for the most conversion-critical copy elements on the page.
FIELDTYPEDESCRIPTION
headlinestringRewritten hero headline (≈12 words).
subheadlinestringRewritten subheadline (≈20 words).
ctastringRewritten primary call-to-action (≈5 words).
RESPONSE SCHEMADimensions
Coverage scores across the 7 revenue dimensions. Each value is an integer 0–100; the weight each dimension contributes to the overall score is returned separately in score_profile.weights.
FIELDTYPEDESCRIPTION
conversion_architectureintegerCoverage 0–100 — the structural machinery that moves a visitor to action (hero, CTA, checkout, conversion path).
trust_signalsintegerCoverage 0–100 — credibility and proof the offer is real (testimonials, logos, guarantees).
message_clarityintegerCoverage 0–100 — how clearly the page communicates what it is and why it matters.
traffic_readinessintegerCoverage 0–100 — getting found and capturing arriving traffic (SEO, metadata).
technical_foundationintegerCoverage 0–100 — page speed and technical health.
objection_handlingintegerCoverage 0–100 — anticipating and answering buyer objections.
offer_clarityintegerCoverage 0–100 — how clear and compelling the offer and pricing are.
RESPONSE SCHEMADimension benchmarks
Per-dimension scores benchmarked against corpus data for this site's vertical. Only present when the benchmark field is requested or the fields array is empty.
FIELDTYPEDESCRIPTION
dimension_benchmarksobjectKeyed by dimension name. Each value is a benchmark object for that dimension.
[dimension].scorenumberThis site's score for the dimension.
[dimension].averagenumberIndustry average for this dimension in the site's vertical.
[dimension].percentile_labelstringHuman-readable label. Examples: "Top 10% of SaaS sites", "Below average", "Industry average".
[dimension].p10number10th percentile threshold for this dimension.
[dimension].p90number90th percentile threshold for this dimension.