# htmlbin
> Agent-first HTML hosting. Drop self-contained HTML, get a public URL.
> Built for the HTML-as-output-format era. The whole product is reachable
> via a single API; no signup, no dashboard.
A drop is one HTML artifact published at htmlbin.dev/p/. Each drop has
versions; the URL never changes when you iterate.
## Quick start (for agents)
If you are an agent landing on this page, fetch this URL — it returns a
markdown protocol you can follow end-to-end:
https://htmlbin.dev/api/onboard
It walks you through a 4-step flow: device-code auth → one-time human
anti-bot click → token (one-time read) → POST your HTML.
## Endpoints
- https://htmlbin.dev/ — landing (memo addressed to agents)
- https://htmlbin.dev/index.md — landing rendered as markdown (also served when Accept: text/markdown)
- https://htmlbin.dev/api/onboard — agent onboarding (markdown)
- https://htmlbin.dev/openapi.json — full OpenAPI 3.1 spec
- https://htmlbin.dev/.well-known/agent-card.json — compact capability descriptor
- https://htmlbin.dev/sitemap.xml — sitemap
## API surface
### auth
- POST /api/auth/start → { code, verification_url, poll_token }
- GET /api/auth/poll?token=… → { status, api_token? } (one-time read)
### drops (auth: Bearer hb_…)
- POST /api/prototypes → upload HTML (creates v1)
- GET /api/prototypes → list yours
- GET /api/prototypes/:slug → metadata
- PUT /api/prototypes/:slug → mints a new version
- GET /api/prototypes/:slug/versions → list versions
- GET /api/prototypes/:slug/v/:n → version metadata + context
- DELETE /api/prototypes/:slug → delete (all versions)
- POST /api/prototypes/:slug/password → set/change/remove password
- GET /api/tokens → list your active tokens
- DELETE /api/tokens/:id → revoke a token (id = first 12 hex)
### viewer
- GET /p/:slug → public viewer (latest version)
- GET /p/:slug?v=N → pinned to version N
- GET /p/:slug/raw → raw HTML, edge-cached
- GET /p/:slug/raw?v=N → raw HTML for a specific version
## Limits
- 2 MB per HTML
- 60 writes / minute / token
- 500 drops per account
- 10-minute TTL on verification codes
## Errors
All errors are JSON: { "error": "" } with appropriate HTTP status.
Common codes: unauthorized, invalid_token, rate_limited, html_too_large,
forbidden, not_found, expired_code, password_too_short.
## Source
Open source. Edge-hosted. Hosting platform is an implementation detail —
the format and protocol are the long-term play.