Ship page-quality checks inside your workflow
The Convertos content review API accepts plain text, HTML, or a public URL, runs the full page-quality-review protocol asynchronously, and returns programmable scores, gates, evidence, and findings.
Auth
Bearer API key
Inputs
Text · HTML · URL
Delivery
202 + status polling
Documentation menu
What this API does
This is an asynchronous complete page-quality review API for external developers. text, html, and public URLs all run the same page-quality-review.full.v1 rules; public URLs also add desktop, mobile, browser-interaction, and visible-load evidence. The service never signs in to target pages or forwards your cookies or session.
Choose a source
Declare whether you are sending text, HTML, or a URL with sourceType.
Process async
Create a job and receive 202 with a job ID instead of holding your request open.
Read results
Poll the status endpoint, then read verdict, score, dimensions, and findings.
Authentication
The documentation is public. Only the API-key console requires a login. Sign in to the account center to create a key; the secret is shown once.
curl https://convertos.ai/api/v1/reviews/page-quality/REVIEW_ID \
-H "Authorization: Bearer cvt_live_YOUR_KEY"Make your first request in three steps
- 01
Sign in and create an API key.
- 02
Send text, html, or a public URL; every request runs the complete review.
- 03
Keep the job ID and poll statusUrl until completed or failed.
curl -X POST https://convertos.ai/api/v1/reviews/page-quality \
-H "Authorization: Bearer cvt_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: review-001" \
-d '{
"sourceType": "url",
"url": "https://example.com/article",
"language": "en",
"mode": "standard",
"pageType": "blog_article",
"targetJob": "Answer the searcher’s question and give them a next action."
}'{
"ok": true,
"job": {
"id": "8c1b...",
"status": "queued",
"creditCost": 20,
"statusUrl": "/api/v1/reviews/page-quality/8c1b..."
}
}Create a review
/api/v1/reviews/page-qualityA successful submission returns 202. Credits are reserved when the job is accepted and automatically refunded if the queue or review fails.
| Field | Type | Description |
|---|---|---|
| sourceType | text | html | url | Required. Selects which source field is read. |
| content | string | Required for text or html; maximum 2 MiB. |
| url | string | Required for url; must be a public absolute http(s) URL. |
| language | en | zh | Optional. Defaults to en. |
| mode | standard | Optional, but only standard is supported; omitting it still runs the complete review. quick was removed and returns INVALID_MODE. |
| pageType / targetJob | string | Recommended for contracts, search intent, commerce role, and release-threshold checks. |
| competitiveBaseline | object | Optional. Supply difficulty, advantage, and evidence; without it the API uses a provisional Unknown/Medium threshold and lowers confidence. |
The Idempotency-Key header is optional but recommended. Reuse it when retrying a network request to avoid duplicate jobs or charges.
Input types and analysis boundaries
| Type | Credits | Send | Checks |
|---|---|---|---|
| text | 4 | Plain text content | AI judges intent, accuracy, evidence, originality, actionability, and E-E-A-T; rules cover input and safety limits. |
| html | 10 | HTML source | AI reviews page content and E-E-A-T while the service checks title, description, H1, canonical, links, image alt, Schema, and other technical facts. |
| url | 20 | Public page URL | AI reviews the actual page content, claims, evidence, and E-E-A-T, with desktop/mobile rendering, layout, performance, links, and console evidence. |
Inspected
Content intent, heading structure, HTML metadata, evidence and trust signals, internal-leakage signals, plus AI analysis of the same evidence.
Boundaries
Authenticated content is never accessed; text and html have no renderable URL, so browser/layout evidence is marked not applicable; competitor conclusions are never invented when evidence is absent.
Batch review
/api/v1/reviews/page-quality/batchbatch accepts 3 to 5 related pages. Every page runs the same complete review, followed by a cross-page similarity check. A batch can fail for structural sameness even when individual scores are high.
curl -X POST https://convertos.ai/api/v1/reviews/page-quality/batch \
-H "Authorization: Bearer cvt_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: batch-001" \
-d '{
"mode": "batch",
"language": "en",
"pages": [
{"label":"Page A","sourceType":"url","url":"https://example.com/a","mode":"standard","pageType":"programmatic"},
{"label":"Page B","sourceType":"url","url":"https://example.com/b","mode":"standard","pageType":"programmatic"},
{"label":"Page C","sourceType":"url","url":"https://example.com/c","mode":"standard","pageType":"programmatic"}
]
}'Read review status
/api/v1/reviews/page-quality/:idUse the job.id or statusUrl returned by creation. Only the same API key that created the job can read it.
| Status | Meaning | Client action |
|---|---|---|
| queued | Accepted and waiting to run. | Keep polling with backoff. |
| running | Static review and AI analysis are running. | Keep polling. |
| completed | Result is available in result. | Read and store the result. |
| failed | Job failed with error.code and message. | Record the error; the job charge is refunded. |
curl https://convertos.ai/api/v1/reviews/page-quality/REVIEW_ID \
-H "Authorization: Bearer cvt_live_YOUR_KEY"Review result
A completed job returns preflight, contracts, competitiveBaseline, seven dimensions, gates, caps, threshold, evidence, findings, and aiAnalysis. Rules cover technical facts and safety limits; AI judges intent, accuracy, evidence, originality, and E-E-A-T from the actual page and participates in the final verdict.
{
"version": "page-quality-review.v1",
"reviewProtocol": "page-quality-review.full.v1",
"verdict": "iterate",
"score": 74,
"confidence": "medium",
"mode": "standard",
"sourceType": "html",
"summary": "...",
"gates": [{"name":"rendered_experience","outcome":"pass","reason":"..."}],
"caps": {"applied": [], "finalScoreCap": null},
"threshold": {"scoreRequired": 85, "minCoreDimension": 75, "coreDimensionsMeetMinimum": true},
"aiAnalysis": {
"provider": "agentsflare",
"scope": "content_quality",
"status": "completed",
"verdict": "iterate",
"score": 78,
"summary": "...",
"findings": [{
"code": "AI_CONTENT_NEXT_STEP",
"message": "The opening explains the topic but does not make the next action explicit.",
"recommendation": "Add one concrete next step after the opening answer.",
"evidence": "The opening section states the topic but contains no action instruction."
}],
"eeat": {
"experience": {"score": 72, "status": "partial", "note": "Some practical examples are present, but first-hand experience is not established.", "evidence": "The page gives examples but does not identify a first-hand source."},
"expertise": {"score": 80, "status": "partial", "note": "The topic is explained with relevant detail.", "evidence": "The page explains the criteria and tradeoffs."},
"authoritativeness": {"score": 65, "status": "not_evidenced", "note": "No accountable authority is supplied.", "evidence": "No author organization or external citation is visible."},
"trustworthiness": {"score": 74, "status": "partial", "note": "Claims are mostly bounded but proof is limited.", "evidence": "The page contains claims without nearby attributable sources."}
}
},
"dimensions": {
"contentIntent": { "score": 82, "status": "inspected", "notes": [] },
"seoIndexability": { "score": 68, "status": "inspected", "notes": [] },
"geoExtractability": { "score": 76, "status": "inspected", "notes": [] }
},
"metrics": {
"wordCount": 820,
"headingCount": 9,
"h1Count": 1,
"hasTitle": true,
"hasDescription": true
},
"findings": [
{
"severity": "warning",
"code": "IMAGE_ALT",
"message": "...",
"recommendation": "..."
}
]
}Each finding includes severity, code, message, and recommendation, so you can map it to your own issue tracker, workflow, or release gate.
Credits & pricing
Billing is based on input type, not result length; every input runs the complete review. Credits are reserved when the API accepts a job and automatically refunded when the queue or review fails.
| Input | Per review | Best for |
|---|---|---|
| text | 4 credits | Complete review of plain text. |
| html | 10 credits | Complete review of HTML source and content. |
| url | 20 credits | Fetch and completely review one public page. |
| batch | 5 + pages | 5-credit base plus each page’s complete review cost. |
Limits & concurrency
These limits protect the shared queue and credit accounts. Your client should handle 429, 402, and 413 responses explicitly.
| Limit | Current value | Notes |
|---|---|---|
| Active keys per account | 20 | Create, disable, and delete them in the account center. |
| Running jobs per key | 2 | Queue work in your client when you reach it; this is the server-side execution cap. |
| Accepted jobs per key/minute | 60 | Idempotent replays do not create duplicate jobs. |
| Text/HTML content size | 2 MiB | Measured in UTF-8 bytes. |
| URL length | 2048 chars | Public http(s) only; embedded credentials are rejected. |
Deployment note: complete URL reviews require PAGE_REVIEW_BROWSER_WS_URL or BROWSERLESS_URL in production. Without a remote browser, the service does not fake rendered evidence or return a 500; it marks the browser evidence incomplete and keeps the result at iterate.
Errors & retries
Errors use one JSON shape: ok=false, error.code, and error.message; some errors include details. Retry network timeouts or 5xx responses, but do not blindly retry invalid input or authentication errors.
| Code | HTTP | What to do |
|---|---|---|
| INVALID_API_KEY | 401 | Check the Bearer key is correct, active, and not leaked. |
| INVALID_MODE | 400 | Only the complete standard review is supported; omitting mode also runs the complete review. |
| INVALID_SOURCE_TYPE | 400 | Use only text, html, or url. |
| CONTENT_REQUIRED / URL_REQUIRED | 400 | Provide content or url for the selected sourceType. |
| INVALID_URL / INPUT_TOO_LARGE | 400 / 413 | Fix the absolute URL or reduce the payload. |
| INSUFFICIENT_CREDITS | 402 | Add credits before submitting again. |
| RATE_LIMITED | 429 | Wait for the current window and reduce request rate. |
| IDEMPOTENCY_CONFLICT | 409 | Do not reuse one idempotency key for a different request. |
| DATABASE_UNAVAILABLE / QUEUE_UNAVAILABLE | 503 | Retry with backoff after retryAfterSeconds; no credits are charged for this request. |
| REVIEW_FAILED | 500 | Retry with backoff; accepted jobs that fail are refunded. |
{
"ok": false,
"error": {
"code": "RATE_LIMITED",
"message": "This API key has reached 60 accepted reviews per minute.",
"details": { "retryAfterSeconds": 60 }
}
}Ready to integrate?
Read the endpoint and limits first, then sign in to create a key. The docs are public; key management requires a session.
Create an API key →