{"openapi":"3.1.0","info":{"title":"zoomaicapi","version":"0.2.0","description":"OpenAI-compatible wrapper over the private Zoom AI Companion web endpoints. Create an API key from a Zoom browser cookie, then use Bearer auth on the protected endpoints.\n\nEmpirical limit: the private Zoom deep_research mode accepted about 91k words in a single prompt in testing, with first failures appearing around 92k words. This is a product-level observation, not a guaranteed tokenizer or model context limit."},"servers":[{"url":"https://zoomaicapi.asdc.cc"}],"tags":[{"name":"auth"},{"name":"chat"},{"name":"realtime"},{"name":"sessions"},{"name":"meta"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key"}},"schemas":{"CreateApiKeyRequest":{"type":"object","required":["cookie"],"properties":{"label":{"type":"string","example":"work account"},"cookie":{"type":"string","description":"Full cookie header value copied from the Zoom AI Companion browser session.","example":"_zm_lang=en-US; cred=...; ..."}}},"CreateApiKeyResponse":{"type":"object","properties":{"api_key":{"type":"string","example":"zka_0123456789abcdef"},"label":{"type":"string","example":"work account"},"created_at":{"type":"string","format":"date-time"}}},"RealtimeSessionResponse":{"type":"object","properties":{"object":{"type":"string","example":"realtime.transcription.session"},"session_id":{"type":"string","format":"uuid"},"websocket_url":{"type":"string","example":"wss://zoomaicapi.asdc.cc/v1/realtime/transcriptions/ws?api_key=zka_..."},"encoding":{"type":"string","example":"pcm_s16le"},"sample_rate_hz":{"type":"integer","example":16000},"channels":{"type":"integer","example":1},"note":{"type":"string"}}},"ChatCompletionRequest":{"type":"object","required":["model","messages"],"properties":{"model":{"type":"string","enum":["zoom-general","zoom-deep-research","zoom-workflow","zoom-writing","default"],"description":"Use zoom-deep-research for the private deep_research mode. Use zoom-workflow for the workflow mode seen in the Zoom web app HAR. Use zoom-writing for the writing/canvas mode seen in the Zoom web app HAR. Use default for the general mode. Empirical limit: the private Zoom deep_research mode accepted about 91k words in a single prompt in testing, with first failures appearing around 92k words. This is a product-level observation, not a guaranteed tokenizer or model context limit."},"stream":{"type":"boolean","default":false},"metadata":{"type":"object","additionalProperties":true,"properties":{"zoom_session_id":{"type":"string"},"session_id":{"type":"string"},"zoom_selected_entities":{"type":"array","description":"Optional raw Zoom selected_entities objects. Normally you do not need this; image_url content parts are easier.","items":{"type":"object","additionalProperties":true}}}},"messages":{"type":"array","items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["system","user","assistant","tool"]},"content":{"oneOf":[{"type":"string"},{"type":"array","items":{"oneOf":[{"type":"string"},{"type":"object","properties":{"type":{"type":"string","example":"text"},"text":{"type":"string"}}},{"type":"object","properties":{"type":{"type":"string","example":"image_url"},"image_url":{"type":"object","properties":{"url":{"type":"string","description":"Base64 data URL image payload. This wrapper uploads it to Zoom and injects the resulting selected_entities entry."},"name":{"type":"string","description":"Optional filename override for the uploaded image."}}}}}]}}]}}}}}}}},"paths":{"/healthz":{"get":{"tags":["meta"],"summary":"Health check","responses":{"200":{"description":"Service health","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"key_store":{"type":"string"}}}}}}}}},"/v1/models":{"get":{"tags":["meta"],"summary":"List models","responses":{"200":{"description":"Model list"}}}},"/v1/api-keys":{"post":{"tags":["auth"],"summary":"Create API key from Zoom cookie","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}}},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyResponse"}}}}}}},"/v1/chat/completions":{"post":{"tags":["chat"],"summary":"Create chat completion","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequest"}}}},"responses":{"200":{"description":"Chat completion or SSE stream"},"401":{"description":"Missing or invalid API key"}}}},"/v1/realtime/transcriptions/sessions":{"post":{"tags":["realtime"],"summary":"Create client-side live transcription session metadata","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Realtime session bootstrap","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealtimeSessionResponse"}}}}}}},"/zoomaic/sessions":{"get":{"tags":["sessions"],"summary":"List Zoom sessions","security":[{"bearerAuth":[]}],"parameters":[{"in":"query","name":"limit","schema":{"type":"integer","default":50}},{"in":"query","name":"next_offset","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Zoom session list"}}}},"/zoomaic/sessions/{sessionId}":{"delete":{"tags":["sessions"],"summary":"Delete Zoom session","security":[{"bearerAuth":[]}],"parameters":[{"in":"path","name":"sessionId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Delete result"}}}}}}