- Errores en JSON, siempre
- Toda respuesta de error de /api devuelve `{"error":{"code","message"}}` con el status HTTP correcto — 401 credencial ausente o inválida, 403 rol o alcance insuficiente, 404 recurso inexistente, 422 validación, 429 límite de tasa. Nunca una página HTML.
- Alcances mínimos
- Una API key es `read` o `write`. Las keys que se emiten solas nacen `read`: solo métodos GET y HEAD; cualquier intento de mutar responde 403. Una key puede además limitarse a un subconjunto de shows de la organización.
- Workspace activo
- Una cuenta puede administrar varios workspaces. El header `X-Workspace-Id` elige sobre cuál opera la request; si se omite, se usa el workspace por defecto del dueño de la key.
- Markdown por negociación
- Cualquier página pública con versión markdown la sirve si pides `Accept: text/markdown` — la respuesta viaja con `Content-Type: text/markdown` y `Vary: Accept`. Sin ese header, el HTML de siempre.
- Paginación por cursor
- Los listados responden `{ data, page: { nextCursor, hasMore } }`. El total solo se calcula si lo pides con `?withTotal=1`, para no pagar el conteo cuando no hace falta.
- Idempotencia y webhooks
- Los webhooks de venta se firman y se reintentan; el consumidor debe tolerar entregas repetidas. Los webhooks propios se administran desde /api/v1/webhooks.