Page loaded
Convertos
Developer docs/Content review API

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.

Keep API keys on your server. Do not put them in browser code, Git repositories, or logs. Send them as Authorization: Bearer.
curl https://convertos.ai/api/v1/reviews/page-quality/REVIEW_ID \
  -H "Authorization: Bearer cvt_live_YOUR_KEY"

Create or manage API keys in the account center →

Make your first request in three steps

  1. 01

    Sign in and create an API key.

  2. 02

    Send text, html, or a public URL; every request runs the complete review.

  3. 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

POST/api/v1/reviews/page-quality

A successful submission returns 202. Credits are reserved when the job is accepted and automatically refunded if the queue or review fails.

FieldTypeDescription
sourceTypetext | html | urlRequired. Selects which source field is read.
contentstringRequired for text or html; maximum 2 MiB.
urlstringRequired for url; must be a public absolute http(s) URL.
languageen | zhOptional. Defaults to en.
modestandardOptional, but only standard is supported; omitting it still runs the complete review. quick was removed and returns INVALID_MODE.
pageType / targetJobstringRecommended for contracts, search intent, commerce role, and release-threshold checks.
competitiveBaselineobjectOptional. 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

TypeCreditsSendChecks
text4Plain text contentAI judges intent, accuracy, evidence, originality, actionability, and E-E-A-T; rules cover input and safety limits.
html10HTML sourceAI reviews page content and E-E-A-T while the service checks title, description, H1, canonical, links, image alt, Schema, and other technical facts.
url20Public page URLAI 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

POST/api/v1/reviews/page-quality/batch

batch 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

GET/api/v1/reviews/page-quality/:id

Use the job.id or statusUrl returned by creation. Only the same API key that created the job can read it.

StatusMeaningClient action
queuedAccepted and waiting to run.Keep polling with backoff.
runningStatic review and AI analysis are running.Keep polling.
completedResult is available in result.Read and store the result.
failedJob 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.

InputPer reviewBest for
text4 creditsComplete review of plain text.
html10 creditsComplete review of HTML source and content.
url20 creditsFetch and completely review one public page.
batch5 + pages5-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.

LimitCurrent valueNotes
Active keys per account20Create, disable, and delete them in the account center.
Running jobs per key2Queue work in your client when you reach it; this is the server-side execution cap.
Accepted jobs per key/minute60Idempotent replays do not create duplicate jobs.
Text/HTML content size2 MiBMeasured in UTF-8 bytes.
URL length2048 charsPublic 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.

CodeHTTPWhat to do
INVALID_API_KEY401Check the Bearer key is correct, active, and not leaked.
INVALID_MODE400Only the complete standard review is supported; omitting mode also runs the complete review.
INVALID_SOURCE_TYPE400Use only text, html, or url.
CONTENT_REQUIRED / URL_REQUIRED400Provide content or url for the selected sourceType.
INVALID_URL / INPUT_TOO_LARGE400 / 413Fix the absolute URL or reduce the payload.
INSUFFICIENT_CREDITS402Add credits before submitting again.
RATE_LIMITED429Wait for the current window and reduce request rate.
IDEMPOTENCY_CONFLICT409Do not reuse one idempotency key for a different request.
DATABASE_UNAVAILABLE / QUEUE_UNAVAILABLE503Retry with backoff after retryAfterSeconds; no credits are charged for this request.
REVIEW_FAILED500Retry 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 →