---
type: "SoftwareApplication"
title: "AEO Gate: free AEO tool"
description: "The 23 deterministic checks a page must clear before Laurelin Labs would publish it."
resource: "https://www.laurelinlabs.com/tools/aeo-gate"
tags: ["aeo-gate", "free-tool", "aeo-tools", "ai-search-visibility"]
generated: { by: "laurelin-site-build/2026-09-02", at: "2026-09-02T12:00:00+00:00" }
status: "stable"
stale_after: "2027-03-02T00:00:00+00:00"
---
# AEO Gate

Runs the four-pillar publish gate against any public URL: technical foundations (one H1, keyword in the H1, heading order, clean tag vocabulary, length band, JSON-LD, an extractable table), topical content (direct-answer opener, question headings, no commodity opener, no jargon, no em dashes, no exclamation marks, no AI-tell phrases, no invisible watermark characters, FAQ section), trust signals (cited blockquotes, primary sources, linked statistics) and authority network (named author, author sameAs, publisher organisation). Same gate the Newsroom publishing pipeline runs before an article ships.

- Page: https://www.laurelinlabs.com/tools/aeo-gate
- Access: Free and ungated. No email, no key, no rate limit beyond one page fetch per call. Nothing is stored.
- API: POST https://www.laurelinlabs.com/api/aeo-gate with a JSON body { "url": "https://example.com/article", "keyword": "optional primary keyword", "targetWords": 1500 }
- MCP tool: `run_aeo_gate` on https://www.laurelinlabs.com/api/mcp

## Inputs

- url (required, absolute http or https)
- keyword (optional; defaults to the URL slug)
- targetWords (optional; bands the length check to plus or minus 15 percent instead of 1200 to 1800)

## Returns

- report.score (0 to 100), report.passed, report.warned, report.failed, report.blocking
- report.pillars[]: each with name and checks[] of { id, label, status: pass | warn | fail, detail }
- derived: the inputs the gate was given (article container, author and sameAs, publisher, JSON-LD types, outbound citations, slug keyword)

## Limits

- Reads the raw HTML, so content or structured data injected only by client-side JavaScript is not seen.
- The clean-tag allow-list is the vocabulary the Laurelin generator may emit, so code, pre, details and summary are flagged on pages that legitimately use them.
- The direct-answer check looks for a paragraph carrying id="direct-answer", which almost no external site sets.

