Split from #8715 at triage (2026-08-14). That card's §1 lands in packages/spec/src/identity/identity.zod.ts (domain:spec); this half lands in a hand-written docs page in a different lane, so it is carried separately rather than riding the spec PR.
The defect
content/docs/protocol/kernel/http-protocol.mdx shows:
GET /api/v1/data/taskX-API-Key: sk_live_abc123...
ObjectStack API keys are osk_-prefixed (API_KEY_PREFIX, core/src/security/api-key.ts). The prefix is not cosmetic: extractApiKey accepts Authorization: Bearer …only when the token starts with osk_, which is what stops a session Bearer from being read as an API key. A sk_live_… value would not authenticate, and cannot be sent in the Bearer form at all.
content/docs/protocol/** is hand-written (the generated pages under content/docs/references/** carry an AUTO-GENERATED — DO NOT EDIT banner and this page does not), so this one is fixed in place.
Scope
Correct the example prefix on this page. #8715 screened the rest of the docs tree for API-key vocabulary and recorded the pages that are already accurate (content/docs/api/index.mdx, api/client-sdk.mdx, ai/agents.mdx, ai/connect-mcp.mdx, getting-started/build-with-claude-code.mdx, deployment/environment-variables.mdx, permissions/authentication.mdx, permissions/system-context.mdx, permissions/authorization.mdx) — that screen is recent, but re-run a sk_live / sk_test grep over content/docs/** before closing rather than trusting it, and fix any sibling occurrence in the same PR.
Do not touch the ApiKey reference table — it is generated, and its content is #8715's subject.
Split from #8715 at triage (2026-08-14). That card's §1 lands in
packages/spec/src/identity/identity.zod.ts(domain:spec); this half lands in a hand-written docs page in a different lane, so it is carried separately rather than riding the spec PR.The defect
content/docs/protocol/kernel/http-protocol.mdxshows:ObjectStack API keys are
osk_-prefixed (API_KEY_PREFIX,core/src/security/api-key.ts). The prefix is not cosmetic:extractApiKeyacceptsAuthorization: Bearer …only when the token starts withosk_, which is what stops a session Bearer from being read as an API key. Ask_live_…value would not authenticate, and cannot be sent in the Bearer form at all.content/docs/protocol/**is hand-written (the generated pages undercontent/docs/references/**carry anAUTO-GENERATED — DO NOT EDITbanner and this page does not), so this one is fixed in place.Scope
Correct the example prefix on this page. #8715 screened the rest of the docs tree for API-key vocabulary and recorded the pages that are already accurate (
content/docs/api/index.mdx,api/client-sdk.mdx,ai/agents.mdx,ai/connect-mcp.mdx,getting-started/build-with-claude-code.mdx,deployment/environment-variables.mdx,permissions/authentication.mdx,permissions/system-context.mdx,permissions/authorization.mdx) — that screen is recent, but re-run ask_live/sk_testgrep overcontent/docs/**before closing rather than trusting it, and fix any sibling occurrence in the same PR.Do not touch the
ApiKeyreference table — it is generated, and its content is #8715's subject.