{"components":{"responses":{"BadRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyErrorResponse"}}},"description":"Bad request."},"Conflict":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyErrorResponse"}}},"description":"Conflict."},"Forbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyErrorResponse"}}},"description":"Forbidden."},"InternalError":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyErrorResponse"}}},"description":"Internal server error."},"NotFound":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyErrorResponse"}}},"description":"Not found."},"RateLimited":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiErrorResponse"}}},"description":"Rate limit or quota exceeded."},"Unauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyErrorResponse"}}},"description":"Missing or invalid API key."}},"schemas":{"PublicConversationContextMember":{"additionalProperties":false,"description":"Public member display fields without private profile data.","properties":{"id":{"description":"Workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"display_name":{"description":"display name.","type":"string","nullable":true},"profile_image_url":{"description":"profile image url.","type":"string","nullable":true},"avatar_asset_key":{"description":"avatar asset key.","type":"string","nullable":true},"handle":{"description":"handle.","type":"string","nullable":true},"avatar_width":{"type":"number","nullable":true,"minimum":0},"avatar_height":{"type":"number","nullable":true,"minimum":0},"avatar_source_kind":{"type":"integer","nullable":true,"enum":[1,2,3]},"member_type":{"type":"integer","enum":[0,1]},"archived_at":{"description":"Member archival timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time","nullable":true},"projection_kind":{"type":"string","enum":["display"]},"is_workspace_agent":{"description":"Workspace agent identity.","type":"boolean"},"is_connected_app":{"description":"Connected app identity.","type":"boolean"},"is_guest":{"description":"Guest identity.","type":"boolean"},"connected_app_key":{"description":"Connected app preset key.","type":"string"},"claim_status":{"type":"string","nullable":true,"enum":["claimed","unclaimed"]},"source_kind":{"type":"string","nullable":true,"enum":["ando","slack_import","slack_sync"]}},"required":["id","display_name","profile_image_url","avatar_asset_key","avatar_width","avatar_height","avatar_source_kind","member_type","archived_at","projection_kind"],"type":"object"},"PublicConversationContextResult":{"additionalProperties":false,"description":"Bounded conversation context for an authorized current member. Internal buffers and memory fields are excluded.","properties":{"id":{"description":"id.","type":"string"},"name":{"description":"name.","type":"string"},"workspace_id":{"description":"workspace id.","type":"string"},"description":{"description":"description.","type":"string","nullable":true},"everyone_member_group_id":{"description":"everyone member group id.","type":"string","nullable":true},"summary_text":{"description":"summary text.","type":"string","nullable":true},"creator_member_id":{"description":"creator member id.","type":"string","nullable":true},"slack_channel_id":{"description":"slack channel id.","type":"string","nullable":true},"last_message_preview":{"description":"last message preview.","type":"string","nullable":true},"last_message_author_id":{"description":"last message author id.","type":"string","nullable":true},"last_message_id":{"description":"last message id.","type":"string","nullable":true},"canonical_name":{"description":"canonical name.","type":"string","nullable":true},"local_alias":{"description":"local alias.","type":"string","nullable":true},"human_members_count":{"description":"human members count.","type":"integer","minimum":0},"agent_members_count":{"description":"agent members count.","type":"integer","minimum":0},"created_at":{"description":"created at.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"updated_at":{"description":"updated at.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"archived_at":{"description":"archived at.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time","nullable":true},"last_message_at":{"description":"last message at.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time","nullable":true},"last_summary_at":{"description":"last summary at.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time","nullable":true},"preview_member_ids":{"description":"Preview workspace membership identifiers.","items":{"description":"Workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":"array"},"preview_members":{"description":"Preview member displays.","items":{"$ref":"#/components/schemas/PublicConversationContextMember"},"type":"array"},"creator_member":{"allOf":[{"$ref":"#/components/schemas/PublicConversationContextMember"}],"nullable":true},"type":{"type":"integer","enum":[0,1,2]},"origin":{"type":"integer","enum":[0,1,2]},"access_control_type":{"type":"integer","enum":[0,1]},"sync_enabled":{"description":"Whether Slack synchronization is enabled.","type":"boolean"},"is_hidden":{"type":"boolean","nullable":true}},"required":["id","name","workspace_id","description","everyone_member_group_id","summary_text","creator_member_id","slack_channel_id","human_members_count","agent_members_count","created_at","updated_at","archived_at","last_message_at","last_summary_at","preview_member_ids","preview_members","creator_member","type","origin","access_control_type","sync_enabled"],"type":"object"},"PublicConversationContextResponse":{"additionalProperties":false,"description":"Authorized conversation context response.","properties":{"data":{"$ref":"#/components/schemas/PublicConversationContextResult"}},"required":["data"],"type":"object"},"CardDocument":{"type":"object","properties":{"version":{"type":"integer","enum":[1]},"title":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"subtitle":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"titleDisplay":{"type":"string","enum":["visible","accessible"]},"width":{"type":"string","enum":["content","wide"]},"frame":{"type":"string","enum":["card","none"]},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/CardBlock"},"minItems":0,"maxItems":1024},"headerActions":{"$ref":"#/components/schemas/CardActions"}},"required":["version","title","blocks"],"additionalProperties":false,"description":"Version-1 declarative Ando card. Runtime also enforces global ID uniqueness, nesting <=6, <=1024 total blocks, <=512 KiB JSON, valid HTTP(S) URLs, table row widths, selected option membership, increasing chart times, matching series lengths and sufficient known measurements. Percentage charts use 0–100. Resources require a title unless loading=true."},"CardBlock":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."}},"required":["type","id","label","url"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"text":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"style":{"type":"string","enum":["body","caption","code"]},"tooltip":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"role":{"type":"string","enum":["status","alert"]},"accessibleLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"}},"required":["type","id","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["heading"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"text":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"}},"required":["type","id","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["context"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"items":{"type":"array","items":{"$ref":"#/components/schemas/CardInline"},"minItems":1,"maxItems":32},"tooltip":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"}},"required":["type","id","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["facts"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"presentation":{"type":"string","enum":["list","stats"]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"value":{"type":"array","items":{"$ref":"#/components/schemas/CardInline"},"minItems":1,"maxItems":32},"caption":{"type":"array","items":{"$ref":"#/components/schemas/CardInline"},"minItems":1,"maxItems":32}},"required":["label","value"],"additionalProperties":false},"minItems":0,"maxItems":100}},"required":["type","id","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["image"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"alt":{"type":"string","maxLength":2000},"presentation":{"type":"string","enum":["thumbnail","content","cover"]},"aspect":{"type":"number","minimum":0.1,"maximum":10,"description":"Image width divided by image height."}},"required":["type","id","url","alt"],"additionalProperties":false},{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"presentation":{"type":"string","enum":["rows"]},"status":{"type":"string","enum":["closed"]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"description":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"accessibleLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"selected":{"type":"boolean"},"count":{"type":"integer","minimum":0,"maximum":1000000000},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":20}},"required":["type","id","presentation","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"presentation":{"type":"string","enum":["footer"]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["refresh"]},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."},"variant":{"type":"string","enum":["ghost","primary","secondary"]}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":8}},"required":["type","id","presentation","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["refresh"]},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":8},"overflowLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"}},"required":["type","id","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["refresh"]},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."}},"required":["id","label"],"additionalProperties":false},"minItems":0,"maxItems":100},"menuLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"}},"required":["type","id","items","menuLabel"],"additionalProperties":false}]},{"type":"object","properties":{"type":{"type":"string","enum":["group"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"layout":{"type":"string","enum":["stack","columns"]},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/CardBlock"},"minItems":0,"maxItems":1024}},"required":["type","id","layout","blocks"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["disclosure"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/CardBlock"},"minItems":0,"maxItems":1024}},"required":["type","id","label","blocks"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["collection"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"emptyMessage":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"ordered":{"type":"boolean"},"presentation":{"type":"string","enum":["scroll"]},"approximate":{"type":"boolean"},"itemNoun":{"type":"string","maxLength":100,"minLength":1,"pattern":"\\S"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"blocks":{"type":"array","items":{"$ref":"#/components/schemas/CardBlock"},"minItems":0,"maxItems":1024}},"required":["id","blocks"],"additionalProperties":false},"minItems":0,"maxItems":100}},"required":["type","id","label","emptyMessage","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["table"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"columns":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"align":{"type":"string","enum":["start","end"]},"format":{"$ref":"#/components/schemas/CardNumberFormat"}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":16},"rows":{"type":"array","items":{"type":"array","items":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"minItems":1,"maxItems":16},"minItems":0,"maxItems":100},"emptyMessage":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"}},"required":["type","id","label","columns","rows","emptyMessage"],"additionalProperties":false},{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["chart"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"title":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"summary":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"mark":{"type":"string","enum":["bar"]},"axis":{"type":"object","properties":{"kind":{"type":"string","enum":["category"]},"values":{"type":"array","items":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"minItems":1,"maxItems":128,"uniqueItems":true}},"required":["kind","values"],"additionalProperties":false},"unit":{"type":"string","maxLength":100,"minLength":1,"pattern":"\\S"},"format":{"$ref":"#/components/schemas/CardNumberFormat"},"series":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"values":{"type":"array","items":{"oneOf":[{"type":"number","minimum":-1000000000000,"maximum":1000000000000},{"type":"string","nullable":true,"enum":[null]}]},"minItems":1,"maxItems":128}},"required":["id","label","values"],"additionalProperties":false},"minItems":1,"maxItems":6}},"required":["type","id","title","summary","mark","axis","unit","series"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["chart"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"title":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"summary":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"mark":{"type":"string","enum":["line"]},"axis":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["time"]},"values":{"type":"array","items":{"type":"integer","minimum":-8640000000000000,"maximum":8640000000000000},"minItems":2,"maxItems":128,"uniqueItems":true}},"required":["kind","values"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["category"]},"values":{"type":"array","items":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"minItems":2,"maxItems":128,"uniqueItems":true}},"required":["kind","values"],"additionalProperties":false}]},"unit":{"type":"string","maxLength":100,"minLength":1,"pattern":"\\S"},"format":{"$ref":"#/components/schemas/CardNumberFormat"},"series":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"values":{"type":"array","items":{"oneOf":[{"type":"number","minimum":-1000000000000,"maximum":1000000000000},{"type":"string","nullable":true,"enum":[null]}]},"minItems":2,"maxItems":128}},"required":["id","label","values"],"additionalProperties":false},"minItems":1,"maxItems":6}},"required":["type","id","title","summary","mark","axis","unit","series"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["chart"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"title":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"summary":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"mark":{"type":"string","enum":["area"]},"axis":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["time"]},"values":{"type":"array","items":{"type":"integer","minimum":-8640000000000000,"maximum":8640000000000000},"minItems":2,"maxItems":128,"uniqueItems":true}},"required":["kind","values"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["category"]},"values":{"type":"array","items":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"minItems":2,"maxItems":128,"uniqueItems":true}},"required":["kind","values"],"additionalProperties":false}]},"unit":{"type":"string","maxLength":100,"minLength":1,"pattern":"\\S"},"format":{"$ref":"#/components/schemas/CardNumberFormat"},"series":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"values":{"type":"array","items":{"oneOf":[{"type":"number","minimum":0,"maximum":1000000000000},{"type":"string","nullable":true,"enum":[null]}]},"minItems":2,"maxItems":128}},"required":["id","label","values"],"additionalProperties":false},"minItems":1,"maxItems":1}},"required":["type","id","title","summary","mark","axis","unit","series"],"additionalProperties":false}]},{"type":"object","properties":{"type":{"type":"string","enum":["text_input"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"value":{"type":"string","maxLength":2000},"submitLabel":{"type":"string","maxLength":100,"minLength":1,"pattern":"\\S"}},"required":["type","id","label","value","submitLabel"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["secret_input"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"submitLabel":{"type":"string","maxLength":100,"minLength":1,"pattern":"\\S"},"companionLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"status":{"type":"string","enum":["saved","verified"]},"companionValue":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"}},"required":["type","id","label","submitLabel"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["checkbox"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"value":{"type":"boolean"}},"required":["type","id","label","value"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["select"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"value":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"accessibleLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"options":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"}},"required":["value","label"],"additionalProperties":false},"minItems":1,"maxItems":100}},"required":["type","id","label","value","options"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["resource"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"title":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"loading":{"type":"boolean"},"subtitle":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"body":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"bodyStyle":{"type":"string","enum":["preview"]},"accessibleLabel":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"metadata":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"tooltip":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["status"]},"text":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"tone":{"type":"string","enum":["brand","neutral","muted","success","warning","danger"]}},"required":["type","text","tone"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["time"]},"timestamp":{"type":"integer","minimum":-8640000000000000,"maximum":8640000000000000},"format":{"type":"string","enum":["relative","absolute"]}},"required":["type","timestamp","format"],"additionalProperties":false}]},"minItems":1,"maxItems":32},"image":{"type":"object","properties":{"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"alt":{"type":"string","maxLength":2000},"presentation":{"type":"string","enum":["thumbnail","content","cover"]},"aspect":{"type":"number","minimum":0.1,"maximum":10,"description":"Image width divided by image height."}},"required":["url","alt"],"additionalProperties":false},"links":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"text":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"accessibleLabel":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["spotify","bandcamp","google_maps"]}},"required":["type","text","url"],"additionalProperties":false},"minItems":0,"maxItems":8},"audio":{"type":"object","properties":{"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"label":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"}},"required":["url","label"],"additionalProperties":false},"avatarUrl":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"media":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["photos"]},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"alt":{"type":"string","maxLength":2000},"aspect":{"type":"number","minimum":0.1,"maximum":10,"description":"Image width divided by image height."}},"required":["url","alt"],"additionalProperties":false},"minItems":1,"maxItems":4}},"required":["kind","images"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["video_poster"]},"images":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"alt":{"type":"string","maxLength":2000},"aspect":{"type":"number","minimum":0.1,"maximum":10,"description":"Image width divided by image height."}},"required":["url","alt"],"additionalProperties":false},"minItems":1,"maxItems":1},"videoUrl":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."}},"required":["kind","images"],"additionalProperties":false}]},"quote":{"type":"object","properties":{"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"title":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"subtitle":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"avatarUrl":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"body":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"image":{"type":"object","properties":{"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"alt":{"type":"string","maxLength":2000},"aspect":{"type":"number","minimum":0.1,"maximum":10,"description":"Image width divided by image height."}},"required":["url","alt"],"additionalProperties":false}},"required":["url","title"],"additionalProperties":false}},"required":["type","id","url"],"additionalProperties":false}]},"CardInline":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"tooltip":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"text":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"address":{"type":"string","maxLength":254,"minLength":1,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"}},"required":["type","text","address"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["link"]},"text":{"type":"string","maxLength":16384,"minLength":1,"pattern":"\\S"},"url":{"type":"string","maxLength":8192,"pattern":"^[Hh][Tt][Tt][Pp][Ss]?://[^\\s\\u0000-\\u0020\\u007f]+$","description":"Absolute HTTP(S) URL without credentials. The runtime URL parser also validates the destination syntax."},"accessibleLabel":{"type":"string","maxLength":500,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["spotify","bandcamp","google_maps"]}},"required":["type","text","url"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["status"]},"text":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"tone":{"type":"string","enum":["brand","neutral","muted","success","warning","danger"]}},"required":["type","text","tone"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["time"]},"timestamp":{"type":"integer","minimum":-8640000000000000,"maximum":8640000000000000},"format":{"type":"string","enum":["relative","absolute"]}},"required":["type","timestamp","format"],"additionalProperties":false}]},"CardNumberFormat":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["number"]},"maximumFractionDigits":{"type":"integer","minimum":0,"maximum":6}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["duration_ms","percent"]}},"required":["kind"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","enum":["currency"]},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["kind","currency"],"additionalProperties":false}]},"CardActions":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"presentation":{"type":"string","enum":["rows"]},"status":{"type":"string","enum":["closed"]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"description":{"type":"string","maxLength":2000,"minLength":1,"pattern":"\\S"},"accessibleLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"selected":{"type":"boolean"},"count":{"type":"integer","minimum":0,"maximum":1000000000},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":20}},"required":["type","id","presentation","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"presentation":{"type":"string","enum":["footer"]},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["refresh"]},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."},"variant":{"type":"string","enum":["ghost","primary","secondary"]}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":8}},"required":["type","id","presentation","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["refresh"]},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."}},"required":["id","label"],"additionalProperties":false},"minItems":1,"maxItems":8},"overflowLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"}},"required":["type","id","items"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["actions"]},"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","maxLength":200,"minLength":1,"pattern":"\\S"},"label":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"},"icon":{"type":"string","enum":["refresh"]},"input":{"type":"object","maxProperties":16,"additionalProperties":{"oneOf":[{"type":"string","maxLength":16384},{"type":"number"},{"type":"boolean"},{"type":"string","nullable":true,"enum":[null]}]},"description":"Scalar host input only. Reserved keys __proto__, prototype and constructor are rejected."}},"required":["id","label"],"additionalProperties":false},"minItems":0,"maxItems":100},"menuLabel":{"type":"string","maxLength":300,"minLength":1,"pattern":"\\S"}},"required":["type","id","items","menuLabel"],"additionalProperties":false}]},"ApiKey":{"additionalProperties":false,"description":"Reveal-safe API key metadata. The secret is only returned by issue and rotate responses.","properties":{"id":{"description":"Stable API key identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"key_prefix":{"description":"Non-secret prefix for operator recognition.","type":"string"},"name":{"description":"Optional operator-facing key label.","type":"string","nullable":true},"scopes":{"description":"Exact scopes granted to the key.","items":{"type":"string","enum":["calls:read","conversations:create","conversation_memberships:write","files:read","files:write","profile:write","context:self-introduction","inbox:read","inbox:write","connections:read","connections:write","connections:execute","miniapps:read","miniapps:write","documents:read","documents:write","automations:read","automations:write","members:invite","tasks:read","tasks:contribute","tasks:coordinate","tasks:complete","agents:read","agents:write","messages:read","messages:write","realtime:read","webhooks:read","webhooks:write","api_keys:read","api_keys:write","imports:write"]},"type":"array"},"status":{"description":"Credential lifecycle status.","enum":["active","disabled","revoked"],"type":"string"},"subject":{"$ref":"#/components/schemas/ApiKeySubject"}},"required":["id","key_prefix","name","scopes","status","subject"],"type":"object"},"ApiKeyIssueBody":{"additionalProperties":false,"description":"Issues an exact-scope credential for a new named agent or an existing workspace member. api_keys administration scopes cannot be delegated.","properties":{"name":{"description":"Optional operator-facing key label.","type":"string","nullable":true},"scopes":{"description":"Exact non-administrative scopes to grant.","items":{"type":"string","enum":["calls:read","conversations:create","conversation_memberships:write","files:read","files:write","profile:write","context:self-introduction","inbox:read","inbox:write","connections:read","connections:write","connections:execute","miniapps:read","miniapps:write","documents:read","documents:write","automations:read","automations:write","members:invite","tasks:read","tasks:contribute","tasks:coordinate","tasks:complete","agents:read","agents:write","messages:read","messages:write","realtime:read","webhooks:read","webhooks:write"]},"type":"array"},"subject":{"description":"Identity the new credential will act as.","discriminator":{"propertyName":"kind"},"oneOf":[{"additionalProperties":false,"description":"Create a new named agent identity.","properties":{"display_name":{"description":"Unique agent display name.","type":"string"},"kind":{"description":"Subject kind.","enum":["new_agent"],"type":"string"},"role_name":{"description":"Optional role label.","type":"string","nullable":true}},"required":["display_name","kind","role_name"],"type":"object"},{"additionalProperties":false,"description":"Bind the credential to an existing workspace member.","properties":{"kind":{"description":"Subject kind.","enum":["workspace_member"],"type":"string"},"workspace_membership_id":{"description":"Existing workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["kind","workspace_membership_id"],"type":"object"}]}},"required":["name","scopes","subject"],"type":"object"},"ApiKeyListResponse":{"additionalProperties":false,"description":"Workspace API key metadata response. Secrets are never included.","properties":{"data":{"additionalProperties":false,"description":"API key list data.","properties":{"items":{"description":"API keys.","items":{"$ref":"#/components/schemas/ApiKey"},"type":"array"},"page_info":{"additionalProperties":false,"description":"Opaque cursor pagination metadata.","properties":{"has_next_page":{"description":"Whether another page of API keys is available.","type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page, or null when complete.","type":"string","nullable":true}},"required":["has_next_page","next_cursor"],"type":"object"}},"required":["items","page_info"],"type":"object"}},"required":["data"],"type":"object"},"ApiKeyResponse":{"additionalProperties":false,"description":"API key metadata response.","properties":{"data":{"additionalProperties":false,"description":"API key data.","properties":{"key":{"$ref":"#/components/schemas/ApiKey"}},"required":["key"],"type":"object"}},"required":["data"],"type":"object"},"ApiKeyRotateBody":{"additionalProperties":false,"description":"Atomically replaces an API key secret. Omitted label and scope fields retain their current values.","properties":{"name":{"description":"Replacement operator-facing key label.","type":"string","nullable":true},"scopes":{"description":"Exact replacement non-administrative scopes.","items":{"type":"string","enum":["calls:read","conversations:create","conversation_memberships:write","files:read","files:write","profile:write","context:self-introduction","inbox:read","inbox:write","connections:read","connections:write","connections:execute","miniapps:read","miniapps:write","documents:read","documents:write","automations:read","automations:write","members:invite","tasks:read","tasks:contribute","tasks:coordinate","tasks:complete","agents:read","agents:write","messages:read","messages:write","realtime:read","webhooks:read","webhooks:write"]},"type":"array"}},"type":"object"},"ApiKeySecretResponse":{"additionalProperties":false,"description":"API key response that reveals the new secret exactly once.","properties":{"data":{"additionalProperties":false,"description":"New credential data.","properties":{"key":{"$ref":"#/components/schemas/ApiKey"},"secret":{"description":"New API key secret. Store it immediately; it cannot be read later.","type":"string"}},"required":["key","secret"],"type":"object"}},"required":["data"],"type":"object"},"ApiKeySubject":{"additionalProperties":false,"description":"Workspace identity the credential acts as.","properties":{"display_name":{"description":"Current subject display name.","type":"string","nullable":true},"principal_type":{"description":"Subject principal type.","enum":["agent","user"],"type":"string"},"workspace_membership_id":{"description":"Subject workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["display_name","principal_type","workspace_membership_id"],"type":"object"},"Agent":{"additionalProperties":false,"description":"A workspace agent's lifecycle projection. The agent's own credential is never returned.","properties":{"object":{"description":"Always \"agent\".","type":"string","enum":["agent"]},"id":{"description":"Agent workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"display_name":{"description":"Agent display name.","type":"string"},"role_name":{"description":"Optional role label.","type":"string","nullable":true},"model_id":{"description":"Model identifier the agent runs on.","type":"string"},"response_scope":{"description":"Whether the agent responds workspace-wide or only to its creator.","enum":["workspace","personal"],"type":"string"},"status":{"description":"Derived lifecycle status over activation and archival.","enum":["active","paused","archived"],"type":"string"},"is_workspace_agent":{"description":"Whether this is the workspace's built-in agent.","type":"boolean"},"avatar_url":{"description":"Avatar URL, or null when unset.","type":"string","nullable":true},"created_by":{"additionalProperties":false,"description":"The member who created the agent.","properties":{"id":{"description":"Creator workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"display_name":{"description":"Creator display name.","type":"string","nullable":true}},"required":["id","display_name"],"type":"object","nullable":true},"created_at":{"description":"Creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"updated_at":{"description":"Last update timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"}},"required":["object","id","display_name","role_name","model_id","response_scope","status","is_workspace_agent","avatar_url","created_by","created_at","updated_at"],"type":"object"},"AgentListResponse":{"additionalProperties":false,"description":"Agent list response.","properties":{"data":{"additionalProperties":false,"description":"Agent list data.","properties":{"items":{"description":"Agents.","items":{"$ref":"#/components/schemas/Agent"},"type":"array"}},"required":["items"],"type":"object"}},"required":["data"],"type":"object"},"AgentResponse":{"additionalProperties":false,"description":"Agent response.","properties":{"data":{"$ref":"#/components/schemas/Agent"}},"required":["data"],"type":"object"},"CallParticipant":{"additionalProperties":false,"description":"A participant in a call.","properties":{"id":{"description":"Participant workspace member identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"name":{"description":"Display name.","type":"string","nullable":true}},"required":["id","name"],"type":"object"},"CallResponse":{"additionalProperties":false,"description":"Call detail response.","properties":{"chapters":{"description":"Call summary chapters.","items":{"$ref":"#/components/schemas/CallTranscriptChapter"},"type":"array"},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"duration_seconds":{"description":"Call duration in seconds.","type":"number","nullable":true},"ended_at":{"description":"Call end timestamp.","type":"string","format":"date-time","nullable":true},"id":{"description":"Call identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"participants":{"description":"Call participants.","items":{"$ref":"#/components/schemas/CallParticipant"},"type":"array"},"started_at":{"description":"Call start timestamp.","type":"string","format":"date-time","nullable":true},"status":{"description":"Call status.","type":"string"},"summary":{"description":"Call summary markdown.","type":"string","nullable":true}},"required":["id","conversation_id","conversation_name","status","duration_seconds","participants","summary","chapters","started_at","ended_at"],"type":"object"},"CallResult":{"additionalProperties":false,"description":"Search result for a call.","properties":{"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"duration_seconds":{"description":"Call duration in seconds.","type":"number","nullable":true},"ended_at":{"description":"Call end timestamp.","type":"string","format":"date-time","nullable":true},"id":{"description":"Call identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"participant_count":{"description":"Number of call participants.","type":"integer"},"participant_names":{"description":"Participant display names.","items":{"description":"Name.","type":"string"},"type":"array"},"started_at":{"description":"Call start timestamp.","type":"string","format":"date-time","nullable":true},"status":{"description":"Call status.","type":"string"},"summary":{"description":"Call summary markdown.","type":"string","nullable":true}},"required":["id","conversation_id","conversation_name","status","duration_seconds","participant_names","participant_count","summary","started_at","ended_at"],"type":"object"},"CallTranscriptChapter":{"additionalProperties":false,"description":"A summary chapter for a call transcript.","properties":{"content":{"description":"Chapter content.","type":"string"},"end_ms":{"description":"Chapter end offset in milliseconds.","type":"integer"},"start_ms":{"description":"Chapter start offset in milliseconds.","type":"integer"},"title":{"description":"Chapter title.","type":"string"}},"required":["title","content","start_ms","end_ms"],"type":"object"},"CallTranscriptResponse":{"additionalProperties":false,"description":"Current call transcript compatibility response.","properties":{"call_id":{"description":"Call identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"duration_seconds":{"description":"Call duration in seconds.","type":"number","nullable":true},"pageInfo":{"$ref":"#/components/schemas/LegacyPageInfo"},"segments":{"description":"Transcript segments.","items":{"$ref":"#/components/schemas/CallTranscriptSegment"},"type":"array"}},"required":["call_id","conversation_name","duration_seconds","segments","pageInfo"],"type":"object"},"CallTranscriptSegment":{"additionalProperties":false,"description":"A transcript segment.","properties":{"content":{"description":"Transcript text.","type":"string"},"end_ms":{"description":"Segment end offset in milliseconds.","type":"integer"},"speaker_name":{"description":"Speaker display name.","type":"string","nullable":true},"start_ms":{"description":"Segment start offset in milliseconds.","type":"integer"}},"required":["speaker_name","content","start_ms","end_ms"],"type":"object"},"OpenRealtimeConnectionRequest":{"additionalProperties":false,"description":"Public realtime connection-opening request.","properties":{"resume_from":{"$ref":"#/components/schemas/RealtimeResumeRequest"},"subscriptions":{"description":"Realtime subscriptions to authorize for this connection.","items":{"$ref":"#/components/schemas/RealtimeConnectionSubscriptionRequest"},"type":"array","minItems":1,"maxItems":1}},"type":"object"},"OpenRealtimeConnectionResponse":{"additionalProperties":false,"description":"Temporary public realtime websocket connection details.","properties":{"approximate_connection_time_seconds":{"description":"Approximate maximum connection lifetime in seconds. Resume near a cursor deadline can shorten it.","type":"number","nullable":true},"connection_id":{"description":"Realtime connection identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"expires_at":{"description":"Timestamp when the returned connection URL expires if unused. Resume near a cursor deadline can shorten the normal URL lifetime.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"expires_in_seconds":{"description":"Seconds until the returned connection URL expires if unused, capped by any resume-cursor deadline.","type":"integer","minimum":1},"heartbeat_interval_seconds":{"description":"Recommended heartbeat interval for the socket.","type":"integer","minimum":1},"protocol":{"description":"Required websocket subprotocol.","enum":["ando.realtime.v1"],"type":"string"},"resume_supported":{"description":"Whether bounded resume is supported for this connection.","type":"boolean"},"resume_cursor":{"description":"Safe cursor for the connection's initial ledger floor. Persist it before opening the websocket, then replace it only after the server confirms an ordered acknowledgement or sends a planned-disconnect checkpoint.","type":"string","minLength":1,"maxLength":4096},"subscription_source":{"description":"Whether the canonical subscription was explicit or synthesized from external-agent Notify.","enum":["explicit","agent_wake"],"type":"string"},"effective_wake_policy":{"description":"Current external-agent Notify ceiling. Null for a human member principal.","enum":["mentions_and_direct_messages","mentions_only","all_messages","disabled"],"type":"string","nullable":true},"subscriptions":{"description":"Canonical subscriptions authorized for the socket.","items":{"$ref":"#/components/schemas/RealtimeConnectionSubscription"},"type":"array","minItems":1,"maxItems":1},"url":{"description":"Temporary pre-authorized websocket URL. Treat the ticket query parameter as secret.","type":"string"}},"required":["url","expires_at","expires_in_seconds","connection_id","protocol","heartbeat_interval_seconds","approximate_connection_time_seconds","resume_supported","resume_cursor","subscription_source","effective_wake_policy","subscriptions"],"type":"object"},"RealtimeAckError":{"additionalProperties":false,"description":"Client-side processing error attached to an acknowledgement.","properties":{"code":{"description":"Machine-readable acknowledgement error code.","type":"string","minLength":1,"maxLength":64},"message":{"description":"Human-readable acknowledgement error message.","type":"string","maxLength":512}},"required":["code"],"type":"object"},"RealtimeAckFrame":{"additionalProperties":false,"description":"Client acknowledgement frame for one realtime event envelope.","properties":{"envelope_id":{"description":"Realtime delivery envelope identifier.","type":"string","minLength":1,"maxLength":128},"error":{"$ref":"#/components/schemas/RealtimeAckError"}},"required":["envelope_id"],"type":"object"},"RealtimeAcknowledgedFrame":{"additionalProperties":false,"description":"Server confirmation that an ordered acknowledgement was accepted and the durable resume cursor may advance.","properties":{"envelope_id":{"description":"Acknowledged realtime envelope identifier.","type":"string","minLength":1,"maxLength":128},"resume_cursor":{"description":"Safe resume cursor through the acknowledged envelope.","type":"string","minLength":1,"maxLength":4096},"type":{"description":"Frame type.","enum":["acknowledged"],"type":"string"}},"required":["type","envelope_id","resume_cursor"],"type":"object"},"RealtimeConnectionSubscription":{"additionalProperties":false,"description":"Canonical realtime subscription authorized by the API.","properties":{"delivery":{"$ref":"#/components/schemas/RealtimeDelivery"},"events":{"description":"ProductEvent types delivered on this subscription.","items":{"$ref":"#/components/schemas/RealtimeEventType"},"type":"array","minItems":0,"maxItems":2,"uniqueItems":true},"id":{"description":"Realtime subscription identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"target":{"$ref":"#/components/schemas/RealtimeObjectTarget"}},"required":["id","target","delivery","events"],"type":"object","oneOf":[{"properties":{"delivery":{"enum":["messages"]},"events":{"minItems":1}}},{"properties":{"delivery":{"enum":["inbox"]},"events":{"maxItems":0}}}]},"RealtimeConnectionSubscriptionRequest":{"additionalProperties":false,"description":"Realtime subscription requested while opening a connection.","properties":{"delivery":{"$ref":"#/components/schemas/RealtimeDelivery"},"events":{"description":"ProductEvent types requested for this subscription.","items":{"$ref":"#/components/schemas/RealtimeEventType"},"type":"array","minItems":0,"maxItems":2,"uniqueItems":true},"target":{"$ref":"#/components/schemas/RealtimeTarget"}},"required":["target","delivery","events"],"type":"object","oneOf":[{"properties":{"delivery":{"enum":["messages"]},"events":{"minItems":1}}},{"properties":{"delivery":{"enum":["inbox"]},"events":{"maxItems":0}}}]},"RealtimeDelivery":{"description":"Realtime delivery filter. \"messages\" delivers readable conversation-scoped ProductEvents; \"inbox\" delivers agent pending-work snapshots with an empty events array.","enum":["messages","inbox"],"type":"string"},"RealtimeEventDeliveryContext":{"additionalProperties":false,"description":"Subscriber-specific delivery metadata for this realtime event frame.","properties":{"delivery":{"description":"Message event delivery.","enum":["messages"],"type":"string"},"delivery_reason":{"description":"Why this subscription received the messaging event.","enum":["message"],"type":"string"}},"required":["delivery","delivery_reason"],"type":"object"},"RealtimeDisconnectFrame":{"additionalProperties":false,"description":"Server frame sent before a planned realtime socket close when possible.","properties":{"reason":{"description":"Realtime disconnect reason.","enum":["deploy_draining","connection_max_age","backpressure","temporary_unavailable","policy_violation"],"type":"string"},"retry_after_seconds":{"description":"Recommended delay before reconnecting.","type":"integer","minimum":0},"resume_cursor":{"description":"Safe checkpoint through which the server has no unacknowledged deliveries. Persist it before reconnecting when present.","type":"string","minLength":1,"maxLength":4096},"type":{"description":"Frame type.","enum":["disconnect"],"type":"string"}},"required":["type","reason"],"type":"object"},"RealtimeEventFrame":{"additionalProperties":false,"description":"Server delivery frame containing one public ProductEvent envelope of at most 262144 bytes (256 KiB). Clients must accept complete frames up to 524288 bytes (512 KiB).","properties":{"accepts_response_payload":{"description":"Whether the server accepts a response payload. The initial protocol only supports acknowledgement.","enum":[false],"type":"boolean"},"cursor":{"description":"Resume cursor associated with this delivery.","type":"string","minLength":1,"maxLength":4096},"delivery_context":{"$ref":"#/components/schemas/RealtimeEventDeliveryContext"},"envelope_id":{"description":"Unique websocket delivery attempt identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","minLength":1,"maxLength":128},"payload":{"$ref":"#/components/schemas/RealtimeProductEventEnvelope"},"subscription_id":{"description":"Subscription that received this event.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":{"description":"Frame type.","enum":["event"],"type":"string"}},"required":["type","envelope_id","accepts_response_payload","subscription_id","cursor","delivery_context","payload"],"type":"object"},"RealtimeEventType":{"description":"ProductEvent type available on public realtime sockets.","enum":["message.created","message.updated"],"type":"string"},"RealtimeHelloFrame":{"additionalProperties":false,"description":"Server hello frame sent after a realtime socket connects.","properties":{"connection_id":{"description":"Realtime connection identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"heartbeat_interval_seconds":{"description":"Recommended heartbeat interval for the socket.","type":"integer","minimum":1},"resume_supported":{"description":"Whether bounded resume is supported for this connection.","type":"boolean"},"subscriptions":{"description":"Canonical subscriptions authorized for this socket.","items":{"$ref":"#/components/schemas/RealtimeConnectionSubscription"},"type":"array","minItems":1,"maxItems":1},"type":{"description":"Frame type.","enum":["hello"],"type":"string"}},"required":["type","connection_id","heartbeat_interval_seconds","resume_supported","subscriptions"],"type":"object"},"RealtimeObjectTarget":{"additionalProperties":false,"description":"Canonical realtime target resolved by the API. The initial release returns workspace membership targets only.","properties":{"id":{"description":"Target identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":{"description":"Target type.","enum":["workspace_membership"],"type":"string"}},"required":["type","id"],"type":"object"},"ProductEventRelatedIds":{"additionalProperties":false,"description":"Related resource identifiers for authorization, routing, and debugging.","properties":{"call_id":{"description":"Related call identifier.","type":"string","minLength":1,"nullable":true},"conversation_id":{"description":"Related conversation identifier.","type":"string","minLength":1,"nullable":true},"message_id":{"description":"Related message identifier.","type":"string","minLength":1,"nullable":true},"thread_root_message_id":{"description":"Related thread root message identifier.","type":"string","minLength":1,"nullable":true}},"required":["conversation_id","message_id","thread_root_message_id","call_id"],"type":"object"},"RealtimeProductEventRelatedIds":{"additionalProperties":false,"description":"Related resource identifiers for authorization, routing, and debugging.","properties":{"call_id":{"description":"Related call identifier.","type":"string","minLength":1,"nullable":true},"conversation_id":{"description":"Related conversation identifier.","type":"string","minLength":1,"nullable":true},"message_id":{"description":"Related message identifier.","type":"string","minLength":1,"nullable":true},"thread_root_message_id":{"description":"Related thread root message identifier.","type":"string","minLength":1,"nullable":true}},"required":["conversation_id","message_id","thread_root_message_id","call_id"],"type":"object"},"ConversationMembershipCreatedWebhookObject":{"additionalProperties":false,"description":"Conversation membership created by this event.","properties":{"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"created_at":{"description":"Membership creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"id":{"description":"Conversation membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"member":{"$ref":"#/components/schemas/MemberResult"},"member_id":{"description":"Workspace membership identifier. Deprecated: read workspace_membership_id instead.","type":"string","nullable":true,"deprecated":true},"object":{"description":"Object type.","enum":["conversation_membership"],"type":"string"},"workspace_membership_id":{"description":"Canonical workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","conversation_id","workspace_membership_id","member","created_at"],"type":"object"},"QuestionAnsweredProductEventObject":{"additionalProperties":false,"description":"An attributed answer submitted from a question card, without a chat reply.","properties":{"release_id":{"description":"Immutable question release.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"generation":{"type":"integer","minimum":0},"action_id":{"description":"Submitted action identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"option_id":{"description":"Stable selected option identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"question_revision":{"description":"Question message revision at acceptance.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"question":{"description":"Question text at acceptance.","type":"string","minLength":1},"installation_id":{"description":"Question installation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"question_message_id":{"description":"Original question message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"answering_workspace_membership_id":{"description":"Human who answered.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"recipient_workspace_membership_id":{"description":"Agent who asked.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"label":{"description":"Selected option as plain text.","type":"string","minLength":1},"created_at":{"description":"Answer timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"}},"required":["release_id","generation","action_id","option_id","question_revision","question","installation_id","question_message_id","conversation_id","answering_workspace_membership_id","recipient_workspace_membership_id","label","created_at"],"type":"object"},"WebhookQuestionAnsweredEventData":{"additionalProperties":false,"description":"Question response event data.","properties":{"object":{"$ref":"#/components/schemas/QuestionAnsweredProductEventObject"}},"required":["object"],"type":"object"},"MessageCreatedProductEventObject":{"additionalProperties":false,"description":"Bounded message reference. Fetch the message resource for current content and presentation fields.","properties":{"authorWorkspaceMembershipId":{"description":"Canonical author workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"created_at":{"description":"Message creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"id":{"description":"Message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","conversation_id","authorWorkspaceMembershipId","created_at"],"type":"object"},"MessageUpdatedProductEventObject":{"additionalProperties":false,"description":"Bounded message edit reference. Fetch the message resource for current content and presentation fields.","properties":{"authorWorkspaceMembershipId":{"description":"Canonical author workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"changed_fields":{"description":"Public resource fields changed by this revision.","items":{"description":"Changed message field.","enum":["content"],"type":"string"},"type":"array","minItems":1,"uniqueItems":true},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"created_at":{"description":"Message creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"id":{"description":"Message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"revision":{"description":"Opaque monotonic message revision.","type":"string","minLength":1},"updated_at":{"description":"Message revision timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"}},"required":["id","conversation_id","authorWorkspaceMembershipId","created_at","changed_fields","revision","updated_at"],"type":"object"},"CallWebhookObject":{"additionalProperties":false,"description":"Metadata-only call state carried by call lifecycle ProductEvents.","properties":{"agent_transcript_mode":{"description":"Agent transcript behavior for this call.","enum":["during_call","off"],"type":"string"},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"duration_seconds":{"description":"Call duration in seconds.","type":"number","minimum":0,"nullable":true},"ended_at":{"description":"Call end timestamp.","type":"string","format":"date-time","nullable":true},"id":{"description":"Call identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"Object type.","enum":["call"],"type":"string"},"recorded":{"description":"Whether this call is recorded.","type":"boolean"},"started_at":{"description":"Call start timestamp.","type":"string","format":"date-time","nullable":true},"status":{"description":"Call status.","enum":["active","ended","unknown","uninitialized"],"type":"string"}},"required":["id","object","conversation_id","status","recorded","agent_transcript_mode","duration_seconds","started_at","ended_at"],"type":"object"},"CallUpdatedPreviousAttributes":{"additionalProperties":false,"description":"Previous public call fields that changed in this revision.","properties":{"agent_transcript_mode":{"description":"Previous agent transcript behavior.","enum":["during_call","off"],"type":"string"},"duration_seconds":{"description":"Previous call duration in seconds.","type":"number","minimum":0,"nullable":true},"ended_at":{"description":"Previous call end timestamp.","type":"string","format":"date-time","nullable":true},"recorded":{"description":"Previous call recording state.","type":"boolean"},"started_at":{"description":"Previous call start timestamp.","type":"string","format":"date-time","nullable":true},"status":{"description":"Previous call status.","enum":["active","ended","unknown","uninitialized"],"type":"string"}},"type":"object","minProperties":1},"CallTranscriptUpdatedWebhookObject":{"additionalProperties":false,"description":"Metadata-only call transcript state. Transcript text and summaries are not embedded.","properties":{"call_id":{"description":"Call identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"chapter_count":{"description":"Number of transcript chapters.","type":"integer","minimum":0},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"created_at":{"description":"Transcript creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"id":{"description":"Call transcript identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"Object type.","enum":["call_transcript"],"type":"string"},"processing_errors_count":{"description":"Number of transcript processing errors.","type":"integer","minimum":0},"processing_status":{"description":"Transcript processing status.","enum":["completed","failed","processing","unknown","uninitialized"],"type":"string"},"segment_count":{"description":"Number of transcript segments.","type":"integer","minimum":0},"summary_available":{"description":"Whether a transcript summary is available.","type":"boolean"}},"required":["id","object","call_id","conversation_id","processing_status","processing_errors_count","segment_count","chapter_count","summary_available","created_at"],"type":"object"},"WebhookTestEventObject":{"additionalProperties":false,"description":"Connectivity test payload for an outbound webhook endpoint.","properties":{"message":{"description":"Human-readable test message.","type":"string"},"object":{"description":"Object type.","enum":["webhook_test"],"type":"string"}},"required":["object","message"],"type":"object"},"RealtimeMessageCreatedEventData":{"additionalProperties":false,"description":"message.created event data.","properties":{"object":{"$ref":"#/components/schemas/MessageCreatedProductEventObject"}},"required":["object"],"type":"object"},"RealtimeMessageUpdatedEventData":{"additionalProperties":false,"description":"message.updated event data.","properties":{"object":{"$ref":"#/components/schemas/MessageUpdatedProductEventObject"}},"required":["object"],"type":"object"},"WebhookMessageCreatedEventData":{"additionalProperties":false,"description":"message.created ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/MessageCreatedProductEventObject"}},"required":["object"],"type":"object"},"WebhookMessageUpdatedEventData":{"additionalProperties":false,"description":"message.updated ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/MessageUpdatedProductEventObject"}},"required":["object"],"type":"object"},"WebhookConversationMembershipCreatedEventData":{"additionalProperties":false,"description":"conversation.membership.created ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/ConversationMembershipCreatedWebhookObject"}},"required":["object"],"type":"object"},"WebhookConversationArchiveStateEventData":{"additionalProperties":false,"description":"Conversation archive-state ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/ConversationResult"}},"required":["object"],"type":"object"},"WebhookCallLifecycleEventData":{"additionalProperties":false,"description":"Call lifecycle ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/CallWebhookObject"}},"required":["object"],"type":"object"},"WebhookCallUpdatedEventData":{"additionalProperties":false,"description":"call.updated ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/CallWebhookObject"},"previous_attributes":{"$ref":"#/components/schemas/CallUpdatedPreviousAttributes"}},"required":["object","previous_attributes"],"type":"object"},"WebhookCallTranscriptUpdatedEventData":{"additionalProperties":false,"description":"call.transcript.updated ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/CallTranscriptUpdatedWebhookObject"}},"required":["object"],"type":"object"},"WebhookTestEventData":{"additionalProperties":false,"description":"webhook.test ProductEvent data.","properties":{"object":{"$ref":"#/components/schemas/WebhookTestEventObject"}},"required":["object"],"type":"object"},"WebhookQuestionAnsweredProductEvent":{"additionalProperties":false,"description":"miniapp.question.answered ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookQuestionAnsweredEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["miniapp.question.answered"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookMessageCreatedProductEvent":{"additionalProperties":false,"description":"message.created ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookMessageCreatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["message.created"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookMessageUpdatedProductEvent":{"additionalProperties":false,"description":"message.updated ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookMessageUpdatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["message.updated"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookConversationMembershipCreatedProductEvent":{"additionalProperties":false,"description":"conversation.membership.created ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookConversationMembershipCreatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["conversation.membership.created"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookConversationArchivedProductEvent":{"additionalProperties":false,"description":"conversation.archived ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookConversationArchiveStateEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["conversation.archived"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookConversationUnarchivedProductEvent":{"additionalProperties":false,"description":"conversation.unarchived ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookConversationArchiveStateEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["conversation.unarchived"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookCallStartedProductEvent":{"additionalProperties":false,"description":"call.started ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookCallLifecycleEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["call.started"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookCallEndedProductEvent":{"additionalProperties":false,"description":"call.ended ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookCallLifecycleEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["call.ended"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookCallUpdatedProductEvent":{"additionalProperties":false,"description":"call.updated ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookCallUpdatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["call.updated"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookCallTranscriptUpdatedProductEvent":{"additionalProperties":false,"description":"call.transcript.updated ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookCallTranscriptUpdatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["call.transcript.updated"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookTestProductEvent":{"additionalProperties":false,"description":"webhook.test ProductEvent delivered to an outbound webhook endpoint.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/WebhookTestEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/ProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["webhook.test"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"WebhookProductEventEnvelope":{"description":"Strict discriminated union of canonical ProductEvents delivered to outbound webhook endpoints.","discriminator":{"propertyName":"type","mapping":{"miniapp.question.answered":"#/components/schemas/WebhookQuestionAnsweredProductEvent","message.created":"#/components/schemas/WebhookMessageCreatedProductEvent","message.updated":"#/components/schemas/WebhookMessageUpdatedProductEvent","conversation.membership.created":"#/components/schemas/WebhookConversationMembershipCreatedProductEvent","conversation.archived":"#/components/schemas/WebhookConversationArchivedProductEvent","conversation.unarchived":"#/components/schemas/WebhookConversationUnarchivedProductEvent","call.started":"#/components/schemas/WebhookCallStartedProductEvent","call.ended":"#/components/schemas/WebhookCallEndedProductEvent","call.updated":"#/components/schemas/WebhookCallUpdatedProductEvent","call.transcript.updated":"#/components/schemas/WebhookCallTranscriptUpdatedProductEvent","webhook.test":"#/components/schemas/WebhookTestProductEvent"}},"oneOf":[{"$ref":"#/components/schemas/WebhookQuestionAnsweredProductEvent"},{"$ref":"#/components/schemas/WebhookMessageCreatedProductEvent"},{"$ref":"#/components/schemas/WebhookMessageUpdatedProductEvent"},{"$ref":"#/components/schemas/WebhookConversationMembershipCreatedProductEvent"},{"$ref":"#/components/schemas/WebhookConversationArchivedProductEvent"},{"$ref":"#/components/schemas/WebhookConversationUnarchivedProductEvent"},{"$ref":"#/components/schemas/WebhookCallStartedProductEvent"},{"$ref":"#/components/schemas/WebhookCallEndedProductEvent"},{"$ref":"#/components/schemas/WebhookCallUpdatedProductEvent"},{"$ref":"#/components/schemas/WebhookCallTranscriptUpdatedProductEvent"},{"$ref":"#/components/schemas/WebhookTestProductEvent"}]},"RealtimeMessageCreatedProductEvent":{"additionalProperties":false,"description":"message.created ProductEvent delivered over public realtime.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/RealtimeMessageCreatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/RealtimeProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["message.created"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"RealtimeMessageUpdatedProductEvent":{"additionalProperties":false,"description":"message.updated ProductEvent delivered over public realtime.","properties":{"api_version":{"description":"ProductEvent API version.","enum":["2026-07-13"],"type":"string"},"created_at":{"description":"ProductEvent occurrence timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/RealtimeMessageUpdatedEventData"},"id":{"description":"Canonical ProductEvent identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"ProductEvent object type.","enum":["event"],"type":"string"},"related":{"$ref":"#/components/schemas/RealtimeProductEventRelatedIds"},"type":{"description":"ProductEvent type.","enum":["message.updated"],"type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["id","object","type","api_version","created_at","workspace_id","data","related"],"type":"object"},"RealtimeProductEventEnvelope":{"description":"Strict discriminated union of RFC 085 ProductEvents delivered over public realtime.","discriminator":{"propertyName":"type","mapping":{"message.created":"#/components/schemas/RealtimeMessageCreatedProductEvent","message.updated":"#/components/schemas/RealtimeMessageUpdatedProductEvent"}},"oneOf":[{"$ref":"#/components/schemas/RealtimeMessageCreatedProductEvent"},{"$ref":"#/components/schemas/RealtimeMessageUpdatedProductEvent"}]},"RealtimeResumeRequest":{"additionalProperties":false,"description":"Bounded realtime resume request.","properties":{"cursor":{"description":"Last acknowledged realtime cursor.","type":"string","minLength":1,"maxLength":4096}},"required":["cursor"],"type":"object"},"RealtimeInboxFrame":{"additionalProperties":false,"description":"Agent pending-work snapshot, repeated on every connection. No ACK or resume cursor; source revisions exclude read and handling state. If has_more is true, the items are a lower bound. Drain all MCP inbox pages.","properties":{"type":{"description":"Frame type.","enum":["inbox"],"type":"string"},"subscription_id":{"description":"Subscription identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"workspace_membership_id":{"description":"Agent recipient identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"has_more":{"description":"The snapshot is bounded and more pending items exist.","type":"boolean"},"items":{"description":"Pending source identities, without message content.","items":{"additionalProperties":false,"description":"Pending source.","properties":{"id":{"description":"Inbox item ID.","type":"string","minLength":1,"maxLength":1000},"source_revision":{"description":"Opaque activity revision, stable on reads and acknowledgements.","type":"string","minLength":1,"maxLength":4000}},"required":["id","source_revision"],"type":"object"},"type":"array","maxItems":256}},"required":["type","subscription_id","workspace_id","workspace_membership_id","items","has_more"],"type":"object"},"RealtimeServerFrame":{"description":"Server frame sent over the public realtime websocket.","oneOf":[{"$ref":"#/components/schemas/RealtimeHelloFrame"},{"$ref":"#/components/schemas/RealtimeInboxFrame"},{"$ref":"#/components/schemas/RealtimeEventFrame"},{"$ref":"#/components/schemas/RealtimeAcknowledgedFrame"},{"$ref":"#/components/schemas/RealtimeDisconnectFrame"}]},"RealtimeTarget":{"description":"Realtime target requested while opening a connection. The initial release supports self or an explicit workspace membership target.","oneOf":[{"description":"Authenticated principal shorthand.","enum":["self"],"type":"string"},{"additionalProperties":false,"description":"Workspace membership realtime target.","properties":{"id":{"description":"Workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":{"description":"Target type.","enum":["workspace_membership"],"type":"string"}},"required":["type","id"],"type":"object"}]},"WebhookEndpointDeliveryScope":{"description":"Webhook endpoint runtime data recipient.","oneOf":[{"additionalProperties":false,"description":"Member-targeted endpoint delivery scope.","properties":{"actor_workspace_membership_id":{"description":"Workspace membership the endpoint acts as.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"direct_message_delivery_enabled":{"description":"Whether direct-message events are delivered for conversations the actor belongs to.","type":"boolean"},"type":{"description":"Delivery scope type.","enum":["workspace_member"],"type":"string"}},"required":["type","actor_workspace_membership_id","direct_message_delivery_enabled"],"type":"object"},{"additionalProperties":false,"description":"Unsupported workspace export placeholder.","properties":{"status":{"description":"Workspace export approval state.","enum":["unsupported","requires_approval","approved"],"type":"string"},"type":{"description":"Delivery scope type.","enum":["workspace_export"],"type":"string"}},"required":["type","status"],"type":"object"}]},"WebhookEndpointDeliveryScopeInput":{"additionalProperties":false,"description":"Webhook endpoint delivery-scope update.","properties":{"direct_message_delivery_enabled":{"description":"Whether direct-message events are delivered for conversations the actor belongs to.","type":"boolean"},"type":{"description":"Delivery scope type.","enum":["workspace_member"],"type":"string"}},"required":["type"],"type":"object"},"CreateAgentBody":{"additionalProperties":false,"description":"Agent creation request. Requires an Idempotency-Key header; a retried key replays the stored response instead of minting a second credential.","properties":{"display_name":{"description":"Agent display name. Must be unique within the workspace.","type":"string"},"system_prompt":{"description":"Agent system prompt.","type":"string"},"model_id":{"description":"Model identifier the agent runs on.","type":"string"},"role_name":{"description":"Optional role label.","type":"string","nullable":true},"response_scope":{"description":"Whether the agent responds workspace-wide or only to its creator. Defaults to workspace.","enum":["workspace","personal"],"type":"string"},"avatar_file_id":{"description":"Workspace file identifier for the avatar image, or null for no avatar.","type":"string","nullable":true}},"required":["display_name","system_prompt","model_id"],"type":"object"},"CreateWebhookSourceBody":{"additionalProperties":false,"description":"Inbound webhook source creation request. `provider` names a supported preset (sentry, linear, github, granola, notion, clickup, stripe, calendly, eas, app_store_connect); the preset supplies signature verification and event normalization.","properties":{"display_name":{"description":"Optional label for the author identity events post as. The source itself keeps the provider's canonical name.","type":"string","nullable":true},"provider":{"description":"Inbound provider preset key.","type":"string"},"signing_secret":{"description":"Signing secret the provider will use. Generated when omitted.","type":"string","nullable":true}},"required":["provider"],"type":"object"},"WebhookSourceResult":{"additionalProperties":false,"description":"Inbound webhook source projection.","properties":{"display_name":{"description":"Source display name (provider canonical).","type":"string"},"ingress_url":{"description":"URL to configure in the external service's webhook settings.","type":"string"},"provider":{"description":"Provider preset key, or \"custom\".","type":"string"},"source_id":{"description":"Webhook source identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"status":{"description":"Source status.","type":"string"}},"required":["display_name","ingress_url","provider","source_id","status"],"type":"object"},"CreateWebhookSourceResponse":{"additionalProperties":false,"description":"Created inbound webhook source. The signing secret is returned exactly once.","properties":{"data":{"additionalProperties":false,"description":"Created source with its signing secret.","properties":{"display_name":{"description":"Source display name.","type":"string"},"ingress_url":{"description":"URL to configure in the external service's webhook settings.","type":"string"},"provider":{"description":"Provider preset key.","type":"string"},"signing_secret":{"description":"Signing secret — shown only in this response.","type":"string"},"source_id":{"description":"Webhook source identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"status":{"description":"Source status.","type":"string"}},"required":["display_name","ingress_url","provider","signing_secret","source_id","status"],"type":"object"}},"required":["data"],"type":"object"},"ListWebhookSourcesResponse":{"additionalProperties":false,"description":"Active inbound webhook sources for the workspace.","properties":{"data":{"additionalProperties":false,"description":"Source list.","properties":{"items":{"description":"Sources.","items":{"$ref":"#/components/schemas/WebhookSourceResult"},"type":"array"},"page_info":{"additionalProperties":false,"description":"Pagination metadata.","properties":{"has_next_page":{"description":"Whether more sources exist past this page.","type":"boolean"},"next_cursor":{"description":"Cursor for the next page; null on the last page.","type":"string","nullable":true}},"required":["has_next_page","next_cursor"],"type":"object"}},"required":["items","page_info"],"type":"object"}},"required":["data"],"type":"object"},"CreateWebhookSourceRouteBody":{"additionalProperties":false,"description":"Route creation request: deliver a source's events into a conversation.","properties":{"conversation_id":{"description":"Target conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"events":{"description":"Provider preset event ids to route. Omit to route every event.","items":{"description":"Preset event id.","type":"string"},"type":"array"}},"required":["conversation_id"],"type":"object"},"CreateWebhookSourceRouteResponse":{"additionalProperties":false,"description":"Created event route.","properties":{"data":{"additionalProperties":false,"description":"Created route.","properties":{"conversation_id":{"description":"Target conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"route_id":{"description":"Route identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["conversation_id","route_id"],"type":"object"}},"required":["data"],"type":"object"},"CreateWebhookEndpointBody":{"additionalProperties":false,"description":"Webhook endpoint creation request.","properties":{"enabled_events":{"description":"Product event types to deliver to this endpoint.","items":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"type":"array"},"delivery_scope":{"$ref":"#/components/schemas/WebhookEndpointDeliveryScopeInput"},"name":{"description":"Optional endpoint label.","type":"string","nullable":true},"url":{"description":"HTTPS receiver URL.","type":"string"}},"required":["url","enabled_events"],"type":"object"},"RotateWebhookEndpointSecretBody":{"additionalProperties":false,"description":"Webhook endpoint secret rotation request.","properties":{"previous_secret_ttl_seconds":{"description":"Seconds to keep the previous secret active. Maximum is 86400.","type":"integer","minimum":0}},"type":"object"},"UpdateWebhookEndpointBody":{"additionalProperties":false,"description":"Webhook endpoint update request.","properties":{"enabled_events":{"description":"Product event types to deliver to this endpoint.","items":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"type":"array"},"delivery_scope":{"$ref":"#/components/schemas/WebhookEndpointDeliveryScopeInput"},"name":{"description":"Optional endpoint label.","type":"string","nullable":true},"status":{"description":"Endpoint status.","enum":["active","disabled"],"type":"string"},"url":{"description":"HTTPS receiver URL.","type":"string"}},"type":"object"},"WebhookDelivery":{"additionalProperties":false,"description":"Webhook delivery state visible through the public API.","properties":{"api_version":{"description":"Webhook event API version.","type":"string"},"attempt_count":{"description":"Number of attempted deliveries.","type":"integer"},"created_at":{"description":"Delivery creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"endpoint_enabled_events":{"description":"Events currently enabled on the endpoint.","items":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"type":"array"},"endpoint_id":{"description":"Webhook endpoint identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"endpoint_signing_secret_prefix":{"description":"Display-safe prefix of the endpoint signing secret.","type":"string","nullable":true},"endpoint_status":{"description":"Current endpoint status.","enum":["active","disabled"],"type":"string","nullable":true},"endpoint_url":{"description":"Current endpoint receiver URL.","type":"string","nullable":true},"event_id":{"description":"Webhook event identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"event_type":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"failed_at":{"description":"Terminal failure timestamp.","type":"string","format":"date-time","nullable":true},"first_attempted_at":{"description":"First attempt timestamp.","type":"string","format":"date-time","nullable":true},"id":{"description":"Webhook delivery identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"last_attempted_at":{"description":"Last attempt timestamp.","type":"string","format":"date-time","nullable":true},"last_error_code":{"description":"Last delivery error code.","type":"string","nullable":true},"last_error_message":{"description":"Last delivery error message.","type":"string","nullable":true},"last_http_status":{"description":"Last receiver HTTP status.","type":"number","nullable":true},"max_attempts":{"description":"Maximum automatic delivery attempts.","type":"integer"},"next_attempt_at":{"description":"Next scheduled attempt timestamp.","type":"string","format":"date-time","nullable":true},"object":{"description":"Object type.","enum":["webhook_delivery"],"type":"string"},"replayable":{"description":"Whether the delivery can be replayed from the public API.","type":"boolean"},"status":{"description":"Delivery status.","enum":["pending","scheduled","in_flight","succeeded","retrying","failed","skipped"],"type":"string"},"succeeded_at":{"description":"Success timestamp.","type":"string","format":"date-time","nullable":true},"updated_at":{"description":"Last update timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["object","id","workspace_id","endpoint_id","endpoint_url","endpoint_status","endpoint_enabled_events","endpoint_signing_secret_prefix","event_id","event_type","api_version","status","attempt_count","max_attempts","next_attempt_at","first_attempted_at","last_attempted_at","succeeded_at","failed_at","last_http_status","last_error_code","last_error_message","replayable","created_at","updated_at"],"type":"object"},"WebhookDeliveryListResponse":{"additionalProperties":false,"description":"Webhook delivery list response.","properties":{"data":{"additionalProperties":false,"description":"Standard paginated public response data.","properties":{"items":{"description":"Webhook deliveries.","items":{"$ref":"#/components/schemas/WebhookDelivery"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"}},"required":["items","page_info"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/WebhookDelivery"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"WebhookEndpoint":{"additionalProperties":false,"description":"Webhook endpoint metadata. Signing secret plaintext is never returned here.","properties":{"created_at":{"description":"Endpoint creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"delivery_scope":{"$ref":"#/components/schemas/WebhookEndpointDeliveryScope"},"disabled_at":{"description":"Endpoint disabled timestamp.","type":"string","format":"date-time","nullable":true},"enabled_events":{"description":"Product event types delivered to this endpoint.","items":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"type":"array"},"id":{"description":"Webhook endpoint identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"name":{"description":"Endpoint label.","type":"string","nullable":true},"object":{"description":"Object type.","enum":["webhook_endpoint"],"type":"string"},"previous_signing_secret_expires_at":{"description":"Previous secret expiration timestamp.","type":"string","format":"date-time","nullable":true},"signing_secret_prefix":{"description":"Display-safe prefix of the active signing secret.","type":"string"},"status":{"description":"Endpoint status.","enum":["active","disabled"],"type":"string"},"updated_at":{"description":"Last update timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"url":{"description":"Receiver URL.","type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["object","id","workspace_id","name","url","enabled_events","delivery_scope","status","signing_secret_prefix","previous_signing_secret_expires_at","disabled_at","created_at","updated_at"],"type":"object"},"WebhookEndpointDeliverySummary":{"additionalProperties":false,"description":"Delivery summary over the endpoint's most recent 100 deliveries.","properties":{"failed_count":{"description":"Failed delivery count within the most recent 100 deliveries.","type":"integer"},"in_flight_count":{"description":"In-flight delivery count within the most recent 100 deliveries.","type":"integer"},"latest_attempted_at":{"description":"Latest attempt timestamp.","type":"string","format":"date-time","nullable":true},"latest_delivery_id":{"description":"Latest delivery identifier.","type":"string","nullable":true},"latest_delivery_status":{"description":"Latest delivery status.","enum":["pending","scheduled","in_flight","succeeded","retrying","failed","skipped"],"type":"string","nullable":true},"latest_failed_at":{"description":"Latest failure timestamp.","type":"string","format":"date-time","nullable":true},"latest_succeeded_at":{"description":"Latest success timestamp.","type":"string","format":"date-time","nullable":true},"pending_count":{"description":"Pending delivery count within the most recent 100 deliveries.","type":"integer"},"recent_count":{"description":"Number of deliveries summarized, capped at the most recent 100 deliveries.","type":"integer"},"retrying_count":{"description":"Retrying delivery count within the most recent 100 deliveries.","type":"integer"},"scheduled_count":{"description":"Scheduled delivery count within the most recent 100 deliveries.","type":"integer"},"skipped_count":{"description":"Skipped delivery count within the most recent 100 deliveries.","type":"integer"},"succeeded_count":{"description":"Succeeded delivery count within the most recent 100 deliveries.","type":"integer"}},"required":["recent_count","pending_count","scheduled_count","in_flight_count","retrying_count","succeeded_count","failed_count","skipped_count","latest_delivery_id","latest_delivery_status","latest_attempted_at","latest_succeeded_at","latest_failed_at"],"type":"object"},"WebhookEndpointDetail":{"additionalProperties":false,"description":"Webhook endpoint detail.","properties":{"created_at":{"description":"Endpoint creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"delivery_scope":{"$ref":"#/components/schemas/WebhookEndpointDeliveryScope"},"disabled_at":{"description":"Endpoint disabled timestamp.","type":"string","format":"date-time","nullable":true},"enabled_events":{"description":"Product event types delivered to this endpoint.","items":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"type":"array"},"id":{"description":"Webhook endpoint identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"name":{"description":"Endpoint label.","type":"string","nullable":true},"object":{"description":"Object type.","enum":["webhook_endpoint"],"type":"string"},"previous_signing_secret_expires_at":{"description":"Previous secret expiration timestamp.","type":"string","format":"date-time","nullable":true},"signing_secret_prefix":{"description":"Display-safe prefix of the active signing secret.","type":"string"},"status":{"description":"Endpoint status.","enum":["active","disabled"],"type":"string"},"updated_at":{"description":"Last update timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"url":{"description":"Receiver URL.","type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"delivery_summary":{"$ref":"#/components/schemas/WebhookEndpointDeliverySummary"}},"required":["object","id","workspace_id","name","url","enabled_events","delivery_scope","status","signing_secret_prefix","previous_signing_secret_expires_at","disabled_at","created_at","updated_at","delivery_summary"],"type":"object"},"WebhookEndpointDetailResponse":{"additionalProperties":false,"description":"Webhook endpoint detail response.","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointDetail"}},"required":["data"],"type":"object"},"WebhookEndpointListResponse":{"additionalProperties":false,"description":"Webhook endpoint list response.","properties":{"data":{"additionalProperties":false,"description":"Standard public response data. New clients should read data.items.","properties":{"items":{"description":"Webhook endpoints.","items":{"$ref":"#/components/schemas/WebhookEndpoint"},"type":"array"}},"required":["items"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/WebhookEndpoint"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"WebhookEndpointResponse":{"additionalProperties":false,"description":"Webhook endpoint response.","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpoint"}},"required":["data"],"type":"object"},"WebhookEndpointSecret":{"additionalProperties":false,"description":"Webhook endpoint response with one-time plaintext secret.","properties":{"created_at":{"description":"Endpoint creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"delivery_scope":{"$ref":"#/components/schemas/WebhookEndpointDeliveryScope"},"disabled_at":{"description":"Endpoint disabled timestamp.","type":"string","format":"date-time","nullable":true},"enabled_events":{"description":"Product event types delivered to this endpoint.","items":{"description":"Webhook event type.","enum":["miniapp.question.answered","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated","webhook.test"],"type":"string"},"type":"array"},"id":{"description":"Webhook endpoint identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"name":{"description":"Endpoint label.","type":"string","nullable":true},"object":{"description":"Object type.","enum":["webhook_endpoint"],"type":"string"},"previous_signing_secret_expires_at":{"description":"Previous secret expiration timestamp.","type":"string","format":"date-time","nullable":true},"signing_secret_prefix":{"description":"Display-safe prefix of the active signing secret.","type":"string"},"status":{"description":"Endpoint status.","enum":["active","disabled"],"type":"string"},"updated_at":{"description":"Last update timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"url":{"description":"Receiver URL.","type":"string"},"workspace_id":{"description":"Workspace identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"signing_secret":{"description":"Plaintext webhook signing secret. Store it immediately.","type":"string"}},"required":["object","id","workspace_id","name","url","enabled_events","delivery_scope","status","signing_secret_prefix","previous_signing_secret_expires_at","disabled_at","created_at","updated_at","signing_secret"],"type":"object"},"WebhookEndpointSecretResponse":{"additionalProperties":false,"description":"Webhook endpoint response with one-time plaintext secret.","properties":{"data":{"$ref":"#/components/schemas/WebhookEndpointSecret"}},"required":["data"],"type":"object"},"WebhookReplayResponse":{"additionalProperties":false,"description":"Webhook delivery replay response.","properties":{"data":{"additionalProperties":false,"description":"Replay delivery data.","properties":{"delivery_id":{"description":"New webhook delivery identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["delivery_id"],"type":"object"}},"required":["data"],"type":"object"},"WebhookTestEventResponse":{"additionalProperties":false,"description":"Webhook test event response.","properties":{"data":{"additionalProperties":false,"description":"Webhook test event data.","properties":{"delivery_ids":{"description":"Planned webhook delivery identifiers.","items":{"description":"Webhook delivery identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":"array"},"event_id":{"description":"Webhook event identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["event_id","delivery_ids"],"type":"object"}},"required":["data"],"type":"object"},"ConversationMessagesResponse":{"additionalProperties":false,"description":"Conversation messages response with the standard public data envelope plus legacy top-level aliases.","properties":{"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"data":{"$ref":"#/components/schemas/ConversationMessagesData"},"items":{"description":"Messages.","items":{"$ref":"#/components/schemas/MessageResult"},"type":"array"},"pageInfo":{"$ref":"#/components/schemas/LegacyPageInfo"}},"required":["data","conversation_id","conversation_name","items","pageInfo"],"type":"object"},"ConversationMessagesData":{"additionalProperties":false,"description":"Standard conversation messages payload.","properties":{"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"items":{"description":"Messages.","items":{"$ref":"#/components/schemas/MessageResult"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"}},"required":["conversation_id","conversation_name","items","page_info"],"type":"object"},"CreateConversationMessageBody":{"additionalProperties":false,"description":"Create a conversation message. The authenticated API-key workspace member is the author; author_id is accepted only for legacy body compatibility and is ignored.","properties":{"app_card":{"oneOf":[{"additionalProperties":false,"description":"A deployment attempt reported by the authenticated publisher. Markdown remains the fallback for clients without native cards.","properties":{"kind":{"type":"string","enum":["deployment"]},"deployment":{"additionalProperties":false,"description":"Immutable deployment result.","properties":{"repository":{"description":"GitHub owner/repository.","type":"string","maxLength":200,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$"},"sha":{"description":"Full commit SHA.","type":"string","pattern":"^[a-fA-F0-9]{40}$"},"subject":{"description":"Commit subject.","type":"string","maxLength":300},"environment":{"description":"Deployment environment.","type":"string","minLength":1,"maxLength":80},"run_id":{"description":"GitHub Actions run ID.","type":"string","pattern":"^[1-9][0-9]*$","maxLength":30},"run_attempt":{"type":"integer","minimum":1},"verification":{"type":"string","enum":["success","failure","cancelled","skipped","unknown"]},"services":{"type":"array","minItems":1,"maxItems":12,"items":{"additionalProperties":false,"description":"One service outcome; names must be distinct.","properties":{"name":{"description":"Service name.","type":"string","minLength":1,"maxLength":80},"result":{"type":"string","enum":["success","failure","cancelled","skipped","unknown"]}},"required":["name","result"],"type":"object"}}},"required":["repository","sha","subject","environment","run_id","run_attempt","verification","services"],"type":"object"}},"required":["kind","deployment"],"type":"object"},{"additionalProperties":false,"description":"A native report or visualization. The server validates the version-1 CardDocument and generates text fallback.","properties":{"kind":{"type":"string","enum":["document"]},"document":{"$ref":"#/components/schemas/CardDocument"}},"required":["kind","document"],"type":"object"}]},"markdown_content":{"description":"Message markdown content.","type":"string","nullable":true},"explicit_context_message_ids":{"description":"Message identifiers to include as explicit context.","items":{"description":"Message identifier.","type":"string"},"type":"array"},"image_urls":{"description":"Image URLs to attach to the message.","items":{"description":"Image URL.","type":"string","format":"uri"},"type":"array"},"file_ids":{"description":"Ready file identifiers from the Files routes to attach to the message.","items":{"description":"File identifier.","type":"string"},"type":"array"},"suppressed_link_preview_urls":{"description":"URLs whose link previews should be suppressed.","items":{"description":"URL.","type":"string","format":"uri"},"type":"array"},"initiator_id":{"description":"Initiating workspace member identifier.","type":"string","nullable":true},"thread_root_id":{"description":"Thread root message identifier.","type":"string","nullable":true},"replied_to_message_id":{"description":"Immediate parent message identifier inside an existing thread. For the first reply to a root message, send thread_root_id only; if replied_to_message_id equals thread_root_id, the server normalizes it as the first reply.","type":"string","nullable":true},"call_root_id":{"description":"Call root identifier.","type":"string","nullable":true},"optimistic_id":{"description":"Client optimistic identifier.","type":"string"},"client_request_id":{"description":"Legacy body idempotency value. Public v1 clients should use the Idempotency-Key header.","type":"string","nullable":true},"author_id":{"description":"Ignored legacy body author workspace member identifier. Deprecated: the authenticated API-key workspace member is always the author.","type":"string","deprecated":true}},"required":["markdown_content"],"type":"object"},"UpdateConversationMessageBody":{"additionalProperties":false,"description":"Edit body for a conversation message. See the operation for edit semantics.","properties":{"markdown_content":{"description":"Replacement message markdown content. Must contain renderable text: clearing a message body is not supported.","type":"string"},"suppressed_link_preview_urls":{"description":"URLs whose link previews should be suppressed. Omit to leave the stored list unchanged.","items":{"description":"URL.","type":"string","format":"uri"},"type":"array"}},"required":["markdown_content"],"type":"object"},"CreateConversationMessageResponse":{"additionalProperties":false,"description":"Create-message response with the standard public data envelope plus legacy compatibility aliases.","properties":{"data":{"$ref":"#/components/schemas/MessageResult"},"legacy_data":{"additionalProperties":true,"description":"Legacy extended conversation message. New clients should read the standard data message result.","nullable":true,"type":"object"},"success":{"description":"Compatibility command flag.","type":"boolean"}},"required":["success","data"],"type":"object"},"CreatePublicFileBody":{"additionalProperties":false,"description":"Create a public file upload intent. The response returns a storage upload URL; send the file bytes to that URL, then complete the upload before attaching the returned file id to a message.","properties":{"client_upload_id":{"description":"Optional caller-generated identifier for correlating this file with the integration's local upload.","type":"string","nullable":true},"content_type":{"description":"Declared MIME content type.","type":"string"},"filename":{"description":"Original filename.","type":"string"},"purpose":{"description":"File purpose.","enum":["message_attachment"],"type":"string"},"sha256":{"description":"Optional lowercase hex-encoded SHA-256 digest of the file bytes. SHA-256 verification is supported only when size_bytes is less than or equal to 67108864.","type":"string","maxLength":64,"nullable":true},"size_bytes":{"description":"Declared file size in bytes.","type":"integer","minimum":1}},"required":["filename","content_type","size_bytes"],"type":"object"},"ConversationResult":{"additionalProperties":false,"description":"Public conversation projection.","properties":{"agent_members_count":{"description":"Number of agent workspace members.","type":"integer","minimum":0},"created_at":{"description":"Conversation creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"creator_member_id":{"description":"Workspace membership ID of the conversation creator, when known.","type":"string","nullable":true},"description":{"description":"Conversation description.","type":"string","nullable":true},"human_members_count":{"description":"Number of human workspace members.","type":"integer","minimum":0},"id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"name":{"description":"Conversation name.","type":"string","nullable":true},"type":{"description":"Conversation type: 0 channel, 1 direct message.","enum":[0,1],"type":"integer"},"is_bridge":{"description":"Whether the conversation is a Bridge: a channel shared with another organization through Ando Connect, or a Slack Connect mirror. Present on membership-backed reads.","type":"boolean"},"bridge_kind":{"description":"Which kind of Bridge, or null when the conversation is not one. Only ando_connect channels follow Ando Connect membership rules.","enum":["ando_connect","slack_connect"],"nullable":true,"type":"string"}},"required":["id","name","type","description","human_members_count","agent_members_count","created_at","creator_member_id"],"type":"object"},"ConversationResultResponse":{"additionalProperties":false,"description":"Membership-gated conversation detail response.","properties":{"data":{"$ref":"#/components/schemas/ConversationResult"}},"required":["data"],"type":"object"},"CreateConversationBody":{"additionalProperties":false,"description":"Channel creation request. Same operation as the MCP create_channel tool.","properties":{"access_control_type":{"description":"Channel visibility. Defaults to \"public\".","enum":["public","private"],"type":"string"},"member_ids":{"description":"Workspace member ids to include as initial channel members. The caller is always included.","items":{"description":"Workspace member identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":"array"},"name":{"description":"The channel name.","type":"string"}},"required":["name"],"type":"object"},"CreateConversationResult":{"additionalProperties":false,"description":"Created channel projection.","properties":{"access_control_type":{"description":"Channel visibility.","enum":["public","private"],"type":"string"},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"member_ids":{"description":"Workspace member ids of the initial channel members, including the caller.","items":{"description":"Workspace member identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"type":"array"},"name":{"description":"Channel name.","type":"string","nullable":true}},"required":["access_control_type","conversation_id","member_ids","name"],"type":"object"},"CreateConversationResponse":{"additionalProperties":false,"description":"Created channel response.","properties":{"data":{"$ref":"#/components/schemas/CreateConversationResult"}},"required":["data"],"type":"object"},"CreateHistoryImportBody":{"additionalProperties":false,"description":"Starts, or resumes, moving another chat tool's history into this workspace. One import exists per source workspace; calling this again returns it (reopening it if it was completed).","properties":{"source":{"description":"The tool the history comes from. Use `generic` for a tool without its own value; the records are the same.","enum":["buzz","discord","generic"],"type":"string"},"source_workspace_id":{"description":"Stable identifier of the source workspace, e.g. the Buzz relay host. Calling again with the same source and id resumes the same import, so for `generic` make it unique to the tool as well, such as the tool's host followed by its workspace id.","type":"string"},"source_workspace_name":{"description":"Display name of the source workspace.","type":"string","nullable":true}},"required":["source","source_workspace_id"],"type":"object"},"HistoryImportResult":{"additionalProperties":false,"description":"A history import.","properties":{"created_at":{"description":"When the import was first started.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"import_id":{"description":"Import identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"source":{"description":"The tool the history comes from.","enum":["buzz","discord","generic"],"type":"string"},"source_workspace_id":{"description":"Stable identifier of the source workspace.","type":"string"},"started_by_member_id":{"description":"Workspace member who owns the API key that started the import.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"status":{"description":"Whether records can still be written.","enum":["open","completed"],"type":"string"}},"required":["created_at","import_id","source","source_workspace_id","started_by_member_id","status"],"type":"object"},"HistoryImportResponse":{"additionalProperties":false,"description":"History import response.","properties":{"data":{"$ref":"#/components/schemas/HistoryImportResult"}},"required":["data"],"type":"object"},"HistoryImportMemberRecord":{"additionalProperties":false,"description":"A person from the source tool. Their history is attributed to ando_member_id when given, else to an Ando member with the same email, else to an imported placeholder that keeps their name and avatar.","properties":{"ando_member_id":{"description":"Existing Ando workspace member this person already is.","type":"string","nullable":true},"avatar_url":{"description":"https avatar URL.","type":"string","nullable":true},"deactivated":{"description":"Whether the source tool had deactivated them.","type":"boolean"},"display_name":{"description":"Display name in the source tool.","type":"string"},"email":{"description":"Email address, when the source tool has one.","type":"string","nullable":true},"external_id":{"description":"The person's id in the source tool.","type":"string"},"kind":{"description":"Person or bot.","enum":["person","bot"],"type":"string"}},"required":["ando_member_id","avatar_url","deactivated","display_name","email","external_id","kind"],"type":"object"},"HistoryImportConversationRecord":{"additionalProperties":false,"description":"A channel or direct message. Rosters accumulate: send the same record again with more member ids to add people. Re-sending a record also updates the conversation's name, description, visibility, and archived state. A direct message always becomes its own imported conversation. An imported channel never takes a live channel's name; it gets a source suffix instead.","properties":{"archived":{"description":"Whether the conversation was archived at the source.","type":"boolean"},"created_at":{"description":"When the conversation was created at the source.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"description":{"description":"Channel description.","type":"string","nullable":true},"external_id":{"description":"The conversation's id in the source tool.","type":"string"},"kind":{"description":"Conversation kind.","enum":["channel","direct_message"],"type":"string"},"member_external_ids":{"description":"External ids of members imported earlier. At most 250 across one request; send a larger roster as repeated records.","items":{"description":"Member external id.","type":"string"},"type":"array"},"name":{"description":"Channel name. Required for channels; ignored for direct messages.","type":"string","nullable":true},"visibility":{"description":"Channel visibility. Direct messages are always private.","enum":["public","private"],"type":"string"}},"required":["archived","created_at","description","external_id","kind","member_external_ids","name","visibility"],"type":"object"},"HistoryImportMessageRecord":{"additionalProperties":false,"description":"A message with its original author and time. Send thread roots before their replies. Imported messages notify no one.","properties":{"author_external_id":{"description":"External id of the author.","type":"string"},"conversation_external_id":{"description":"External id of the conversation.","type":"string"},"created_at":{"description":"When the message was sent at the source.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"edited_at":{"description":"When the message was last edited at the source.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time","nullable":true},"external_id":{"description":"The message's id in the source tool.","type":"string"},"markdown":{"description":"Message body as Markdown, at most 40,000 characters.","type":"string"},"thread_root_external_id":{"description":"External id of the thread's root message. Ando threads are one level deep.","type":"string","nullable":true},"files":{"description":"Attachments, at most 10. Upload each with POST /v1/files first. Omit to keep the message's current attachments; send an empty array to remove them. A message may have files and empty markdown.","items":{"$ref":"#/components/schemas/HistoryImportMessageFile"},"type":"array"}},"required":["author_external_id","conversation_external_id","created_at","edited_at","external_id","markdown","thread_root_external_id"],"type":"object"},"HistoryImportMessageFile":{"additionalProperties":false,"description":"A file uploaded with POST /v1/files by the import's operator, attached to an imported message.","properties":{"external_id":{"description":"The file's id in the source tool, used to find it again with files/lookup.","type":"string"},"file_id":{"description":"The Ando file id returned by POST /v1/files.","type":"string"}},"required":["external_id","file_id"],"type":"object"},"HistoryImportFileLookupBody":{"additionalProperties":false,"description":"Source file ids to look up, at most 200.","properties":{"external_ids":{"description":"Source file ids.","items":{"description":"A source file id.","type":"string"},"type":"array"}},"required":["external_ids"],"type":"object"},"HistoryImportFileLookupResponse":{"additionalProperties":false,"description":"The source files this import already uploaded that can still be attached. Ids not listed need uploading.","properties":{"data":{"additionalProperties":false,"description":"Lookup result.","properties":{"files":{"description":"Uploaded files.","items":{"$ref":"#/components/schemas/HistoryImportMessageFile"},"type":"array"}},"required":["files"],"type":"object"}},"required":["data"],"type":"object"},"HistoryImportReactionRecord":{"additionalProperties":false,"description":"A reaction on an imported message.","properties":{"author_external_id":{"description":"External id of the person who reacted.","type":"string"},"conversation_external_id":{"description":"External id of the conversation.","type":"string"},"emoji":{"description":"Unicode emoji, or a workspace custom emoji name.","type":"string"},"message_external_id":{"description":"External id of the message.","type":"string"}},"required":["author_external_id","conversation_external_id","emoji","message_external_id"],"type":"object"},"HistoryImportRecordsBody":{"additionalProperties":false,"description":"Any subset of records, keyed by the source tool's ids so every request is idempotent. Per request: at most 100 members, 10 conversations, 100 messages, and 200 reactions. Records that reference something not yet imported are reported in skipped.","properties":{"conversations":{"description":"Conversations.","items":{"$ref":"#/components/schemas/HistoryImportConversationRecord"},"type":"array"},"members":{"description":"People.","items":{"$ref":"#/components/schemas/HistoryImportMemberRecord"},"type":"array"},"messages":{"description":"Messages.","items":{"$ref":"#/components/schemas/HistoryImportMessageRecord"},"type":"array"},"reactions":{"description":"Reactions.","items":{"$ref":"#/components/schemas/HistoryImportReactionRecord"},"type":"array"}},"type":"object"},"HistoryImportWrittenCount":{"additionalProperties":false,"description":"Records written (or already present) in this request.","properties":{"written":{"description":"Record count.","type":"integer","minimum":0}},"required":["written"],"type":"object"},"HistoryImportSkippedRecord":{"additionalProperties":false,"description":"A record that was not written.","properties":{"external_id":{"description":"External id of the record or reference.","type":"string"},"reason":{"description":"Why, e.g. unknown_member, unknown_conversation, unknown_author, unknown_message, unsupported_emoji, message_too_long, empty_message, ando_member_not_found.","type":"string"}},"required":["external_id","reason"],"type":"object"},"HistoryImportRecordsResult":{"additionalProperties":false,"description":"Outcome of one records request.","properties":{"conversations":{"$ref":"#/components/schemas/HistoryImportWrittenCount"},"members":{"$ref":"#/components/schemas/HistoryImportWrittenCount"},"messages":{"$ref":"#/components/schemas/HistoryImportWrittenCount"},"reactions":{"$ref":"#/components/schemas/HistoryImportWrittenCount"},"skipped":{"description":"Records that were not written.","items":{"$ref":"#/components/schemas/HistoryImportSkippedRecord"},"type":"array"}},"required":["conversations","members","messages","reactions","skipped"],"type":"object"},"HistoryImportRecordsResponse":{"additionalProperties":false,"description":"History import records response.","properties":{"data":{"$ref":"#/components/schemas/HistoryImportRecordsResult"}},"required":["data"],"type":"object"},"HistoryImportCompleteResult":{"additionalProperties":false,"description":"A completed import and the distinct records it has imported across all requests.","properties":{"counts":{"additionalProperties":false,"description":"Distinct records imported across all requests; re-sent records are not counted twice.","properties":{"conversations":{"description":"Conversations.","type":"integer","minimum":0},"members":{"description":"Members.","type":"integer","minimum":0},"messages":{"description":"Messages.","type":"integer","minimum":0},"reactions":{"description":"Reactions.","type":"integer","minimum":0}},"required":["conversations","members","messages","reactions"],"type":"object"},"import_id":{"description":"Import identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"status":{"description":"Import status.","enum":["open","completed"],"type":"string"}},"required":["counts","import_id","status"],"type":"object"},"HistoryImportCompleteResponse":{"additionalProperties":false,"description":"History import completion response.","properties":{"data":{"$ref":"#/components/schemas/HistoryImportCompleteResult"}},"required":["data"],"type":"object"},"ListConversationsResponse":{"additionalProperties":false,"description":"Membership-scoped conversation list. Results are returned in data.items; top-level items is a compatibility alias.","properties":{"data":{"additionalProperties":false,"description":"Standard paginated public response data.","properties":{"items":{"description":"Conversations the authenticated workspace member belongs to.","items":{"$ref":"#/components/schemas/ConversationResult"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"}},"required":["items","page_info"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/ConversationResult"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"LegacyErrorResponse":{"additionalProperties":false,"description":"Current compatibility error envelope used by legacy /api/v1 routes.","properties":{"error":{"description":"Error message.","type":"string"},"error_code":{"description":"Optional machine-readable error code.","type":"string","nullable":true},"missing_scopes":{"description":"Missing scopes.","items":{"description":"Scope.","type":"string"},"type":"array"}},"required":["error"],"type":"object"},"LegacyPageInfo":{"additionalProperties":false,"description":"Current compatibility pagination metadata with camelCase field names.","properties":{"endCursor":{"description":"Cursor for the last item.","type":"string","nullable":true},"hasNextPage":{"description":"Whether another page exists after this page.","type":"boolean"},"hasPreviousPage":{"description":"Whether another page exists before this page.","type":"boolean"},"startCursor":{"description":"Cursor for the first item.","type":"string","nullable":true}},"required":["hasNextPage","hasPreviousPage"],"type":"object"},"PublicFileResult":{"additionalProperties":false,"description":"Public file lifecycle state. Ready readable files include short-lived download instructions and can be attached to message creation with file_ids.","properties":{"content_type":{"description":"Declared MIME content type.","type":"string"},"created_at":{"description":"File upload intent creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"file_id":{"description":"File identifier. Matches id for message file_ids.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"filename":{"description":"Original filename.","type":"string"},"id":{"description":"File identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"object":{"description":"Object type.","enum":["file"],"type":"string"},"purpose":{"description":"File purpose.","enum":["message_attachment"],"type":"string"},"size_bytes":{"description":"File size in bytes.","type":"integer","minimum":1},"status":{"description":"File lifecycle status.","enum":["waiting_for_upload","uploaded","processing","ready","aborted","expired","failed"],"type":"string"},"updated_at":{"description":"Last file lifecycle update timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"upload":{"allOf":[{"$ref":"#/components/schemas/PublicFileUploadInstructions"}],"description":"Temporary storage upload instructions returned by create-file responses while the file is waiting for bytes. Metadata-only get-file responses return null; replay create-file with the same Idempotency-Key and body to refresh an upload URL.","nullable":true},"download":{"allOf":[{"$ref":"#/components/schemas/PublicFileDownloadInstructions"}],"description":"Short-lived download instructions for an authorized ready file. Omitted for incomplete upload lifecycle responses."}},"required":["object","id","file_id","status","purpose","filename","content_type","size_bytes","created_at","updated_at","upload"],"type":"object"},"PublicFileResponse":{"additionalProperties":false,"description":"Public file response envelope.","properties":{"data":{"$ref":"#/components/schemas/PublicFileResult"},"file_id":{"description":"File identifier. Matches data.id.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["data","file_id"],"type":"object"},"PublicFileDownloadInstructions":{"additionalProperties":false,"description":"Temporary storage download instructions.","properties":{"expires_at":{"description":"Download URL expiration timestamp.","type":"string","format":"date-time","nullable":true},"method":{"description":"Download HTTP method.","enum":["GET"],"type":"string"},"url":{"description":"Temporary direct download URL.","type":"string","format":"uri"}},"required":["method","url","expires_at"],"type":"object"},"PublicFileUploadInstructions":{"additionalProperties":false,"description":"Temporary storage upload instructions.","properties":{"expires_at":{"description":"Upload URL expiration timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"headers":{"additionalProperties":{"description":"Required header value.","type":"string"},"description":"Headers that must be sent exactly with the direct storage upload.","type":"object"},"kind":{"description":"Upload strategy.","enum":["single_part_presigned_put"],"type":"string"},"method":{"description":"Upload HTTP method.","enum":["PUT"],"type":"string"},"url":{"description":"Temporary direct upload URL.","type":"string","format":"uri"}},"required":["kind","method","url","headers","expires_at"],"type":"object"},"MemberResult":{"additionalProperties":false,"description":"Workspace member result visible to the authenticated API key. The v1 schema name is a compatibility spelling for this resource.","properties":{"display_name":{"description":"Display name.","type":"string","nullable":true},"email":{"description":"Email address.","type":"string","format":"email","nullable":true},"id":{"description":"Workspace member identifier. Deprecated: read membership_id instead.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","deprecated":true},"membership_id":{"description":"Canonical RFC 144 workspace membership identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"workspace_membership_id":{"description":"Snake-case workspace membership identifier. Deprecated: read membership_id instead.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","deprecated":true},"handle":{"description":"Stable workspace handle.","type":"string"},"principal_type":{"description":"Workspace principal type.","enum":["user","agent"],"type":"string"},"workspace_role":{"description":"Canonical workspace role.","enum":["guest","member","admin","owner"],"type":"string"},"joined_at":{"description":"Membership join time in epoch milliseconds.","type":"number"},"management_kind":{"description":"Agent management kind; null for human members.","enum":["managed_agent","connected_agent","unavailable"],"type":"string","nullable":true},"role_name":{"description":"Authorized agent role name; null for humans or unavailable roles.","type":"string","nullable":true},"profile_image_url":{"description":"Profile image URL.","type":"string","format":"uri","nullable":true},"title":{"description":"Workspace member title.","type":"string","nullable":true},"workspaceMembershipId":{"description":"CamelCase workspace membership identifier. Deprecated: read membership_id instead.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","deprecated":true}},"required":["id","workspaceMembershipId","membership_id","workspace_membership_id","display_name","email","title","profile_image_url","handle","principal_type","workspace_role","joined_at","management_kind","role_name"],"type":"object"},"PublicApiSearchMessageResult":{"additionalProperties":false,"description":"Search result for a message. content is a plain-text excerpt of at most 240 characters around the first match (the message start when browsing), with … marking omitted text.","properties":{"authorWorkspaceMembershipId":{"description":"Canonical author workspace membership identifier. Matches legacy author_id during the compatibility window.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"author_id":{"description":"Author workspace member identifier. Deprecated: read authorWorkspaceMembershipId instead.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","deprecated":true},"author_name":{"description":"Author workspace member display name.","type":"string","nullable":true},"content":{"description":"Message markdown content.","type":"string","nullable":true},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"created_at":{"description":"Message creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"id":{"description":"Message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"image_urls":{"description":"Image URLs extracted from the message.","items":{"description":"Image URL.","type":"string","format":"uri"},"type":"array"},"attachments":{"description":"Files attached to the message. Use file_id with GET /files/{fileId} or the get_file MCP tool to obtain a short-lived download URL.","items":{"additionalProperties":false,"description":"Message attachment metadata.","properties":{"content_type":{"description":"Attachment MIME content type.","type":"string"},"file_id":{"description":"Attachment file identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"filename":{"description":"Attachment filename.","type":"string"},"size_bytes":{"description":"Attachment size in bytes.","type":"integer","minimum":0}},"required":["file_id","filename","content_type","size_bytes"],"type":"object"},"type":"array"},"replies_count":{"description":"Number of thread replies.","type":"integer","minimum":0},"content_truncated":{"description":"True when content omits message text. Fetch the full message with GET /conversation-messages/{messageId}. Absent when content is the whole message.","type":"boolean"}},"required":["id","conversation_id","conversation_name","authorWorkspaceMembershipId","author_id","author_name","content","image_urls","replies_count","created_at"],"type":"object"},"MessageResult":{"additionalProperties":false,"description":"Public message result. This intentionally omits reply lineage fields such as thread_root_id and replied_to_message_id; use the thread replies route and its thread_root_id payload field to validate thread grouping.","properties":{"authorWorkspaceMembershipId":{"description":"Canonical author workspace membership identifier. Matches legacy author_id during the compatibility window.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"author_id":{"description":"Author workspace member identifier. Deprecated: read authorWorkspaceMembershipId instead.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","deprecated":true},"author_name":{"description":"Author workspace member display name.","type":"string","nullable":true},"call_id":{"description":"Associated Jam identifier. Null for messages without a Jam; absent on older deployments.","type":"string","nullable":true},"content":{"description":"Message markdown content.","type":"string","nullable":true},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"created_at":{"description":"Message creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"id":{"description":"Message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"image_urls":{"description":"Image URLs extracted from the message.","items":{"description":"Image URL.","type":"string","format":"uri"},"type":"array"},"attachments":{"description":"Files attached to the message. Use file_id with GET /files/{fileId} or the get_file MCP tool to obtain a short-lived download URL.","items":{"additionalProperties":false,"description":"Message attachment metadata.","properties":{"content_type":{"description":"Attachment MIME content type.","type":"string"},"file_id":{"description":"Attachment file identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"filename":{"description":"Attachment filename.","type":"string"},"size_bytes":{"description":"Attachment size in bytes.","type":"integer","minimum":0}},"required":["file_id","filename","content_type","size_bytes"],"type":"object"},"type":"array"},"forward_source":{"$ref":"#/components/schemas/MessageForwardSource"},"reactions":{"description":"Emoji reaction counts on the message.","items":{"$ref":"#/components/schemas/MessageReactionSummary"},"type":"array"},"replies_count":{"description":"Number of thread replies.","type":"integer","minimum":0}},"required":["id","conversation_id","conversation_name","authorWorkspaceMembershipId","author_id","author_name","content","image_urls","attachments","reactions","replies_count","created_at"],"type":"object"},"MessageForwardSource":{"additionalProperties":false,"description":"What a forwarded message carries from its source. Present only on forwarded messages; absent on older deployments. A show_message forward shares the snapshot captured at forward time with every reader of the forwarded message. A link_only forward shares no source content. Source identifiers are present only when the reader can open the source conversation.","properties":{"call_id":{"description":"Call explicitly shared by this destination message. Pass the destination message ID as forwarded_message_id to call reads.","type":"string"},"author_id":{"description":"Source author workspace membership identifier. Null for link_only forwards.","type":"string","nullable":true},"author_name":{"description":"Source author display name at forward time. Null for link_only forwards.","type":"string","nullable":true},"can_open_source":{"description":"Whether the reader can open the source conversation.","type":"boolean"},"content":{"description":"Source message markdown captured at forward time. Null for link_only forwards.","type":"string","nullable":true},"file_names":{"description":"Names of files attached to the source message at forward time. Empty for link_only forwards.","items":{"description":"Attachment filename.","type":"string"},"type":"array"},"is_thread_reply":{"description":"Whether the source message is a thread reply.","type":"boolean"},"share_mode":{"description":"What the forwarder chose to share.","enum":["show_message","link_only"],"type":"string"},"source_conversation_id":{"description":"Source conversation identifier. Null unless the reader can open the source.","type":"string","nullable":true},"source_conversation_name":{"description":"Current source conversation name. Null unless the reader can open the source.","type":"string","nullable":true},"source_created_at":{"description":"Source message creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"source_kind":{"description":"Kind of source message.","enum":["message","jam_call_card"],"type":"string"},"source_message_id":{"description":"Source message identifier. Null unless the reader can open the source.","type":"string","nullable":true},"source_subtitle":{"description":"Where the source was posted, captured at forward time: #channel-name, a channel, or a direct message. Null for link_only forwards.","type":"string","nullable":true},"source_thread_root_id":{"description":"Source thread root identifier for thread replies. Null unless the reader can open the source.","type":"string","nullable":true}},"required":["share_mode","source_kind","can_open_source","source_message_id","source_conversation_id","source_thread_root_id","source_conversation_name","source_subtitle","source_created_at","is_thread_reply","author_id","author_name","content","file_names"],"type":"object"},"MessageReactionSummary":{"additionalProperties":false,"description":"Emoji reaction count for a message.","properties":{"count":{"description":"Number of reactions for this emoji.","type":"integer","minimum":0},"emoji_text":{"description":"Emoji text.","type":"string"}},"required":["emoji_text","count"],"type":"object"},"MessageResultResponse":{"additionalProperties":false,"description":"Message detail response with the standard public data envelope plus legacy top-level aliases.","properties":{"authorWorkspaceMembershipId":{"description":"Canonical author workspace membership identifier. Matches legacy author_id during the compatibility window.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"author_id":{"description":"Author workspace member identifier. Deprecated: read authorWorkspaceMembershipId instead.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p","deprecated":true},"author_name":{"description":"Author workspace member display name.","type":"string","nullable":true},"content":{"description":"Message markdown content.","type":"string","nullable":true},"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"created_at":{"description":"Message creation timestamp.","type":"string","example":"2026-05-14T08:00:00.000Z","format":"date-time"},"data":{"$ref":"#/components/schemas/MessageResult"},"id":{"description":"Message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"image_urls":{"description":"Image URLs extracted from the message.","items":{"description":"Image URL.","type":"string","format":"uri"},"type":"array"},"reactions":{"description":"Emoji reaction counts on the message.","items":{"$ref":"#/components/schemas/MessageReactionSummary"},"type":"array"},"replies_count":{"description":"Number of thread replies.","type":"integer","minimum":0}},"required":["data","id","conversation_id","conversation_name","authorWorkspaceMembershipId","author_id","author_name","content","image_urls","reactions","replies_count","created_at"],"type":"object"},"PublicApiErrorResponse":{"additionalProperties":false,"description":"Target public API error envelope.","properties":{"error":{"additionalProperties":false,"description":"Error details.","properties":{"code":{"description":"Machine-readable error code.","type":"string"},"message":{"description":"Human-readable error message.","type":"string"},"request_id":{"description":"Request identifier.","type":"string","nullable":true}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"PublicApiPageInfo":{"additionalProperties":false,"description":"Target public API pagination metadata with snake_case field names.","properties":{"end_cursor":{"description":"Cursor for the last item.","type":"string","nullable":true},"has_next_page":{"description":"Whether another page exists after this page.","type":"boolean"},"has_previous_page":{"description":"Whether another page exists before this page.","type":"boolean"},"next_cursor":{"description":"Cursor for the next page.","type":"string","nullable":true},"previous_cursor":{"description":"Cursor for the previous page.","type":"string","nullable":true},"start_cursor":{"description":"Cursor for the first item.","type":"string","nullable":true}},"required":["has_next_page"],"type":"object"},"SearchCallsResponse":{"additionalProperties":false,"description":"Search calls response. Results are returned in data.items; top-level items is a compatibility alias.","properties":{"data":{"additionalProperties":false,"description":"Standard public response data. New clients should read data.items.","properties":{"items":{"description":"Call results.","items":{"$ref":"#/components/schemas/CallResult"},"type":"array"}},"required":["items"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/CallResult"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"SearchConversationsResponse":{"additionalProperties":false,"description":"Search conversations response. Results are returned in data.items; top-level items is a compatibility alias.","properties":{"data":{"additionalProperties":false,"description":"Standard paginated public response data.","properties":{"items":{"description":"Conversation results.","items":{"$ref":"#/components/schemas/ConversationResult"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"}},"required":["items","page_info"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/ConversationResult"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"SearchMembersResponse":{"additionalProperties":false,"description":"Search workspace members response. Results are returned in data.items; top-level items is a compatibility alias.","properties":{"data":{"additionalProperties":false,"description":"Standard paginated public response data.","properties":{"items":{"description":"Workspace member results.","items":{"$ref":"#/components/schemas/MemberResult"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"}},"required":["items","page_info"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/MemberResult"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"SearchMessagesResponse":{"additionalProperties":false,"description":"Search messages response. Results are returned in data.items; top-level items is a compatibility alias.","properties":{"data":{"additionalProperties":false,"description":"Standard paginated public response data.","properties":{"items":{"description":"Message results.","items":{"$ref":"#/components/schemas/PublicApiSearchMessageResult"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"}},"required":["items","page_info"],"type":"object"},"items":{"description":"Compatibility alias for data.items. New clients should read data.items.","items":{"$ref":"#/components/schemas/PublicApiSearchMessageResult"},"type":"array","deprecated":true}},"required":["data","items"],"type":"object"},"ThreadRepliesResponse":{"additionalProperties":false,"description":"Thread replies response with the standard public data envelope plus legacy top-level aliases. The response-level thread_root_id identifies the requested root; individual MessageResult items do not expose reply lineage metadata.","properties":{"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"data":{"$ref":"#/components/schemas/ThreadRepliesData"},"items":{"description":"Thread reply messages.","items":{"$ref":"#/components/schemas/MessageResult"},"type":"array"},"pageInfo":{"$ref":"#/components/schemas/LegacyPageInfo"},"thread_root_id":{"description":"Thread root message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["data","thread_root_id","conversation_id","conversation_name","items","pageInfo"],"type":"object"},"ThreadRepliesData":{"additionalProperties":false,"description":"Standard thread replies payload. Use thread_root_id here to validate thread grouping; individual MessageResult items intentionally omit thread_root_id and replied_to_message_id.","properties":{"conversation_id":{"description":"Conversation identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"},"conversation_name":{"description":"Conversation name.","type":"string","nullable":true},"items":{"description":"Thread reply messages.","items":{"$ref":"#/components/schemas/MessageResult"},"type":"array"},"page_info":{"$ref":"#/components/schemas/PublicApiPageInfo"},"thread_root_id":{"description":"Thread root message identifier.","type":"string","example":"01jzn7e61x3a7v9h2r7t2m3q4p"}},"required":["thread_root_id","conversation_id","conversation_name","items","page_info"],"type":"object"}},"securitySchemes":{"AndoApiKey":{"description":"Workspace API key. Current accepted keys use the ando_sk_ prefix.","in":"header","name":"x-api-key","type":"apiKey"},"BearerApiKey":{"bearerFormat":"ando_sk","description":"Compatibility transport for workspace API keys.","scheme":"bearer","type":"http"}}},"info":{"description":"Generated from Ando's accepted public API v1 contract metadata. Current routes preserve legacy /api/v1 response envelopes while converging on the public https://api.ando.so/v1 shape.","title":"Ando Public API","version":"v1"},"openapi":"3.0.3","paths":{"/conversations":{"get":{"description":"Lists active conversations the authenticated workspace member belongs to. The cursor follows membership order and remains valid as memberships change.","operationId":"listConversations","parameters":[{"description":"Maximum number of conversations to return.","in":"query","name":"limit","schema":{"description":"Maximum number of conversations to return.","type":"integer","maximum":100,"minimum":1}},{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it unchanged with the same query and filters.","in":"query","name":"cursor","schema":{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it unchanged with the same query and filters.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"conversations":{"summary":"Membership-scoped conversations.","value":{"data":{"items":[{"id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Launch planning","type":0,"description":"Launch coordination.","human_members_count":8,"agent_members_count":2}],"page_info":{"has_next_page":true,"next_cursor":"opaque-conversation-membership-cursor"}},"items":[{"id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Launch planning","type":0,"description":"Launch coordination.","human_members_count":8,"agent_members_count":2}]}}},"schema":{"$ref":"#/components/schemas/ListConversationsResponse"}}},"description":"Membership-scoped conversations."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List conversations","tags":["Conversations"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversations.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/conversations","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"post":{"description":"Creates a channel in the authenticated workspace. Same operation as the MCP create_channel tool: channels are public unless access_control_type is \"private\", the caller always joins, and a name already used by an active channel returns 409 channel_name_conflict.","operationId":"createConversation","requestBody":{"content":{"application/json":{"examples":{"channel":{"summary":"Create a public channel with one invited member.","value":{"name":"errors","access_control_type":"public","member_ids":["11111111-1111-4111-8111-111111111111"]}}},"schema":{"$ref":"#/components/schemas/CreateConversationBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"channel":{"summary":"Created channel.","value":{"data":{"access_control_type":"public","conversation_id":"22222222-2222-4222-8222-222222222222","member_ids":["33333333-3333-4333-8333-333333333333","11111111-1111-4111-8111-111111111111"],"name":"errors"}}}},"schema":{"$ref":"#/components/schemas/CreateConversationResponse"}}},"description":"Created channel."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Create a channel","tags":["Conversations"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversations.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/conversations","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/conversations/{conversationId}":{"get":{"description":"Returns an active conversation when the authenticated workspace member currently belongs to it. Missing and inaccessible conversations both return not found.","operationId":"getConversation","parameters":[{"description":"Conversation identifier.","in":"path","name":"conversationId","required":true,"schema":{"description":"Conversation identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"conversation":{"summary":"Conversation details.","value":{"data":{"id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Launch planning","type":0,"description":"Launch coordination.","human_members_count":8,"agent_members_count":2}}}},"schema":{"$ref":"#/components/schemas/ConversationResultResponse"}}},"description":"Conversation details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a conversation","tags":["Conversations"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversations_by_conversationid.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/conversations/:conversationId","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/conversations/{conversationId}/context":{"get":{"description":"Returns bounded conversation context for a current member, with display-only member records and no internal buffers or memory fields. Missing and inaccessible conversations return not found.","operationId":"getConversationContext","parameters":[{"description":"Conversation identifier.","in":"path","name":"conversationId","required":true,"schema":{"description":"Conversation identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConversationContextResponse"}}},"description":"Authorized conversation context."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get conversation context","tags":["Conversations"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversations_by_conversationid_context.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/conversations/:conversationId/context","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/calls/{callId}":{"get":{"description":"Returns call metadata, participants, summary, and timing.","operationId":"getCall","parameters":[{"description":"Call identifier.","in":"path","name":"callId","required":true,"schema":{"description":"Call identifier.","type":"string"}},{"description":"Destination message containing a shared Jam forward. Grants only that call when the caller can read the message.","in":"query","name":"forwarded_message_id","schema":{"description":"Destination message containing a shared Jam forward. Grants only that call when the caller can read the message.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallResponse"}}},"description":"Call details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a call","tags":["Calls"],"x-ando-compatibility-mode":"legacy_api_v1_compatibility","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_calls_by_callid.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/calls/:callId","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/calls/{callId}/transcript":{"get":{"description":"Returns transcript segments for a call.","operationId":"getCallTranscript","parameters":[{"description":"Call identifier.","in":"path","name":"callId","required":true,"schema":{"description":"Call identifier.","type":"string"}},{"description":"Destination message containing a shared Jam forward. Include on every transcript page.","in":"query","name":"forwarded_message_id","schema":{"description":"Destination message containing a shared Jam forward. Include on every transcript page.","type":"string"}},{"description":"Maximum number of records to return.","in":"query","name":"limit","schema":{"description":"Maximum number of records to return.","type":"integer","minimum":1}},{"description":"Pagination cursor.","in":"query","name":"cursor","schema":{"description":"Pagination cursor.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallTranscriptResponse"}}},"description":"Call transcript."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a call transcript","tags":["Calls"],"x-ando-compatibility-mode":"legacy_api_v1_compatibility","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_calls_by_callid_transcript.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/calls/:callId/transcript","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/conversation-messages/{messageId}":{"get":{"description":"Returns a single conversation message by identifier. Requires messages:read and access to the conversation.","operationId":"getConversationMessage","parameters":[{"description":"Message identifier.","in":"path","name":"messageId","required":true,"schema":{"description":"Message identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"message":{"summary":"Message details.","value":{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z","data":{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z"}}}},"schema":{"$ref":"#/components/schemas/MessageResultResponse"}}},"description":"Message details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a message","tags":["Messages"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversation_messages_by_messageid.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/conversation-messages/:messageId","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"patch":{"description":"Replaces the markdown body of a message authored by the authenticated API-key workspace membership. Each accepted edit marks the message as edited and emits a message.updated ProductEvent to webhook and realtime subscribers. Attachments, thread placement, and authorship are fixed at create time and are not editable. Sending a body identical to the stored one is a no-op: the message keeps its revision and no event is emitted. Editing does not create new mentions or notifications.","operationId":"updateConversationMessage","parameters":[{"description":"Message identifier.","in":"path","name":"messageId","required":true,"schema":{"description":"Message identifier.","type":"string"}}],"requestBody":{"content":{"application/json":{"examples":{"progress":{"summary":"Repaint a message with run progress.","value":{"markdown_content":"Step 3 of 5: running the migration test suite…"}}},"schema":{"$ref":"#/components/schemas/UpdateConversationMessageBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"message":{"summary":"Updated message.","value":{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Step 3 of 5: running the migration test suite…","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z","data":{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Step 3 of 5: running the migration test suite…","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z"}}}},"schema":{"$ref":"#/components/schemas/MessageResultResponse"}}},"description":"Updated message."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Update a message","tags":["Messages"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversation_messages_by_messageid.patch","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/conversation-messages/:messageId","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/conversation-messages/{messageId}/replies":{"get":{"description":"Returns replies for a thread root message in chronological order. Requires messages:read and access to the conversation. Use before to fetch the nearest preceding replies, or after to page forward; the two cursors are mutually exclusive.","operationId":"listThreadReplies","parameters":[{"description":"Thread root message identifier.","in":"path","name":"messageId","required":true,"schema":{"description":"Thread root message identifier.","type":"string"}},{"description":"Maximum number of records to return.","in":"query","name":"limit","schema":{"description":"Maximum number of records to return.","type":"integer","minimum":1}},{"description":"Cursor or ISO timestamp after which results should be returned.","in":"query","name":"after","schema":{"description":"Cursor or ISO timestamp after which results should be returned.","type":"string"}},{"description":"Opaque cursor identifying a reply in this thread. Returns the nearest earlier replies; mutually exclusive with after.","in":"query","name":"before","schema":{"type":"string","description":"Opaque cursor identifying a reply in this thread."}}],"responses":{"200":{"content":{"application/json":{"examples":{"replies":{"summary":"Thread replies.","value":{"data":{"thread_root_id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","items":[{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4r","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Follow-up looks good.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":0,"created_at":"2026-05-14T08:05:00.000Z"}],"page_info":{"end_cursor":"2026-05-14T08:05:00.000Z","has_next_page":false,"has_previous_page":false,"next_cursor":"2026-05-14T08:05:00.000Z","start_cursor":"2026-05-14T08:05:00.000Z"}},"thread_root_id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","items":[{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4r","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Follow-up looks good.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":0,"created_at":"2026-05-14T08:05:00.000Z"}],"pageInfo":{"hasNextPage":false,"hasPreviousPage":false,"startCursor":"2026-05-14T08:05:00.000Z","endCursor":"2026-05-14T08:05:00.000Z"}}}},"schema":{"$ref":"#/components/schemas/ThreadRepliesResponse"}}},"description":"Thread replies."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List thread replies","tags":["Messages"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversation_messages_by_messageid_replies.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/conversation-messages/:messageId/replies","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/conversations/{conversationId}/messages":{"get":{"description":"Returns messages in a conversation. Requires messages:read and access to the conversation.","operationId":"listConversationMessages","parameters":[{"description":"Conversation identifier.","in":"path","name":"conversationId","required":true,"schema":{"description":"Conversation identifier.","type":"string"}},{"description":"Maximum number of records to return.","in":"query","name":"limit","schema":{"description":"Maximum number of records to return.","type":"integer","minimum":1}},{"description":"Cursor or ISO timestamp before which results should be returned.","in":"query","name":"before","schema":{"description":"Cursor or ISO timestamp before which results should be returned.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"messages":{"summary":"Conversation messages.","value":{"data":{"conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","items":[{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z"}],"page_info":{"end_cursor":"2026-05-14T07:45:00.000Z","has_next_page":true,"has_previous_page":false,"next_cursor":"2026-05-14T08:00:00.000Z","start_cursor":"2026-05-14T08:00:00.000Z"}},"conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","items":[{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z"}],"pageInfo":{"hasNextPage":true,"hasPreviousPage":false,"startCursor":"2026-05-14T08:00:00.000Z","endCursor":"2026-05-14T07:45:00.000Z"}}}},"schema":{"$ref":"#/components/schemas/ConversationMessagesResponse"}}},"description":"Conversation messages."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List conversation messages","tags":["Messages"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversations_by_conversationid_messages.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/conversations/:conversationId/messages","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"post":{"description":"Creates a message in a conversation using the authenticated API-key workspace membership as the author.","operationId":"createConversationMessage","parameters":[{"description":"Conversation identifier.","in":"path","name":"conversationId","required":true,"schema":{"description":"Conversation identifier.","type":"string"}},{"description":"Required idempotency key for safely retrying this write.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"message":{"summary":"Create a top-level message.","value":{"markdown_content":"Can you review this?","explicit_context_message_ids":[],"image_urls":[],"file_ids":[],"suppressed_link_preview_urls":[],"thread_root_id":null}}},"schema":{"$ref":"#/components/schemas/CreateConversationMessageBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"created":{"summary":"Created message.","value":{"success":true,"data":{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"attachments":[],"reactions":[{"emoji_text":":thumbsup:","count":2}],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z"},"legacy_data":null}}},"schema":{"$ref":"#/components/schemas/CreateConversationMessageResponse"}}},"description":"Created message."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Create a conversation message","tags":["Messages"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_conversations_by_conversationid_messages.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/conversations/:conversationId/messages","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/files":{"post":{"description":"Creates a file upload intent for a message attachment. The response returns temporary direct storage upload instructions; send the bytes to that URL, then complete the file before using its id in create-message file_ids. Replay the same request with the same Idempotency-Key and body to refresh an active upload URL.","operationId":"createFile","parameters":[{"description":"Required idempotency key for safely retrying this write.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"file":{"summary":"Create a message attachment file upload.","value":{"filename":"report.pdf","content_type":"application/pdf","size_bytes":12345,"purpose":"message_attachment","sha256":null,"client_upload_id":"local-upload-42"}}},"schema":{"$ref":"#/components/schemas/CreatePublicFileBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"file":{"summary":"Existing file upload intent.","value":{"data":{"object":"file","id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","status":"waiting_for_upload","purpose":"message_attachment","filename":"report.pdf","content_type":"application/pdf","size_bytes":12345,"created_at":"2026-05-14T08:00:00.000Z","updated_at":"2026-05-14T08:00:00.000Z","upload":{"kind":"single_part_presigned_put","method":"PUT","url":"https://storage.example/upload","headers":{"Content-Length":"12345","Content-Type":"application/pdf","x-amz-meta-ando-file-id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"},"expires_at":"2026-05-14T08:15:00.000Z"}},"file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"}}},"schema":{"$ref":"#/components/schemas/PublicFileResponse"}}},"description":"Existing file upload intent for a matching idempotency key."},"201":{"content":{"application/json":{"examples":{"file":{"summary":"Created file upload intent.","value":{"data":{"object":"file","id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","status":"waiting_for_upload","purpose":"message_attachment","filename":"report.pdf","content_type":"application/pdf","size_bytes":12345,"created_at":"2026-05-14T08:00:00.000Z","updated_at":"2026-05-14T08:00:00.000Z","upload":{"kind":"single_part_presigned_put","method":"PUT","url":"https://storage.example/upload","headers":{"Content-Length":"12345","Content-Type":"application/pdf","x-amz-meta-ando-file-id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"},"expires_at":"2026-05-14T08:15:00.000Z"}},"file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"}}},"schema":{"$ref":"#/components/schemas/PublicFileResponse"}}},"description":"Created file upload intent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Create a file","tags":["Files"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_files.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/files","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"express","x-ando-target-runtime":"express"}},"/files/{fileId}":{"get":{"description":"Returns metadata and a short-lived download URL when the authenticated principal uploaded the file or can currently read a live message containing it. Incomplete uploads remain visible only to the API key that created the upload intent.","operationId":"getFile","parameters":[{"description":"File identifier.","in":"path","name":"fileId","required":true,"schema":{"description":"File identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"file":{"summary":"Ready file.","value":{"data":{"object":"file","id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","status":"ready","purpose":"message_attachment","filename":"report.pdf","content_type":"application/pdf","size_bytes":12345,"created_at":"2026-05-14T08:00:00.000Z","updated_at":"2026-05-14T08:03:00.000Z","upload":null,"download":{"method":"GET","url":"https://storage.example/download/report.pdf","expires_at":"2026-05-14T08:04:00.000Z"}},"file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"}}},"schema":{"$ref":"#/components/schemas/PublicFileResponse"}}},"description":"File lifecycle state."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a file","tags":["Files"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_files_by_fileid.get","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/files/:fileId","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"express","x-ando-target-runtime":"express"}},"/files/{fileId}/complete":{"post":{"description":"Completes a direct storage upload after the client has sent the bytes to the upload URL. The route verifies storage metadata and returns a ready file when the upload is attachable.","operationId":"completeFileUpload","parameters":[{"description":"File identifier.","in":"path","name":"fileId","required":true,"schema":{"description":"File identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"file":{"summary":"Completed file upload.","value":{"data":{"object":"file","id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","status":"ready","purpose":"message_attachment","filename":"report.pdf","content_type":"application/pdf","size_bytes":12345,"created_at":"2026-05-14T08:00:00.000Z","updated_at":"2026-05-14T08:03:00.000Z","upload":null,"download":{"method":"GET","url":"https://storage.example/download/report.pdf","expires_at":"2026-05-14T08:04:00.000Z"}},"file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"}}},"schema":{"$ref":"#/components/schemas/PublicFileResponse"}}},"description":"Completed file upload."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Complete a file upload","tags":["Files"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_files_by_fileid_complete.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/files/:fileId/complete","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"express","x-ando-target-runtime":"express"}},"/files/{fileId}/abort":{"post":{"description":"Aborts an active direct storage upload and makes the file id unusable for message attachments.","operationId":"abortFileUpload","parameters":[{"description":"File identifier.","in":"path","name":"fileId","required":true,"schema":{"description":"File identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"file":{"summary":"Aborted file upload.","value":{"data":{"object":"file","id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p","status":"aborted","purpose":"message_attachment","filename":"report.pdf","content_type":"application/pdf","size_bytes":12345,"created_at":"2026-05-14T08:00:00.000Z","updated_at":"2026-05-14T08:02:00.000Z","upload":null},"file_id":"file_01jzn7e61x3a7v9h2r7t2m3q4p"}}},"schema":{"$ref":"#/components/schemas/PublicFileResponse"}}},"description":"Aborted file upload."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Abort a file upload","tags":["Files"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_files_by_fileid_abort.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/files/:fileId/abort","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"express","x-ando-target-runtime":"express"}},"/realtime/connections":{"post":{"description":"Opens a temporary pre-authorized public realtime websocket connection URL for RFC 085 ProductEvent delivery. API keys are validated only on this HTTP route; the websocket uses the returned temporary ticket URL and the ando.realtime.v1 subprotocol.","operationId":"openRealtimeConnection","requestBody":{"content":{"application/json":{"examples":{"messageCreatedEvents":{"summary":"Subscribe to message.created events readable by the authenticated principal.","value":{"subscriptions":[{"target":"self","delivery":"messages","events":["message.created"]}]}}},"schema":{"$ref":"#/components/schemas/OpenRealtimeConnectionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"connection":{"summary":"Temporary realtime connection URL.","value":{"url":"wss://realtime.ando.so/link?ticket=rtconn_opaque_temporary_ticket","expires_at":"2026-05-29T01:00:00.000Z","expires_in_seconds":60,"connection_id":"rtconn_01jzn7e61x3a7v9h2r7t2m3q4p","protocol":"ando.realtime.v1","heartbeat_interval_seconds":30,"approximate_connection_time_seconds":null,"resume_supported":true,"resume_cursor":"rtcur_v2_initial_01jzn7e61x3a7v9h2r7t2m3q4p","subscription_source":"explicit","effective_wake_policy":null,"subscriptions":[{"id":"rtsub_01jzn7e61x3a7v9h2r7t2m3q4p","target":{"type":"workspace_membership","id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p"},"delivery":"messages","events":["message.created"]}]}}},"schema":{"$ref":"#/components/schemas/OpenRealtimeConnectionResponse"}}},"description":"Opened temporary realtime connection."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"content":{"application/json":{"examples":{"realtimeUnavailable":{"summary":"Realtime unavailable.","value":{"error":{"code":"realtime_unavailable","message":"Public realtime connection opening is not available yet."}}}},"schema":{"$ref":"#/components/schemas/PublicApiErrorResponse"}}},"description":"Public realtime connection opening is not available in this deployment."}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Open a realtime connection","tags":["Realtime"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_realtime_connections.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"runtime_boundary","x-ando-public-path":"/v1/realtime/connections","x-ando-runtime-owner":"backend_runtime","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"express","x-ando-target-runtime":"express"}},"/webhook-sources":{"get":{"description":"Lists the workspace's active inbound webhook sources (external services delivering events into Ando).","operationId":"listWebhookSources","parameters":[{"description":"Page size, 1-100. Defaults to 50.","in":"query","name":"limit","schema":{"description":"Page size, 1-100. Defaults to 50.","type":"string"}},{"description":"Pagination cursor from the previous page's page_info.","in":"query","name":"cursor","schema":{"description":"Pagination cursor from the previous page's page_info.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"sources":{"summary":"Active inbound sources.","value":{"data":{"items":[{"display_name":"Sentry","ingress_url":"https://api.ando.so/webhooks/inbound/44444444-4444-4444-8444-444444444444","provider":"sentry","source_id":"55555555-5555-4555-8555-555555555555","status":"active"}],"page_info":{"has_next_page":false,"next_cursor":null}}}}},"schema":{"$ref":"#/components/schemas/ListWebhookSourcesResponse"}}},"description":"Active inbound webhook sources."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List webhook sources","tags":["Webhook sources"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_sources.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/webhook-sources","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"post":{"description":"Creates an inbound webhook source for a supported provider preset. Requires an API key bound to a live workspace admin or owner with webhooks:write. The ingress URL and signing secret response can be replayed with the same Idempotency-Key for 24 hours; after that the secret is not retrievable. Configure the URL and secret in the external service, then attach a route to deliver its events into a conversation.","operationId":"createWebhookSource","parameters":[{"description":"Required key for safe retries. Reusing it with different parameters returns 409 idempotency_conflict. The original result can be replayed for 24 hours while the created source or route remains unchanged.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"sentry":{"summary":"Create a Sentry source.","value":{"provider":"sentry"}}},"schema":{"$ref":"#/components/schemas/CreateWebhookSourceBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"source":{"summary":"Created source with its one-time signing secret.","value":{"data":{"display_name":"Sentry","ingress_url":"https://api.ando.so/webhooks/inbound/44444444-4444-4444-8444-444444444444","provider":"sentry","signing_secret":"whsec_example_secret_shown_once","source_id":"55555555-5555-4555-8555-555555555555","status":"active"}}}},"schema":{"$ref":"#/components/schemas/CreateWebhookSourceResponse"}}},"description":"Created inbound webhook source."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Create a webhook source","tags":["Webhook sources"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_sources.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-sources","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-sources/{sourceId}/routes":{"post":{"description":"Routes a source's events into a conversation the authenticated member belongs to. Requires an API key bound to a live workspace admin or owner with webhooks:write. Omit events to route everything; pass provider preset event ids to filter. The result can be replayed with the same Idempotency-Key for 24 hours while the route remains unchanged.","operationId":"createWebhookSourceRoute","parameters":[{"description":"Webhook source identifier.","in":"path","name":"sourceId","required":true,"schema":{"description":"Webhook source identifier.","type":"string"}},{"description":"Required key for safe retries. Reusing it with different parameters returns 409 idempotency_conflict. The original result can be replayed for 24 hours while the created source or route remains unchanged.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"route":{"summary":"Route Sentry issue events into a channel.","value":{"conversation_id":"66666666-6666-4666-8666-666666666666","events":["issue_created","issue_resolved"]}}},"schema":{"$ref":"#/components/schemas/CreateWebhookSourceRouteBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"examples":{"route":{"summary":"Created route.","value":{"data":{"conversation_id":"66666666-6666-4666-8666-666666666666","route_id":"77777777-7777-4777-8777-777777777777"}}}},"schema":{"$ref":"#/components/schemas/CreateWebhookSourceRouteResponse"}}},"description":"Created event route."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Route source events to a conversation","tags":["Webhook sources"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_sources_by_sourceid_routes.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-sources/:sourceId/routes","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-endpoints":{"post":{"description":"Creates a workspace webhook endpoint and returns its signing secret exactly once.","operationId":"createWebhookEndpoint","requestBody":{"content":{"application/json":{"examples":{"endpoint":{"summary":"Create a webhook endpoint.","value":{"name":"Production receiver","url":"https://example.com/ando/webhooks","enabled_events":["webhook.test","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated"]}}},"schema":{"$ref":"#/components/schemas/CreateWebhookEndpointBody"}}},"required":true},"responses":{"201":{"content":{"application/json":{"examples":{"created":{"summary":"Created endpoint with one-time signing secret.","value":{"data":{"object":"webhook_endpoint","id":"wep_01jzn7e61x3a7v9h2r7t2m3q4p","workspace_id":"workspace_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Production receiver","url":"https://example.com/ando/webhooks","enabled_events":["webhook.test","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated"],"delivery_scope":{"type":"workspace_member","actor_workspace_membership_id":"wsm_01jzn7e61x3a7v9h2r7t2m3q4p","direct_message_delivery_enabled":false},"status":"active","signing_secret_prefix":"example","previous_signing_secret_expires_at":null,"disabled_at":null,"created_at":"2026-05-27T08:00:00.000Z","updated_at":"2026-05-27T08:00:00.000Z","signing_secret":"example"}}}},"schema":{"$ref":"#/components/schemas/WebhookEndpointSecretResponse"}}},"description":"Created webhook endpoint."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Create a webhook endpoint","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_endpoints.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-endpoints","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"get":{"description":"Lists workspace webhook endpoint metadata.","operationId":"listWebhookEndpoints","responses":{"200":{"content":{"application/json":{"examples":{"endpoints":{"summary":"Webhook endpoints.","value":{"data":{"items":[{"object":"webhook_endpoint","id":"wep_01jzn7e61x3a7v9h2r7t2m3q4p","workspace_id":"workspace_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Production receiver","url":"https://example.com/ando/webhooks","enabled_events":["webhook.test","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated"],"delivery_scope":{"type":"workspace_member","actor_workspace_membership_id":"wsm_01jzn7e61x3a7v9h2r7t2m3q4p","direct_message_delivery_enabled":false},"status":"active","signing_secret_prefix":"example","previous_signing_secret_expires_at":null,"disabled_at":null,"created_at":"2026-05-27T08:00:00.000Z","updated_at":"2026-05-27T08:00:00.000Z"}]},"items":[{"object":"webhook_endpoint","id":"wep_01jzn7e61x3a7v9h2r7t2m3q4p","workspace_id":"workspace_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Production receiver","url":"https://example.com/ando/webhooks","enabled_events":["webhook.test","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated"],"delivery_scope":{"type":"workspace_member","actor_workspace_membership_id":"wsm_01jzn7e61x3a7v9h2r7t2m3q4p","direct_message_delivery_enabled":false},"status":"active","signing_secret_prefix":"example","previous_signing_secret_expires_at":null,"disabled_at":null,"created_at":"2026-05-27T08:00:00.000Z","updated_at":"2026-05-27T08:00:00.000Z"}]}}},"schema":{"$ref":"#/components/schemas/WebhookEndpointListResponse"}}},"description":"Webhook endpoints."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List webhook endpoints","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_endpoints.get","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/webhook-endpoints","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-endpoints/{endpointId}":{"get":{"description":"Returns webhook endpoint metadata and a recent delivery summary.","operationId":"getWebhookEndpoint","parameters":[{"description":"Webhook endpoint identifier.","in":"path","name":"endpointId","required":true,"schema":{"description":"Webhook endpoint identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointDetailResponse"}}},"description":"Webhook endpoint details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a webhook endpoint","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_endpoints_by_endpointid.get","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/webhook-endpoints/:endpointId","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"patch":{"description":"Updates webhook endpoint metadata and delivery settings.","operationId":"updateWebhookEndpoint","parameters":[{"description":"Webhook endpoint identifier.","in":"path","name":"endpointId","required":true,"schema":{"description":"Webhook endpoint identifier.","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookEndpointBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointResponse"}}},"description":"Updated webhook endpoint."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Update a webhook endpoint","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_endpoints_by_endpointid.patch","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-endpoints/:endpointId","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-endpoints/{endpointId}/rotate-secret":{"post":{"description":"Rotates a webhook endpoint signing secret and returns the new secret exactly once.","operationId":"rotateWebhookEndpointSecret","parameters":[{"description":"Webhook endpoint identifier.","in":"path","name":"endpointId","required":true,"schema":{"description":"Webhook endpoint identifier.","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateWebhookEndpointSecretBody"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointSecretResponse"}}},"description":"Rotated webhook endpoint secret."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Rotate webhook endpoint secret","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_endpoints_by_endpointid_rotate_secret.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-endpoints/:endpointId/rotate-secret","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-endpoints/{endpointId}/test":{"post":{"description":"Creates a webhook.test event and schedules delivery to one endpoint.","operationId":"sendWebhookEndpointTestEvent","parameters":[{"description":"Webhook endpoint identifier.","in":"path","name":"endpointId","required":true,"schema":{"description":"Webhook endpoint identifier.","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestEventResponse"}}},"description":"Scheduled webhook test event."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Send a webhook test event","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_endpoints_by_endpointid_test.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-endpoints/:endpointId/test","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-deliveries":{"get":{"description":"Lists webhook deliveries with optional endpoint, event, status, and creation-time filters.","operationId":"listWebhookDeliveries","parameters":[{"description":"Filter by webhook endpoint identifier.","in":"query","name":"endpoint_id","schema":{"description":"Filter by webhook endpoint identifier.","type":"string"}},{"description":"Filter by webhook event identifier.","in":"query","name":"event_id","schema":{"description":"Filter by webhook event identifier.","type":"string"}},{"description":"Filter by delivery status.","in":"query","name":"status","schema":{"description":"Filter by delivery status.","type":"string"}},{"description":"Return deliveries created after this timestamp.","in":"query","name":"created_after","schema":{"description":"Return deliveries created after this timestamp.","type":"string"}},{"description":"Return deliveries created before this timestamp.","in":"query","name":"created_before","schema":{"description":"Return deliveries created before this timestamp.","type":"string"}},{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it with identical filters.","in":"query","name":"cursor","schema":{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it with identical filters.","type":"string"}},{"description":"Maximum number of deliveries to return.","in":"query","name":"limit","schema":{"description":"Maximum number of deliveries to return.","type":"integer","maximum":10,"minimum":1}}],"responses":{"200":{"content":{"application/json":{"examples":{"deliveries":{"summary":"Webhook deliveries.","value":{"data":{"items":[{"object":"webhook_delivery","id":"whd_01jzn7e61x3a7v9h2r7t2m3q4p","workspace_id":"workspace_01jzn7e61x3a7v9h2r7t2m3q4p","endpoint_id":"wep_01jzn7e61x3a7v9h2r7t2m3q4p","endpoint_url":"https://example.com/ando/webhooks","endpoint_status":"active","endpoint_enabled_events":["webhook.test","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated"],"endpoint_signing_secret_prefix":"example","event_id":"whe_01jzn7e61x3a7v9h2r7t2m3q4p","event_type":"webhook.test","api_version":"2026-07-13","status":"scheduled","attempt_count":0,"max_attempts":8,"next_attempt_at":"2026-05-27T08:00:00.000Z","first_attempted_at":null,"last_attempted_at":null,"succeeded_at":null,"failed_at":null,"last_http_status":null,"last_error_code":null,"last_error_message":null,"replayable":false,"created_at":"2026-05-27T08:00:00.000Z","updated_at":"2026-05-27T08:00:00.000Z"}],"page_info":{"has_next_page":true,"next_cursor":"opaque-webhook-delivery-cursor"}},"items":[{"object":"webhook_delivery","id":"whd_01jzn7e61x3a7v9h2r7t2m3q4p","workspace_id":"workspace_01jzn7e61x3a7v9h2r7t2m3q4p","endpoint_id":"wep_01jzn7e61x3a7v9h2r7t2m3q4p","endpoint_url":"https://example.com/ando/webhooks","endpoint_status":"active","endpoint_enabled_events":["webhook.test","message.created","message.updated","conversation.membership.created","conversation.archived","conversation.unarchived","call.started","call.ended","call.updated","call.transcript.updated"],"endpoint_signing_secret_prefix":"example","event_id":"whe_01jzn7e61x3a7v9h2r7t2m3q4p","event_type":"webhook.test","api_version":"2026-07-13","status":"scheduled","attempt_count":0,"max_attempts":8,"next_attempt_at":"2026-05-27T08:00:00.000Z","first_attempted_at":null,"last_attempted_at":null,"succeeded_at":null,"failed_at":null,"last_http_status":null,"last_error_code":null,"last_error_message":null,"replayable":false,"created_at":"2026-05-27T08:00:00.000Z","updated_at":"2026-05-27T08:00:00.000Z"}]}}},"schema":{"$ref":"#/components/schemas/WebhookDeliveryListResponse"}}},"description":"Webhook deliveries."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List webhook deliveries","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_deliveries.get","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/webhook-deliveries","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/webhook-deliveries/{deliveryId}/replay":{"post":{"description":"Creates a fresh scheduled delivery for the same endpoint and event.","operationId":"replayWebhookDelivery","parameters":[{"description":"Webhook delivery identifier.","in":"path","name":"deliveryId","required":true,"schema":{"description":"Webhook delivery identifier.","type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookReplayResponse"}}},"description":"Scheduled webhook delivery replay."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Replay a webhook delivery","tags":["Webhooks"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_webhook_deliveries_by_deliveryid_replay.post","x-ando-required":true,"x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/webhook-deliveries/:deliveryId/replay","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/imports":{"post":{"description":"Starts moving another chat tool's history into the workspace, or resumes the existing import for the same source workspace. Requires an API key with the imports:write scope owned by a workspace owner or admin.","operationId":"createHistoryImport","requestBody":{"content":{"application/json":{"examples":{"buzz":{"summary":"Import a Buzz community.","value":{"source":"buzz","source_workspace_id":"buzz.example.com","source_workspace_name":"Example"}},"generic":{"summary":"Import another tool's history.","value":{"source":"generic","source_workspace_id":"chat.example.com/team-42","source_workspace_name":"Example"}}},"schema":{"$ref":"#/components/schemas/CreateHistoryImportBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryImportResponse"}}},"description":"The open import."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Start a history import","tags":["Imports"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_imports.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/imports","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/imports/{importId}/records":{"post":{"description":"Writes a batch of members, conversations, messages, and reactions with their original authors and timestamps. Keyed by the source tool's ids, so re-sending a batch is safe. Imported messages create no notifications or unread state.","operationId":"writeHistoryImportRecords","parameters":[{"description":"Import identifier.","in":"path","name":"importId","required":true,"schema":{"description":"Import identifier.","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryImportRecordsBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryImportRecordsResponse"}}},"description":"What was written and what was skipped."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Write history import records","tags":["Imports"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_imports_by_importid_records.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/imports/:importId/records","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/imports/{importId}/complete":{"post":{"description":"Marks the import complete. Starting the same import again reopens it, e.g. to bring over messages sent since.","operationId":"completeHistoryImport","parameters":[{"description":"Import identifier.","in":"path","name":"importId","required":true,"schema":{"description":"Import identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryImportCompleteResponse"}}},"description":"The completed import and its cumulative counts."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Complete a history import","tags":["Imports"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_imports_by_importid_complete.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/imports/:importId/complete","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/imports/{importId}/files/lookup":{"post":{"description":"Finds source files this import already uploaded and attached, so a re-run can reuse them instead of uploading again, even with a new API key.","operationId":"lookupHistoryImportFiles","parameters":[{"description":"Import identifier.","in":"path","name":"importId","required":true,"schema":{"description":"Import identifier.","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryImportFileLookupBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryImportFileLookupResponse"}}},"description":"Files already uploaded for this import."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Look up uploaded history import files","tags":["Imports"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_imports_by_importid_files_lookup.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/imports/:importId/files/lookup","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_messaging","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/members/{memberId}":{"get":{"description":"Returns a workspace member visible to the authenticated API key. The v1 path and memberId parameter are compatibility spellings for a workspace member identifier.","operationId":"getMember","parameters":[{"description":"Workspace member identifier. v1 uses the legacy memberId spelling.","in":"path","name":"memberId","required":true,"schema":{"description":"Workspace member identifier. v1 uses the legacy memberId spelling.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberResult"}}},"description":"Workspace member details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get a workspace member","tags":["Members"],"x-ando-compatibility-mode":"legacy_api_v1_compatibility","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_members_by_memberid.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/members/:memberId","x-ando-runtime-owner":"api_platform","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"express","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/search/calls":{"get":{"description":"Searches calls accessible to the authenticated API key.","operationId":"searchCalls","parameters":[{"description":"Search query text.","in":"query","name":"q","required":true,"schema":{"description":"Search query text.","type":"string"}},{"description":"Comma-separated conversation identifiers to filter to.","in":"query","name":"conversation","schema":{"description":"Comma-separated conversation identifiers to filter to.","type":"string"}},{"description":"Cursor or ISO timestamp after which results should be returned.","in":"query","name":"after","schema":{"description":"Cursor or ISO timestamp after which results should be returned.","type":"string"}},{"description":"Cursor or ISO timestamp before which results should be returned.","in":"query","name":"before","schema":{"description":"Cursor or ISO timestamp before which results should be returned.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"calls":{"summary":"Call search results.","value":{"data":{"items":[{"id":"call_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","status":"ended","duration_seconds":1800,"participant_names":["Alex Kim"],"participant_count":1,"summary":"Reviewed launch blockers.","started_at":"2026-05-14T08:00:00.000Z","ended_at":"2026-05-14T08:30:00.000Z"}]},"items":[{"id":"call_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","status":"ended","duration_seconds":1800,"participant_names":["Alex Kim"],"participant_count":1,"summary":"Reviewed launch blockers.","started_at":"2026-05-14T08:00:00.000Z","ended_at":"2026-05-14T08:30:00.000Z"}]}}},"schema":{"$ref":"#/components/schemas/SearchCallsResponse"}}},"description":"Call search results."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Search calls","tags":["Search"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_search_calls.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/search/calls","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_search_read","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/search/conversations":{"get":{"description":"Searches conversations accessible to the authenticated API key.","operationId":"searchConversations","parameters":[{"description":"Search query text.","in":"query","name":"q","required":true,"schema":{"description":"Search query text.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"conversations":{"summary":"Conversation search results.","value":{"data":{"items":[{"id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Launch planning","type":0,"description":"Launch coordination.","human_members_count":8,"agent_members_count":2}],"page_info":{"has_next_page":true,"next_cursor":"opaque-webhook-delivery-cursor"}},"items":[{"id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","name":"Launch planning","type":0,"description":"Launch coordination.","human_members_count":8,"agent_members_count":2}]}}},"schema":{"$ref":"#/components/schemas/SearchConversationsResponse"}}},"description":"Conversation search results."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Search conversations","tags":["Search"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_search_conversations.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/search/conversations","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_search_read","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/search/members":{"get":{"description":"Searches workspace members in the authenticated API key workspace. The v1 path keeps the /search/members compatibility spelling.","operationId":"searchMembers","parameters":[{"description":"Search query text.","in":"query","name":"q","required":true,"schema":{"description":"Search query text.","type":"string"}},{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it unchanged with the same query and filters.","in":"query","name":"cursor","schema":{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it unchanged with the same query and filters.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"members":{"summary":"Workspace member search results.","value":{"data":{"items":[{"id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","workspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","display_name":"Alex Kim","email":"alex@example.com","title":"Engineering","profile_image_url":null}],"page_info":{"has_next_page":true,"next_cursor":"opaque-webhook-delivery-cursor"}},"items":[{"id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","workspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","display_name":"Alex Kim","email":"alex@example.com","title":"Engineering","profile_image_url":null}]}}},"schema":{"$ref":"#/components/schemas/SearchMembersResponse"}}},"description":"Workspace member search results."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Search workspace members","tags":["Search"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_search_members.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/search/members","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_search_read","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/search/messages":{"get":{"description":"Searches messages in conversations accessible to the authenticated API key.","operationId":"searchMessages","parameters":[{"description":"Search query text.","in":"query","name":"q","required":true,"schema":{"description":"Search query text.","type":"string"}},{"description":"Comma-separated author workspace member identifiers.","in":"query","name":"author","schema":{"description":"Comma-separated author workspace member identifiers.","type":"string"}},{"description":"Comma-separated conversation identifiers.","in":"query","name":"conversation","schema":{"description":"Comma-separated conversation identifiers.","type":"string"}},{"description":"Thread root message identifier.","in":"query","name":"thread","schema":{"description":"Thread root message identifier.","type":"string"}},{"description":"Cursor or ISO timestamp after which results should be returned.","in":"query","name":"after","schema":{"description":"Cursor or ISO timestamp after which results should be returned.","type":"string"}},{"description":"Cursor or ISO timestamp before which results should be returned.","in":"query","name":"before","schema":{"description":"Cursor or ISO timestamp before which results should be returned.","type":"string"}},{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it unchanged with the same query and filters.","in":"query","name":"cursor","schema":{"description":"Opaque cursor returned by data.page_info.next_cursor. Reuse it unchanged with the same query and filters.","type":"string"}},{"description":"Deprecated compatibility parameter. Only full-text is accepted; semantic is rejected until genuine semantic retrieval ships.","in":"query","name":"mode","schema":{"description":"Search mode.","enum":["full-text"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"messages":{"summary":"Message search results.","value":{"data":{"items":[{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p"}],"page_info":{"has_next_page":true,"next_cursor":"opaque-webhook-delivery-cursor"}},"items":[{"id":"msg_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_id":"conv_01jzn7e61x3a7v9h2r7t2m3q4p","conversation_name":"Launch planning","author_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","author_name":"Alex Kim","content":"Validated the route migration.","image_urls":[],"replies_count":1,"created_at":"2026-05-14T08:00:00.000Z","authorWorkspaceMembershipId":"mem_01jzn7e61x3a7v9h2r7t2m3q4p"}]}}},"schema":{"$ref":"#/components/schemas/SearchMessagesResponse"}}},"description":"Message search results."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Search messages","tags":["Search"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_search_messages.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/search/messages","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"public_api_search_read","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/api-keys":{"post":{"description":"Issues an exact-scope credential for an existing workspace member or a new named agent. Requires api_keys:write, a live admin/owner membership, and an Idempotency-Key. The encrypted secret response is replayable for 24 hours; after that it cannot be recovered. Credential-management scopes cannot be delegated.","operationId":"issueApiKey","parameters":[{"description":"Required key for safe retries. Reusing it with different parameters returns 409 idempotency_conflict. The encrypted secret response can be replayed for 24 hours.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"namedAgent":{"summary":"Provision a scoped named-agent credential.","value":{"name":"release-operator-production","scopes":["messages:read","webhooks:read"],"subject":{"display_name":"Release operator","kind":"new_agent","role_name":"Release automation"}}}},"schema":{"$ref":"#/components/schemas/ApiKeyIssueBody"}}},"required":true},"responses":{"201":{"content":{"application/json":{"examples":{"issued":{"summary":"Issued credential. The secret is returned once.","value":{"data":{"key":{"id":"key_01jzn7e61x3a7v9h2r7t2m3q4p","key_prefix":"example-key-prefix","name":"release-operator-production","scopes":["messages:read","webhooks:read"],"status":"active","subject":{"display_name":"Release operator","principal_type":"agent","workspace_membership_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p"}},"secret":"example-key-secret-store-immediately"}}}},"schema":{"$ref":"#/components/schemas/ApiKeySecretResponse"}}},"description":"Issued API key."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Issue an API key","tags":["API Keys"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_api_keys.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/api-keys","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"get":{"description":"Lists reveal-safe API key metadata for the workspace. Requires api_keys:read on the calling key and a live admin/owner membership. Secrets are never returned.","operationId":"listApiKeys","parameters":[{"description":"Opaque cursor returned by data.page_info.next_cursor. Omit for the first page.","in":"query","name":"cursor","schema":{"description":"Opaque cursor returned by data.page_info.next_cursor. Omit for the first page.","type":"string"}},{"description":"Maximum API keys to return. Defaults to 50.","in":"query","name":"limit","schema":{"description":"Maximum API keys to return. Defaults to 50.","type":"integer","maximum":100,"minimum":1}}],"responses":{"200":{"content":{"application/json":{"examples":{"keys":{"summary":"Workspace API key metadata.","value":{"data":{"items":[{"id":"key_01jzn7e61x3a7v9h2r7t2m3q4p","key_prefix":"example-key-prefix","name":"release-operator-production","scopes":["messages:read","webhooks:read"],"status":"active","subject":{"display_name":"Release operator","principal_type":"agent","workspace_membership_id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p"}}],"page_info":{"has_next_page":false,"next_cursor":null}}}}},"schema":{"$ref":"#/components/schemas/ApiKeyListResponse"}}},"description":"Workspace API keys."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List API keys","tags":["API Keys"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_api_keys.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/api-keys","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/api-keys/{apiKeyId}/rotate":{"post":{"description":"Atomically replaces an API key secret while preserving its stable id; omitted label and scope fields keep their current values. Requires api_keys:write, a live admin/owner membership, an Idempotency-Key, and a different administrator key than the target. The old secret stops authenticating immediately. The encrypted replacement response is replayable for 24 hours through the same administrator key.","operationId":"rotateApiKey","parameters":[{"description":"Stable API key identifier.","in":"path","name":"apiKeyId","required":true,"schema":{"description":"Stable API key identifier.","type":"string"}},{"description":"Required key for safe retries. Reusing it with different parameters returns 409 idempotency_conflict. The encrypted secret response can be replayed for 24 hours.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"rotate":{"summary":"Rotate and narrow an API key.","value":{"scopes":["messages:read"]}}},"schema":{"$ref":"#/components/schemas/ApiKeyRotateBody"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeySecretResponse"}}},"description":"Rotated API key."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Rotate an API key","tags":["API Keys"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_api_keys_by_apikeyid_rotate.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/api-keys/:apiKeyId/rotate","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/api-keys/{apiKeyId}":{"delete":{"description":"Permanently revokes an API key while retaining reveal-safe lifecycle and audit metadata. Requires api_keys:write and a live admin/owner membership. Repeating the request is safe.","operationId":"revokeApiKey","parameters":[{"description":"Stable API key identifier.","in":"path","name":"apiKeyId","required":true,"schema":{"description":"Stable API key identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}},"description":"Revoked API key."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Revoke an API key","tags":["API Keys"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_api_keys_by_apikeyid.delete","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/api-keys/:apiKeyId","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/agents":{"post":{"description":"Creates a workspace agent. Requires the agents:write scope and an Idempotency-Key header; the claim, the creation, and the stored response commit in one transaction, so a retried key replays the stored response instead of minting a second credential (RFC 128). The agent's own credential is never returned.","operationId":"createAgent","parameters":[{"description":"Unique key for safe retries. Reusing a key with a different body returns 409 idempotency_conflict.","in":"header","name":"Idempotency-Key","required":true,"schema":{"description":"Idempotency key.","type":"string","maxLength":255}}],"requestBody":{"content":{"application/json":{"examples":{"agent":{"summary":"Create a workspace agent.","value":{"display_name":"Release Bot","system_prompt":"You watch the release channel and summarize failures.","model_id":"claude-sonnet-4-6","role_name":"Release manager","response_scope":"workspace","avatar_file_id":null}}},"schema":{"$ref":"#/components/schemas/CreateAgentBody"}}},"required":true},"responses":{"201":{"content":{"application/json":{"examples":{"created":{"summary":"Created agent.","value":{"data":{"object":"agent","id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","display_name":"Release Bot","role_name":"Release manager","model_id":"claude-sonnet-4-6","response_scope":"workspace","status":"active","is_workspace_agent":false,"avatar_url":null,"created_by":{"id":"mem_01jzn7e61x3a7v9h2r7t2m3q4q","display_name":"Alex Kim"},"created_at":"2026-08-18T08:00:00.000Z","updated_at":"2026-08-18T08:00:00.000Z"}}}},"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Created agent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Create an agent","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/agents","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"},"get":{"description":"Lists workspace agents. Requires the agents:read scope. Filter with status=active|paused|archived|all (default active).","operationId":"listAgents","parameters":[{"description":"Lifecycle status filter. Defaults to active.","in":"query","name":"status","schema":{"description":"Agent status filter.","enum":["active","paused","archived","all"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"examples":{"agents":{"summary":"Workspace agents.","value":{"data":{"items":[{"object":"agent","id":"mem_01jzn7e61x3a7v9h2r7t2m3q4p","display_name":"Release Bot","role_name":"Release manager","model_id":"claude-sonnet-4-6","response_scope":"workspace","status":"active","is_workspace_agent":false,"avatar_url":null,"created_by":{"id":"mem_01jzn7e61x3a7v9h2r7t2m3q4q","display_name":"Alex Kim"},"created_at":"2026-08-18T08:00:00.000Z","updated_at":"2026-08-18T08:00:00.000Z"}]}}}},"schema":{"$ref":"#/components/schemas/AgentListResponse"}}},"description":"Workspace agents."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"List agents","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/agents","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/agents/{agentId}":{"get":{"description":"Returns one workspace agent. Requires the agents:read scope.","operationId":"getAgent","parameters":[{"description":"Agent membership identifier.","in":"path","name":"agentId","required":true,"schema":{"description":"Agent membership identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Agent details."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Get an agent","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents_by_agentid.get","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"public_data","x-ando-public-path":"/v1/agents/:agentId","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/agents/{agentId}/retire":{"post":{"description":"Retires (archives) an agent: revokes its credential, deletes its bound API keys, releases its display name, and archives its membership. Requires the agents:write scope. A personal-scope agent can only be retired by its creator.","operationId":"retireAgent","parameters":[{"description":"Agent membership identifier.","in":"path","name":"agentId","required":true,"schema":{"description":"Agent membership identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Retired agent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Retire an agent","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents_by_agentid_retire.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/agents/:agentId/retire","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/agents/{agentId}/restore":{"post":{"description":"Restores a retired agent. The agent comes back paused; resume it to mint a fresh credential (the retired credential is never revived). Requires the agents:write scope.","operationId":"restoreAgent","parameters":[{"description":"Agent membership identifier.","in":"path","name":"agentId","required":true,"schema":{"description":"Agent membership identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Restored agent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Restore an agent","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents_by_agentid_restore.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/agents/:agentId/restore","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/agents/{agentId}/pause":{"post":{"description":"Pauses an agent: deactivates it and revokes its runtime credential. Requires the agents:write scope.","operationId":"pauseAgent","parameters":[{"description":"Agent membership identifier.","in":"path","name":"agentId","required":true,"schema":{"description":"Agent membership identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Paused agent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Pause an agent","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents_by_agentid_pause.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/agents/:agentId/pause","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}},"/agents/{agentId}/resume":{"post":{"description":"Resumes a paused agent, minting a fresh runtime credential. Requires the agents:write scope.","operationId":"resumeAgent","parameters":[{"description":"Agent membership identifier.","in":"path","name":"agentId","required":true,"schema":{"description":"Agent membership identifier.","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}},"description":"Resumed agent."},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}},"security":[{"AndoApiKey":[]},{"BearerApiKey":[]}],"summary":"Resume an agent","tags":["Agents"],"x-ando-compatibility-mode":"standard_public","x-ando-migration-target":"standard_public","x-ando-rate-limit-policy":"declared","x-ando-route-id":"api.api_v1_agents_by_agentid_resume.post","x-ando-canonical-host":"api.ando.so","x-ando-documentation-owner":"api_platform","x-ando-principal-kind":"workspace_api_key","x-ando-public-api-route-class":"durable_ingress","x-ando-public-path":"/v1/agents/:agentId/resume","x-ando-runtime-owner":"convex_product","x-ando-status-probe-owner":"none","x-ando-rollback-runtime":"convex_http","x-ando-selected-runtime":"convex_http","x-ando-target-runtime":"convex_http"}}},"servers":[{"description":"Canonical public API host.","url":"https://api.ando.so/v1"}],"tags":[{"description":"Programmatic API key issuance and lifecycle routes.","name":"API Keys"},{"description":"Workspace agent lifecycle routes.","name":"Agents"},{"description":"Call detail and transcript routes.","name":"Calls"},{"description":"Membership-scoped conversation routes.","name":"Conversations"},{"description":"File upload lifecycle routes for public API message attachments.","name":"Files"},{"description":"Move another chat tool's history into a workspace with original authors and timestamps. Requires an owner or admin API key with the imports:write scope.","name":"Imports"},{"description":"Workspace member detail routes. Existing v1 paths keep member compatibility spellings.","name":"Members"},{"description":"Message and conversation message routes.","name":"Messages"},{"description":"Public realtime connection and protocol routes.","name":"Realtime"},{"description":"Search routes.","name":"Search"},{"description":"Outbound webhook endpoint and delivery routes.","name":"Webhooks"}]}
