Registry HTTP API
The CLI contract is a tiny JSON manifest plus a public Blob URL. Full detail lives in docs/registry-api.md and docs/cli-contract.md.
01Manifest
GET /api/v1/packs/:publisher/:slug/:version (or /latest) returns name, version, sha256, optional stateRoot, url, license, sizeBytes, and yanked. Responses send Cache-Control: no-store. A 200 increments packs.pulls after the response. Yanked versions return 410 with the same identity fields so a lockfile can still name the bytes.
GET /api/v1/packs/acme/refund-policy/1.2.0 GET /api/v1/packs/acme/refund-policy/latest
02Discovery
GET /api/v1/packs searches listed packs (q, format, license, agents, official, verified, sort). GET /api/v1/packs/:publisher/:slug returns the listing plus latest manifest. GET /api/v1/publishers/:handle returns the profile and its packs. Signed-in users star a listing with POST /api/v1/packs/:publisher/:slug/star. None of these proxy Blob bytes.
GET /api/v1/packs?q=refunds&format=V5 GET /api/v1/packs/acme/refund-policy GET /api/v1/publishers/acme
03Write APIs accept Bearer kno_ tokens
Upload, complete, verify, drafts, release, and yank accept a GitHub session or Authorization: Bearer kno_… (scope publish). Minting tokens (POST /api/v1/tokens) is GitHub-session only. 401 Sign in required on a write call usually means the Authorization header is missing the Bearer scheme or the token is revoked — not that Hub requires a browser login for that route. Artifact url must be a public Blob URL; private stores fail verification with 403.
04Hub does not execute agent metadata
Verification inspects agent registry data. The playground queries locally. Neither path runs tools, applies prompts, or honors grants. A host that wants those policies must opt in explicitly after mounting the artifact itself.