{"openapi":"3.1.0","info":{"title":"Bolrach Developer Platform API","version":"1.0.0","description":"One authenticated base URL for the whole Bolrach estate: AI, geo, bots, WhatsApp, streaming, ERP, voice, identity, wiki, files, notify and trust. Authenticate with a Bolrach API key (bt_...) as a Bearer token; every endpoint declares the scope it requires. Human docs live at https://docs.bolrach.dev.","contact":{"name":"Bolrach","url":"https://docs.bolrach.dev"}},"servers":[{"url":"https://api.bolrach.dev","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"ai","description":"Text generation, summarization, classification and moderation."},{"name":"geo","description":"IP geolocation for the caller or any address."},{"name":"bots","description":"Bot directory, templates and chat."},{"name":"whatsapp","description":"Send WhatsApp messages and templates from the platform business number."},{"name":"streaming","description":"Channels, videos, shorts and live streams."},{"name":"erp","description":"Company registry lookups."},{"name":"voice","description":"Phone numbers and click-to-call bridging."},{"name":"identity","description":"Identity and face verification."},{"name":"wiki","description":"Evidence-first knowledge articles, claims and sources. Public read; wiki:write for authors."},{"name":"files","description":"Secure object uploads with malware scan gate. Public health only without a key."},{"name":"notify","description":"Shared notification intake and in-app feed for products."},{"name":"trust","description":"URL and threat intelligence (partner scope)."}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key as a Bearer token, e.g. `Authorization: Bearer bt_live_...`"},"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key in the x-api-key header."}}},"paths":{"/v1/ai/answer":{"post":{"tags":["ai"],"summary":"Answer a prompt","operationId":"post_v1_ai_answer","description":"Requires the `ai:invoke` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"ai:invoke","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/ai/summarize":{"post":{"tags":["ai"],"summary":"Summarize text","operationId":"post_v1_ai_summarize","description":"Requires the `ai:invoke` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"ai:invoke","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/ai/classify":{"post":{"tags":["ai"],"summary":"Classify text into labels","operationId":"post_v1_ai_classify","description":"Requires the `ai:invoke` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"ai:invoke","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/ai/moderate":{"post":{"tags":["ai"],"summary":"Moderate content","operationId":"post_v1_ai_moderate","description":"Requires the `ai:invoke` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"ai:invoke","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/geo":{"get":{"tags":["geo"],"summary":"Geolocate the calling IP","operationId":"get_v1_geo","description":"Requires the `geo:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"geo:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/geo/{ip}":{"get":{"tags":["geo"],"summary":"Geolocate a specific IP","operationId":"get_v1_geo_ip","description":"Requires the `geo:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"geo:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"ip","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/geo/batch":{"post":{"tags":["geo"],"summary":"Geolocate many IPs at once","operationId":"post_v1_geo_batch","description":"Requires the `geo:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"geo:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/bots/templates":{"get":{"tags":["bots"],"summary":"List bot templates","operationId":"get_v1_bots_templates","description":"Requires the `bots:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"bots:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/bots/templates/{key}":{"get":{"tags":["bots"],"summary":"Get a bot template","operationId":"get_v1_bots_templates_key","description":"Requires the `bots:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"bots:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/bots/directory":{"get":{"tags":["bots"],"summary":"List public bots","operationId":"get_v1_bots_directory","description":"Requires the `bots:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"bots:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/bots/{slug}":{"get":{"tags":["bots"],"summary":"Get a bot by slug","operationId":"get_v1_bots_slug","description":"Requires the `bots:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"bots:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/bots/{botId}/chat":{"post":{"tags":["bots"],"summary":"Send a message to a bot","operationId":"post_v1_bots_botId_chat","description":"Requires the `bots:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"bots:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"botId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/bots/{botId}/messages":{"get":{"tags":["bots"],"summary":"List a conversation's messages","operationId":"get_v1_bots_botId_messages","description":"Requires the `bots:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"bots:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"botId","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/whatsapp/send":{"post":{"tags":["whatsapp"],"summary":"Send a free-form message","operationId":"post_v1_whatsapp_send","description":"Requires the `whatsapp:send` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"whatsapp:send","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/whatsapp/send-template":{"post":{"tags":["whatsapp"],"summary":"Send a template message","operationId":"post_v1_whatsapp_send_template","description":"Requires the `whatsapp:send` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"whatsapp:send","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/whatsapp/templates":{"get":{"tags":["whatsapp"],"summary":"List approved templates","operationId":"get_v1_whatsapp_templates","description":"Requires the `whatsapp:send` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"whatsapp:send","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/streaming/channels":{"get":{"tags":["streaming"],"summary":"List channels","operationId":"get_v1_streaming_channels","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/streaming/channels/{handle}":{"get":{"tags":["streaming"],"summary":"Get a channel","operationId":"get_v1_streaming_channels_handle","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/streaming/videos/{uuid}":{"get":{"tags":["streaming"],"summary":"Get a video","operationId":"get_v1_streaming_videos_uuid","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/streaming/shorts":{"get":{"tags":["streaming"],"summary":"List shorts","operationId":"get_v1_streaming_shorts","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/streaming/shorts/{uuid}":{"get":{"tags":["streaming"],"summary":"Get a short","operationId":"get_v1_streaming_shorts_uuid","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/streaming/live":{"get":{"tags":["streaming"],"summary":"List live streams","operationId":"get_v1_streaming_live","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/streaming/live/{uuid}":{"get":{"tags":["streaming"],"summary":"Get a live stream","operationId":"get_v1_streaming_live_uuid","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/streaming/search":{"get":{"tags":["streaming"],"summary":"Search streaming content","operationId":"get_v1_streaming_search","description":"Requires the `streaming:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"streaming:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/erp/companies":{"get":{"tags":["erp"],"summary":"List companies","operationId":"get_v1_erp_companies","description":"Requires the `erp:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"erp:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/erp/companies/{code}":{"get":{"tags":["erp"],"summary":"Get a company by code","operationId":"get_v1_erp_companies_code","description":"Requires the `erp:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"erp:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/voice/dids":{"get":{"tags":["voice"],"summary":"List phone numbers","operationId":"get_v1_voice_dids","description":"Requires the `voice:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"voice:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/voice/status":{"get":{"tags":["voice"],"summary":"Voice platform status","operationId":"get_v1_voice_status","description":"Requires the `voice:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"voice:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/voice/click-to-call":{"post":{"tags":["voice"],"summary":"Bridge a call between two numbers","operationId":"post_v1_voice_click_to_call","description":"Requires the `voice:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"voice:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/identity/status":{"get":{"tags":["identity"],"summary":"Verification service status","operationId":"get_v1_identity_status","description":"Requires the `identity:verify` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"identity:verify","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/identity/face-match":{"post":{"tags":["identity"],"summary":"Match two face images","operationId":"post_v1_identity_face_match","description":"Requires the `identity:verify` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"identity:verify","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/wiki/articles":{"get":{"tags":["wiki"],"summary":"List published articles (optional q title/slug search)","operationId":"get_v1_wiki_articles","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}]},"post":{"tags":["wiki"],"summary":"Create article draft (wiki:write)","operationId":"post_v1_wiki_articles","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/wiki/articles/{slug}":{"get":{"tags":["wiki"],"summary":"Get a published article by slug","operationId":"get_v1_wiki_articles_slug","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/wiki/articles/{id}":{"put":{"tags":["wiki"],"summary":"Update or publish article (wiki:write)","operationId":"put_v1_wiki_articles_id","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"delete":{"tags":["wiki"],"summary":"Delete draft or withdrawn article (wiki:write)","operationId":"delete_v1_wiki_articles_id","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/wiki/admin/articles":{"get":{"tags":["wiki"],"summary":"List articles by status including drafts (wiki:write)","operationId":"get_v1_wiki_admin_articles","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/wiki/admin/articles/{id}/versions":{"get":{"tags":["wiki"],"summary":"List article version history (wiki:write)","operationId":"get_v1_wiki_admin_articles_id_versions","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/wiki/admin/articles/{id}/versions/{versionId}":{"get":{"tags":["wiki"],"summary":"Get one article version body (wiki:write)","operationId":"get_v1_wiki_admin_articles_id_versions_versionId","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/wiki/admin/articles/{id}/versions/{versionId}/restore":{"post":{"tags":["wiki"],"summary":"Restore a prior version into a new version (wiki:write)","operationId":"post_v1_wiki_admin_articles_id_versions_versionId_restore","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"versionId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/wiki/sources":{"post":{"tags":["wiki"],"summary":"Register a source URI (wiki:write)","operationId":"post_v1_wiki_sources","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/wiki/sources/{id}":{"get":{"tags":["wiki"],"summary":"Get source + recent snapshots (public)","operationId":"get_v1_wiki_sources_id","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/wiki/sources/{id}/snapshots":{"post":{"tags":["wiki"],"summary":"Capture source snapshot metadata (wiki:write)","operationId":"post_v1_wiki_sources_id_snapshots","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/wiki/entities":{"post":{"tags":["wiki"],"summary":"Create knowledge entity (wiki:write)","operationId":"post_v1_wiki_entities","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/wiki/claims":{"post":{"tags":["wiki"],"summary":"Attach a claim to an entity (wiki:write)","operationId":"post_v1_wiki_claims","description":"Requires the `wiki:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"wiki:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/files/health":{"get":{"tags":["files"],"summary":"Files plane health (public)","operationId":"get_v1_files_health","description":"Requires the `files:write, files:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"files:write, files:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/files/uploads":{"post":{"tags":["files"],"summary":"Start a signed upload session","operationId":"post_v1_files_uploads","description":"Requires the `files:write, files:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"files:write, files:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/files/uploads/{id}/complete":{"post":{"tags":["files"],"summary":"Complete upload and scan","operationId":"post_v1_files_uploads_id_complete","description":"Requires the `files:write, files:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"files:write, files:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/files/objects/{id}":{"get":{"tags":["files"],"summary":"Get object metadata","operationId":"get_v1_files_objects_id","description":"Requires the `files:write, files:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"files:write, files:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/files/objects/{id}/scan":{"post":{"tags":["files"],"summary":"Re-run malware scan (files:write)","operationId":"post_v1_files_objects_id_scan","description":"Requires the `files:write, files:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"files:write, files:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/files/objects/{id}/download-url":{"post":{"tags":["files"],"summary":"Signed download URL when scan is clean","operationId":"post_v1_files_objects_id_download_url","description":"Requires the `files:write, files:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"files:write, files:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/notify/health":{"get":{"tags":["notify"],"summary":"Notify plane health (public)","operationId":"get_v1_notify_health","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/notify/events":{"post":{"tags":["notify"],"summary":"Create a notification event","operationId":"post_v1_notify_events","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/notify/inbox":{"get":{"tags":["notify"],"summary":"List in-app inbox for a user","operationId":"get_v1_notify_inbox","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/notify/unread-count":{"get":{"tags":["notify"],"summary":"Unread count","operationId":"get_v1_notify_unread_count","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/notify/inbox/{id}/read":{"post":{"tags":["notify"],"summary":"Mark one notification read","operationId":"post_v1_notify_inbox_id_read","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/notify/inbox/read-all":{"post":{"tags":["notify"],"summary":"Mark all notifications read","operationId":"post_v1_notify_inbox_read_all","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}},"/v1/notify/preferences":{"get":{"tags":["notify"],"summary":"Get notification preferences","operationId":"get_v1_notify_preferences","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}},"put":{"tags":["notify"],"summary":"Update notification preferences","operationId":"put_v1_notify_preferences","description":"Requires the `notify:write, notify:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"notify:write, notify:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}}}},"/v1/trust/check-url":{"post":{"tags":["trust"],"summary":"Check a URL for threats","operationId":"post_v1_trust_check_url","description":"Requires the `trust:read` scope.","security":[{"bearerAuth":[]},{"apiKeyAuth":[]}],"x-required-scope":"trust:read","responses":{"200":{"description":"Success"},"400":{"description":"The request was rejected (validation)"},"401":{"description":"Missing or invalid API key"},"403":{"description":"The key lacks the required scope"},"429":{"description":"Rate limit exceeded"},"502":{"description":"Upstream service error"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"}}}}}}}}