Horizon Standard
Technical documentation for integrating the Horizon Agentic Readiness scoring engine into external AI agents, crawlers, and developer toolchains.
Overview
The OpenFetch Protocol is an open infrastructure standard for measuring and improving "Agentic Readiness" — the degree to which a website can be efficiently understood, navigated, and cited by AI agents, LLMs, and autonomous systems.
The scoring engine analyzes 20+ signals across three dimensions: Readability (how well an agent can parse structure and meaning), Actionability (whether the agent can trigger meaningful actions), and Trust (how reliably provenance and identity can be verified).
Semantic HTML, heading hierarchy, lang attr, alt text, word count
Forms, API refs, MCP headers, llms.txt, interaction hooks
JSON-LD, OpenGraph, Twitter Card, canonical URL, sitemap
Authentication
The POST /api/analyze endpoint supports optional API key authentication via the x-api-key request header. When a key is present, it is validated before processing. Unauthenticated requests from browser sessions are allowed.
Generate API keys in the Developer Portal. Keys follow the format oh_live_ + 64 hex characters.
# With API key (programmatic access)
curl -X POST https://open-horizon.replit.app/api/analyze \
-H "Content-Type: application/json" \
-H "x-api-key: oh_live_YOUR_KEY_HERE" \
-d '{"url": "https://example.com"}'
# Without key (browser / UI session)
curl -X POST /api/analyze \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com"}'Security Note
Never expose your API key in client-side JavaScript or public repositories. Treat it as a secret. Revoke and rotate keys immediately if compromised.
Endpoints
/api/analyze🔑 Optional AuthScore a URL's agentic readiness using Gemini AI. Returns a structured report with overall score, dimension breakdown, failed/passed metrics, AI perspectives, token efficiency data, and a Horizon Passport excerpt.
Request Body
urlstringrequiredThe full URL to analyze (e.g. https://example.com). Prepends https:// if scheme is omitted.
Response Fields
overallScorenumber 0–100Composite Horizon Score: readability×0.4 + actionability×0.3 + trust×0.3.
breakdownobjectPer-dimension scores and labels: { readability, actionability, trust } each with { score, label }.
failedMetricsarrayMetrics that failed, each with { id, label, severity: high|medium|low }.
passedMetricsarrayMetrics that passed, each with { id, label }.
agentViewstring2–3 sentence AI perspective on what an LLM agent experiences crawling this page.
humanViewstring2–3 sentence contrast — what a human intuitively understands that the agent cannot.
htmlExcerptstringFirst 1,400 chars of the page's <head> HTML for before/after comparison.
extractedMetaobjectStructured metadata: title, description, h1Tags, h2Tags, schemaTypes, lang, wordCount, canonical, ogTitle, twitterCard.
tokenDataobjectCompute efficiency: { originalTokens, optimizedTokens, speedupFactor, percentSmaller }.
recentScansarrayLast 12 scanned domains for the live ticker: [{ domain, score, ts }].
// Example response
{
"success": true,
"url": "https://stripe.com",
"overallScore": 88,
"breakdown": {
"readability": { "score": 90, "label": "Excellent" },
"actionability": { "score": 65, "label": "Good" },
"trust": { "score": 96, "label": "Excellent" }
},
"failedMetrics": [
{ "id": "no_llms_txt", "label": "No llms.txt file detected", "severity": "medium" }
],
"passedMetrics": [
{ "id": "structured_data", "label": "JSON-LD structured data present" }
],
"agentView": "The agent finds rich OpenGraph metadata and...",
"humanView": "A visitor immediately recognizes the brand...",
"tokenData": {
"originalTokens": 18482,
"optimizedTokens": 220,
"speedupFactor": 84,
"percentSmaller": 99
}
}/api/leaderboardNo auth requiredReturns the Global Agent Registry — the top 50 most AI-ready sites ordered by Horizon Score. Featured sites are pinned to the top.
curl https://open-horizon.replit.app/api/leaderboard
{
"entries": [
{
"domain": "vercel.com",
"score": 91,
"readability": 88,
"actionability": 78,
"trust": 95,
"title": "Vercel – Frontend Cloud",
"verified": true,
"featured": true,
"ts": 1746000000000
}
]
}Horizon Passport Schema
A Horizon Passport is a minimal JSON-LD document derived from a page's metadata. It replaces the raw HTML payload an AI agent would otherwise need to parse, reducing token cost by up to 99% while preserving all semantically meaningful signals.
The standard Passport emits a Schema.org @graph with three entities:
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://example.com/#website",
"url": "https://example.com",
"name": "Example Site",
"description": "A brief, AI-readable description",
"inLanguage": "en",
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://example.com/search?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
},
{
"@type": "WebPage",
"@id": "https://example.com/page#webpage",
"url": "https://example.com/page",
"isPartOf": { "@id": "https://example.com/#website" },
"name": "Page Title",
"description": "Page-level description",
"headline": "Primary H1 heading",
"inLanguage": "en",
"canonicalUrl": "https://example.com/page",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": ["h1", "h2", "p"]
}
}
]
}Add the Horizon Passport to your page inside a <script type="application/ld+json"> tag. AI agents that are Horizon-aware will consume this graph instead of parsing raw HTML.
Agent Integration
External AI agents can integrate with the Horizon scoring engine to make real-time navigation decisions. The recommended pattern:
# Python: Score a URL before deciding whether to crawl it
import requests
def horizon_score(url: str, api_key: str) -> dict:
resp = requests.post(
"https://open-horizon.replit.app/api/analyze",
headers={
"Content-Type": "application/json",
"x-api-key": api_key,
},
json={"url": url},
timeout=30,
)
resp.raise_for_status()
return resp.json()
# In your agent loop:
result = horizon_score("https://stripe.com", api_key="oh_live_...")
if result["overallScore"] >= 70:
# High-confidence crawl — use extractedMeta directly
meta = result["extractedMeta"]
title = meta["title"]
description = meta["description"]
else:
# Low score — fall back to full HTML parse
pass// Node.js / TypeScript agent integration
async function getHorizonPassport(url) {
const res = await fetch("/api/analyze", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": process.env.HORIZON_API_KEY,
},
body: JSON.stringify({ url }),
});
const data = await res.json();
return {
score: data.overallScore,
meta: data.extractedMeta,
efficiency: data.tokenData,
// Use agentView for agent-facing summaries
agentSummary: data.agentView,
};
}llms.txt Standard
The llms.txt standard (proposed 2025) allows websites to declare themselves as AI-agent-friendly by publishing a plain-text manifest at /llms.txt. Horizon detects and rewards the presence of this file in the Actionability score.
# llms.txt — example for yourdomain.com # This file declares AI agent access policies for this domain. > Summary: SaaS platform for project management. Agent-friendly. > Contact: agents@yourdomain.com > License: CC-BY 4.0 ## Permitted - Crawl: /docs, /blog, /api-reference - Cite: all public pages - Index: yes ## Restricted - Crawl: /admin, /dashboard, /account - Login required: /app ## Horizon Passport - JSON-LD at: /horizon-passport.json - Schema version: 1.0
Publishing a llms.txt file is a signal to AI agents that your site is Horizon-compliant and increases your Actionability score by up to 15 points.
Standards Compliance
OpenFetch is compliant with the Agent Payments 2026 standard, enabling agentic payment flows to be triggered by structured data declared in Horizon Passports.
Horizon scores MCP header presence as part of the Actionability dimension. Sites with MCP-ready endpoints receive bonus signal weight.
All generated Horizon Passports conform to Schema.org vocabulary at version 1.1, using @graph notation and explicit @id references for full interoperability.
Social metadata is scored under Trust. Sites without OpenGraph lose up to 12 Trust points; missing Twitter Card costs up to 8 points.
Rate Limits
Rate limit headers are returned with every response: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.