DOCUMENTATION

Quickstart

Mayil is a web app, not a CLI. Paste a URL into the free-audit form on the homepage — no signup, no card — and get a scored, prioritized report back in seconds. Under the hood, that form calls the same POST /api/audit endpoint you can call directly.

Request
POST /api/audit
{ "url": "https://example.com/some-page" }
Response (trimmed)
{
"auditId": "b3f1…",
"audit": {
"url": "https://example.com/some-page",
"status": "complete",
"scoreVersion": "v2",
"score": {
"overall": 72,
"grade": "C",
"categories": [ { "category": "answerFormat", "score": 61 }, … ],
"groups": [ { "id": "eeat", "kind": "construct", "score": 68, "weight": 5 }, … ],
"capped": null
},
"findings": [ { "checkId": "h1-present", "status": "pass", "score": 1, "weight": 3, … } ],
"recommendations": [ { "checkId": "direct-answer", "scoreImpact": 4, … } ]
}
}

That shape is the real Audit object the engine returns — score, per-check findings, and ranked recommendations, all in one response. There is no separate install step and no command-line tool.

Scoring model

Every audit produces a single 0–100 overall score with a letter grade. Each atomic check contributes a pass / warn / fail finding weighted by severity, blended into either one of the seven display categories below or one of six cross-cutting constructs:

E-E-A-TExperience · Expertise · Authoritativeness · TrustJTBDJobs To Be DoneYMYLYour Money or Your LifeAI Access & CrawlabilityCan an AI engine reach and parse the page at all?Machine ReadabilityCan it cleanly extract the content and data once reached?CiteworthinessIs there something on the page worth quoting?

YMYL is conditional: it only takes over as a check's scoring parent when the page covers a health, financial, legal, or safety topic, and it escalates that check's weight when it does.

Status meaning
PASSCheck met — contributes its full weighted score.
WARNPartially met — a reduced score, flags something worth fixing.
FAILNot met — contributes zero for that check's weight.

Checks that don't apply to a given page — or that error out, or can't be determined — carry weight 0 and are excluded from the score denominator entirely. They never silently drag a page down.

A failed critical check — for example, blocking AI crawlers outright in robots.txt — caps the overall score at a fixed ceiling (e.g. 20), no matter how strong every other signal is. That gate only ever lowers a high score; it never raises a low one.

The 7 dimensions

Every check belongs to exactly one of seven display categories. 130+ atomic checks ship today, each a small, evidence-backed unit — a status, a score contribution, and a snippet of what was actually found on the page.

Technical SEO
Whether the page is reachable and indexable at all — status codes, HTTPS, canonicals, robots directives.
http-status2xx response, no dead end
https-hstsServed over HTTPS with HSTS
canonicalA single canonical URL declared
Content Structure
Whether the HTML is organized so a parser (not just a human eye) can find the hierarchy.
h1-presentExactly one descriptive H1
heading-orderNo skipped heading levels
internal-linksMeaningful internal link graph
AI Accessibility
Whether AI crawlers specifically (GPTBot, ClaudeBot, PerplexityBot) are allowed in and can extract the content cheaply.
ai-crawler-accessrobots.txt does not block AI bots
content-extractabilityMain content is extractable, not JS-locked
llms-txt-qualityllms.txt present and well-formed
Content Quality
Whether the writing itself is substantive, original, and worth an engine repeating.
content-depthSubstantive, non-thin coverage
citation-worthinessSpecific, quotable claims
original-dataFirst-party data or research
Answer Format
Whether an answer engine can lift a self-contained answer without rewriting the page.
direct-answerA direct answer near the top
faq-contentExtractable Q&A pairs
question-h2sSubheadings phrased as questions
Authority
Whether a real, identifiable, credentialed source stands behind the page.
author-bylineNamed author on the page
author-credentialsVerifiable author expertise
entity-consistencyConsistent brand/entity identity
Structured Data
Whether machine-readable schema.org markup makes the page and its entities explicit.
json-ld-presentValid JSON-LD on the page
article-schemaArticle/BlogPosting schema
org-schemaOrganization schema for the brand

Full methodology, the pipeline diagram, and all six cross-cutting constructs (E-E-A-T, JTBD, YMYL, AI Access, Machine Readability, Citeworthiness) in more depth: How it works →

Partner API

There is no public REST API with arbitrary endpoints. What exists is a stable, versioned JSON export — toPartnerApi(audit) — that reshapes an Audit into a flatter payload intended for partners piping results into their own dashboards:

{
"apiVersion": "1",
"scoreVersion": "v2",
"url": "https://example.com/some-page",
"auditedAt": "2026-07-07T00:00:00.000Z",
"status": "complete",
"score": { "overall": 72, "grade": "C", "capped": null, "groups": [ … ] },
"findings": [ { "checkId": "h1-present", "status": "pass", "score": 1,
"scoringParent": { "kind": "category", "id": "contentStructure" },
"facets": [], "severity": "high", "evidence": { "count": 1 }, "lifecycle": "active" } ],
"recommendations": [ { "checkId": "direct-answer", "title": "…", "scoreImpact": 4, … } ]
}

For the paid-tier, full-site brand-authority audit, the async job is polled at GET /api/site-audit/:jobId, which returns one of:

{ "status": "pending" }
{ "status": "complete", "audit": { /* SiteAudit */ } }
{ "status": "failed", "error": "…" }

That route is ownership-guarded: a job tied to a signed-in organization is only visible to that organization; anonymous jobs remain publicly readable by their link. There is no self-serve API-key system today — partner access is arranged directly.