{"openapi":"3.1.0","info":{"title":"Knobase Workspace Management API","version":"1.0.0","description":"User-delegated workspace management. Separate from publisher serving. Dashboard, REST, and MCP share lib/management."},"servers":[{"url":"https://knobase.com"}],"paths":{"/v1/me":{"get":{"summary":"Caller identity","security":[{"managementOAuth":[]}]}},"/v1/workspaces":{"get":{"summary":"List workspaces","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}":{"get":{"summary":"Get workspace","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/products":{"get":{"summary":"List products","security":[{"managementOAuth":[]}]},"post":{"summary":"Create product draft","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/products/{id}":{"get":{"summary":"Get product","security":[{"managementOAuth":[]}]},"patch":{"summary":"Patch product (version / If-Match)","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/products/{id}/archive":{"post":{"summary":"Request archive confirmation","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns":{"get":{"summary":"List campaigns","security":[{"managementOAuth":[]}]},"post":{"summary":"Create campaign draft","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns/{id}":{"get":{"summary":"Get campaign","security":[{"managementOAuth":[]}]},"patch":{"summary":"Patch campaign (version / If-Match)","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns/{id}/pause":{"post":{"summary":"Pause campaign","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns/{id}/resume":{"post":{"summary":"Resume campaign","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns/{id}/mark-ready":{"post":{"summary":"Request mark-ready confirmation (test_ready). Does not enable live delivery.","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/emergency-pause":{"post":{"summary":"Request workspace-wide emergency pause confirmation","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns/{id}/budget":{"post":{"summary":"Request campaign budget confirmation","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/campaigns/{id}/activate":{"post":{"summary":"NOT_SUPPORTED live activation","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/offers":{"get":{"summary":"List immutable offer snapshots","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/offers/{id}":{"get":{"summary":"Get offer snapshot","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/apps":{"get":{"summary":"List apps","security":[{"managementOAuth":[]}]},"post":{"summary":"Create app","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/apps/{id}":{"get":{"summary":"Get app","security":[{"managementOAuth":[]}]},"patch":{"summary":"Patch app presets","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/apps/{id}/keys":{"get":{"summary":"Serving key metadata","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/apps/{id}/keys/rotate":{"post":{"summary":"Request serving-key rotate confirmation","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/apps/{id}/policy":{"get":{"summary":"Get publisher policy","security":[{"managementOAuth":[]}]},"patch":{"summary":"Request sensitive policy confirmation","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/analytics/overview":{"get":{"summary":"Analytics overview","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/analytics/products":{"get":{"summary":"Product analytics","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/analytics/campaigns":{"get":{"summary":"Campaign analytics","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/analytics/offers":{"get":{"summary":"Offer analytics","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/requests":{"get":{"summary":"Redacted requests","security":[{"managementOAuth":[]}]}},"/v1/workspaces/{workspace_id}/decisions/{id}":{"get":{"summary":"Workspace decision","security":[{"managementOAuth":[]}]}},"/v1/confirmations":{"get":{"summary":"List pending confirmations","security":[{"managementOAuth":[]}]},"post":{"summary":"Create a typed confirmation (archive, mark-ready, budget, keys, policy)","security":[{"managementOAuth":[]}]}},"/v1/confirmations/{id}":{"get":{"summary":"Get confirmation","security":[{"managementOAuth":[]}]}},"/v1/confirmations/{id}/approve":{"post":{"summary":"Approve (dashboard session only)"}},"/v1/confirmations/{id}/reject":{"post":{"summary":"Reject (dashboard session only)"}},"/api/mcp":{"post":{"summary":"Canonical Streamable HTTP MCP. GET/DELETE rejected. Serving keys rejected.","description":"Requires a management OAuth token with audience knobase.management.mcp or {origin}/api/mcp. list_workspaces does not require workspace_id. Resource tools require workspace_id when the grant covers more than one workspace."}},"/api/auth/oauth2/authorize":{"get":{"summary":"Canonical Better Auth OAuth 2.1 authorize + PKCE S256"}},"/api/auth/oauth2/token":{"post":{"summary":"Canonical Better Auth token (refresh reuse interval 0)"}},"/api/auth/oauth2/revoke":{"post":{"summary":"Canonical Better Auth revoke"}},"/api/auth/jwks":{"get":{"summary":"Canonical Better Auth JWKS"}}},"components":{"securitySchemes":{"managementOAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Management OAuth access token. REST audience knobase.management.rest or {origin}/api. MCP audience knobase.management.mcp or {origin}/api/mcp. Serving keys (kb_…) are rejected. Confirmation approve/reject require a dashboard cookie session."}},"schemas":{"ConfirmationRequired":{"type":"object","required":["status","confirmation_id","approval_url","payload_hash"],"properties":{"status":{"const":"confirmation_required"},"confirmation_id":{"type":"string"},"action":{"type":"string"},"summary":{"type":"string"},"payload_hash":{"type":"string"},"approval_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"}}},"ErrorEnvelope":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}