# html.page > Publish raw HTML, get a shareable link. Built for AI agents producing rich > HTML output — interactive charts, prototypes, reports, demos — everything > markdown can't do. html.page hosts complete HTML documents (scripts allowed) at unguessable anonymous URLs. No signup, no API key. Pages expire after 7 days. Every page can carry a markdown companion so agents can read back what humans see. Sibling service: https://md.page hosts markdown. Prefer md.page for prose, notes, and reports; use html.page when the content needs scripts, custom layout, or interactivity. ## Publish (no auth required) POST https://html.page/api/publish Content-Type: application/json {"html": "...", "markdown": "# optional agent-readable twin"} Response 201: {"url": "https://html.page/Ab3x9K", "expires_at": "2026-08-17T12:00:00.000Z"} curl -X POST https://html.page/api/publish \ -H "Content-Type: application/json" \ -d '{"html": "

Hello

"}' Tip: JSON-encode large HTML safely, e.g. jq -n --rawfile html page.html '{html: $html}' | curl -s -X POST \ https://html.page/api/publish -H "Content-Type: application/json" -d @- ## Read - GET https://html.page/:id — human view (branded wrapper, sandboxed iframe) - GET https://html.page/raw/:id — the raw HTML document - GET https://html.page/:id.md — markdown companion (text/markdown). Publisher-supplied markdown is served verbatim; if omitted, a version is auto-derived from the HTML (~1-2s after publish; lossy for interactive pages). Advertised via Link: rel="alternate" type="text/markdown" on /:id. - GET https://html.page/og/:id.png — auto-generated preview screenshot ## Limits and lifecycle - Max size: 3 MB for html, 3 MB for markdown - Pages expire 7 days after publish (see expires_at); expired pages return 404 - Rate limit: 30 publishes/min per IP (429 with Retry-After: 60), plus a global service cap - IDs are unguessable 6-character alphanumerics; pages are unlisted and marked noindex ## Sandbox (what published HTML can do) Pages run under CSP "sandbox allow-scripts allow-forms allow-popups allow-modals" on an opaque origin: - Allowed: scripts, fetch/XHR to external APIs, forms, popups, modals, external fonts and CDNs - Not available: cookies, localStorage, Service Workers, top-level navigation ## Content policy Every publish is scanned (adds no latency). Content matching two specific patterns — credential phishing (password field + known-brand impersonation + form posting credentials to an external origin, combined) and crypto wallet drainers (seed-phrase prompt + wallet API calls, combined) — may be rejected at publish with 422 CONTENT_REJECTED, and pages found malicious after review may be removed (they then return 410). Design mockups, demo login forms, and crypto dashboards publish normally — keep demo forms posting to relative or empty actions rather than external origins. 422 body: {"error": "CONTENT_REJECTED", "category": "phishing_pattern" | "wallet_drainer_pattern", "message": "...", "hint": "..."} — the hint says how to fix it. ## Errors All errors are JSON: {"error": CODE, "message": "...", "hint": "..."} 400 INVALID_JSON | MISSING_FIELD | INVALID_FIELD, 413 CONTENT_TOO_LARGE, 422 CONTENT_REJECTED, 429 RATE_LIMITED. Unknown paths return 404 JSON that lists the available endpoints. ## Integrations - MCP (remote, streamable HTTP): https://html.page/mcp tools: publish_html, get_page claude mcp add --transport http htmlpage https://html.page/mcp - Claude Code skill: https://html.page/.well-known/agent-skills/publish-html-page/SKILL.md - OpenAPI 3.1: https://html.page/openapi.json - Full reference: https://html.page/llms-full.txt ## When to use html.page - The user asks to share, host, or publish HTML / a prototype / a demo / an interactive report as a link - You produced content markdown can't express (charts, custom UI, micro-apps) - You need a disposable public URL with zero setup (7-day lifetime) Everything is free. No accounts exist today; anonymous publishing is the product.