{"openapi":"3.1.0","info":{"title":"AILIVE Open API","version":"1"},"servers":[{"url":"https://api.ailive.studio"}],"paths":{"/v1/connect/requests":{"post":{"description":"用直播间 Key 申请接入这个直播间。直播间所有者或管理员会立刻在工作台「接入管理」里看到申请，核对核对码后批准或拒绝。","operationId":"request_access_v1_connect_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRequestCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRequestIssued"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"申请接入","tags":["接入与令牌"]}},"/v1/connect/revoke":{"post":{"description":"离开直播间：撤销本连接及其全部令牌。撤销接入不会停止直播。","operationId":"revoke_v1_connect_revoke_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"撤销接入","tags":["接入与令牌"]}},"/v1/connect/token":{"post":{"operationId":"token_v1_connect_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectTokenRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectGrant"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"领取与刷新令牌","tags":["接入与令牌"],"description":"`grantType: request` 按申请返回的轮询间隔查询审批结果，批准后得到 Bearer 访问令牌和刷新令牌；`grantType: refresh_token` 用刷新令牌换一组新令牌，旧的刷新令牌随即失效。"}},"/v1/meta":{"get":{"operationId":"meta_v1_meta_get","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"服务信息","tags":["系统"],"description":"读取当前服务的入口类型、版本号和各入口地址，用来确认客户端连到了正确的环境。"}},"/v1/room":{"get":{"description":"读取直播间、当前场次，以及本连接获批的权限范围和已登记的平台来源。","operationId":"room_v1_room_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomView"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"读取直播间","tags":["直播间"]}},"/v1/room/audio-tickets":{"post":{"description":"换取一次性票据，用来发送 PK 对手的声音；只在当前场次有需要对手声音的 PK 回合时可用。","operationId":"audio_ticket_v1_room_audio_tickets_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioTicket"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"对手声音票据","tags":["PK 对手声音"]}},"/v1/room/audio/status":{"put":{"description":"上报本客户端这一轮能否发送 PK 对手的声音，以及采集方式。","operationId":"audio_status_v1_room_audio_status_put","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioStatus"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"上报对手声音状态","tags":["PK 对手声音"]}},"/v1/room/data":{"post":{"description":"为一个平台来源推送一批数据（评论、礼物、进场、关注、点赞等）。用同一个 `batchId` 重发时返回第一次的结果，不会重复入库。","operationId":"push_data_v1_room_data_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataBatch"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataResult"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"推送平台数据","tags":["平台数据"]}},"/v1/room/feed":{"get":{"description":"读取正在播出的内容：播出队列、正在说的话，以及上报的评论被怎样处理。只包含已允许播出的内容，不含回复草稿。使用实时通道的客户端会在 `ready` 和 `feed.*` 事件里收到同样的内容。","operationId":"get_feed_v1_room_feed_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feed"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"读取播出动态","tags":["播出与音视频"]}},"/v1/room/heartbeat":{"post":{"description":"没有使用实时通道的客户端每 15 秒上报一次在线状态。","operationId":"heartbeat_v1_room_heartbeat_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"在线心跳","tags":["直播间"]}},"/v1/room/motion-presets":{"get":{"description":"列出动作指令可以通过 `presetId` 指定的内置动作。","operationId":"list_motion_presets_v1_room_motion_presets_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MotionPreset"},"title":"Response List Motion Presets V1 Room Motion Presets Get","type":"array"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"内置动作列表","tags":["播出与音视频"]}},"/v1/room/playback":{"get":{"description":"换取当前场次只能观看的 RTC 凭据（需要 `rtc:receive` 权限）。","operationId":"playback_v1_room_playback_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivePlayback"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"音视频接收凭据","tags":["播出与音视频"]}},"/v1/room/realtime-tickets":{"post":{"description":"换取一次性的票据，用来连接直播间的实时 WebSocket 通道。","operationId":"realtime_ticket_v1_room_realtime_tickets_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealtimeTicket"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"实时通道票据","tags":["直播间"]}},"/v1/room/session":{"get":{"operationId":"session_v1_room_session_get","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LiveSession"},{"type":"null"}],"title":"Response Session V1 Room Session Get"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"读取当前场次","tags":["直播间"],"description":"读取直播间当前进行中的场次；没有进行中的场次时返回 `null`。"}},"/v1/room/sources":{"post":{"description":"登记本客户端采集的平台直播间（需要 `data` 权限）。重复登记返回同一个来源，并更新它的声明。","operationId":"register_source_v1_room_sources_post","parameters":[{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceRegistered"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"登记平台来源","tags":["平台数据"]}},"/v1/room/sources/{source_id}":{"patch":{"description":"更新平台直播 ID、登录状态、身份或能力，或平台直播间的状态（`live`、`offline`、`stopped`）。","operationId":"update_source_v1_room_sources__source_id__patch","parameters":[{"in":"path","name":"source_id","required":true,"schema":{"format":"uuid","title":"Source Id","type":"string"}},{"in":"header","name":"authorization","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceUpdate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Source"}}},"description":"Successful Response"},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}},"description":"Default Response"}},"summary":"更新平台来源","tags":["平台数据"]}}},"components":{"schemas":{"ConnectRequestCreate":{"additionalProperties":false,"properties":{"client":{"$ref":"#/components/schemas/ClientInfo"},"key":{"maxLength":200,"title":"Key","type":"string"},"scopes":{"items":{"enum":["room:read","rtc:receive","data","interaction","audio:send"],"type":"string"},"maxItems":4,"minItems":1,"title":"Scopes","type":"array"}},"required":["key","client","scopes"],"title":"ConnectRequestCreate","type":"object"},"ClientInfo":{"additionalProperties":false,"description":"Self-reported by the client; shown to the approver, never trusted as identity.","properties":{"appName":{"maxLength":40,"minLength":1,"title":"Appname","type":"string"},"deviceName":{"anyOf":[{"maxLength":60,"minLength":1,"type":"string"},{"type":"null"}],"title":"Devicename"},"instanceId":{"description":"Generated once per installation and kept","pattern":"^[A-Za-z0-9._:-]{8,128}$","title":"Instanceid","type":"string"},"os":{"anyOf":[{"maxLength":40,"minLength":1,"type":"string"},{"type":"null"}],"title":"Os"},"platforms":{"items":{"enum":["douyin","kuaishou","taobao","jd","wechat_channels","xiaohongshu","bilibili","other"],"type":"string"},"maxItems":8,"title":"Platforms","type":"array"},"vendor":{"anyOf":[{"maxLength":40,"minLength":1,"type":"string"},{"type":"null"}],"title":"Vendor"},"version":{"maxLength":20,"minLength":1,"title":"Version","type":"string"}},"required":["appName","version","instanceId"],"title":"ClientInfo","type":"object"},"ConnectRequestIssued":{"additionalProperties":false,"properties":{"expiresIn":{"title":"Expiresin","type":"integer"},"interval":{"description":"Seconds between polls","title":"Interval","type":"integer"},"pollToken":{"description":"`cp_…`; only redeems this request's result","title":"Polltoken","type":"string"},"requestId":{"format":"uuid","title":"Requestid","type":"string"},"room":{"additionalProperties":{"type":"string"},"title":"Room","type":"object"},"userCode":{"description":"Show it; the approver checks it matches","title":"Usercode","type":"string"}},"required":["requestId","pollToken","userCode","expiresIn","interval","room"],"title":"ConnectRequestIssued","type":"object"},"ErrorEnvelope":{"additionalProperties":false,"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}},"required":["error"],"title":"ErrorEnvelope","type":"object"},"ErrorBody":{"additionalProperties":false,"properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"message":{"title":"Message","type":"string"},"requestId":{"title":"Requestid","type":"string"}},"required":["code","message","requestId"],"title":"ErrorBody","type":"object"},"ErrorCode":{"enum":["bad_request","validation_failed","unauthenticated","forbidden","not_found","method_not_allowed","conflict","precondition_failed","rate_limited","unavailable","internal","csrf_failed","untrusted_origin","idempotency_key_invalid","idempotency_key_required","idempotency_key_reused","request_in_progress","if_match_required","if_match_invalid","nothing_to_save","batch_too_large","phone_invalid","code_invalid","too_many_attempts","sms_too_frequent","sms_daily_limit","sms_send_failed","sms_unavailable","legal_not_published","legal_updated","document_not_found","account_suspended","admin_access_required","phone_proof_required","phone_proof_expired","phone_unchanged","phone_taken","login_session_not_found","current_session_logout","workspace_not_found","workspace_limit_reached","manager_required","owner_only_admins","owner_only_roles","admins_remove_members_only","member_not_found","already_member","already_invited","invitation_not_found","owner_role_fixed","owner_cannot_be_removed","owner_cannot_leave","use_leave_workspace","user_not_found","platform_admin_cannot_be_suspended","team_member_not_found","already_on_team","phone_not_registered","role_not_permitted","own_role_locked","manager_not_active","catalog_product_not_found","catalog_code_taken","catalog_terms_invalid","grant_out_of_range","credit_adjustment_key_required","credit_adjustment_too_large","deduction_exceeds_balance","metrics_period_invalid","payments_unavailable","billing_rules_not_published","purchase_terms_updated","plan_not_found","billing_product_not_found","renew_current_plan_only","other_order_pending","subscription_required","order_not_found","order_closed","order_expiring","order_environment_mismatch","order_linked_elsewhere","order_not_under_review","order_plan_conflict","order_resolution_key_required","payment_mismatch","payment_time_invalid","payment_pending","avatar_not_found","avatar_limit_reached","file_not_found","photo_not_found","image_empty","image_too_large","image_type_unsupported","image_too_wide","image_too_small","image_unreadable","voice_unavailable","voice_language_mismatch","voice_required","voice_unavailable_for_language","reply_limit_out_of_range","qa_not_found","qa_limit_reached","style_example_not_found","style_examples_full","fact_not_found","fact_limit_reached","product_not_found","currency_price_required","live_disabled","rtc_not_configured","room_not_found","room_limit_reached","room_live_avatar_locked","room_live_cannot_delete","room_avatar_deleted","room_already_live","avatar_live_elsewhere","portrait_required","avatar_voice_only","motion_needs_video","plan_required","live_concurrency_limit","live_capacity_full","insufficient_credits","live_session_not_found","live_not_running","comment_not_found","comment_already_handled","command_not_found","command_already_handled","comment_queue_full","reply_blocked","content_blocked","scene_lines_full","game_items_full","game_already_active","game_not_active","game_disabled","game_items_empty","song_not_found","song_limit_reached","song_list_full","song_already_listed","song_audio_not_found","song_audio_too_large","song_audio_type_unsupported","song_audio_unreadable","song_duration_out_of_range","song_rights_required","lyrics_unreadable","lyrics_empty","lyrics_too_many","lyrics_out_of_order","lyrics_beyond_end","lyrics_line_too_long","lyrics_blocked","song_title_blocked","singing_off","song_recognition_limit","voice_preview_limit","voice_preview_failed","song_not_ready","song_not_covered","song_already_queued","credits_required","gpu_limit_reached","gpu_job_not_found","gpu_job_not_cancellable","singer_token_invalid","singing_voice_unavailable","singing_voice_generating","singing_voice_ready","singing_language_unsupported","singing_model_not_found","song_cover_not_found","song_cover_in_progress","song_too_long_to_cover","custom_motions_full","custom_motion_untested","eval_cases_full","eval_cases_empty","eval_case_not_found","eval_run_not_found","import_not_found","import_not_ready","import_confirmed","import_too_large","import_unreadable","change_not_found","change_superseded","snapshot_not_found","scene_not_configured","nothing_to_thank","review_required","pk_not_found","pk_already_active","pk_not_active","voice_busy","utterance_not_found","utterance_already_handled","upstream_failed","reply_empty","workspace_only","credentials_revoked","scope_not_granted","key_not_found","room_key_limit_reached","access_key_invalid","connect_request_limit","connect_request_not_found","connect_request_handled","connect_request_lapsed","connect_request_key_revoked","connect_request_invalid","connect_request_denied","connect_request_timed_out","connect_request_pending","connect_poll_too_fast","poll_fields_required","refresh_token_required","refresh_token_invalid","access_token_required","access_token_invalid","connection_not_found","interaction_not_granted","source_not_found","source_stopped","source_disconnected","platform_room_not_found","platform_room_linked"],"title":"ErrorCode","type":"string"},"ConnectTokenRequest":{"additionalProperties":false,"description":"request: poll for the decision. refresh_token: rotate the tokens.","properties":{"grantType":{"enum":["request","refresh_token"],"title":"Granttype","type":"string"},"pollToken":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"title":"Polltoken"},"refreshToken":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"title":"Refreshtoken"},"requestId":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Requestid"}},"required":["grantType"],"title":"ConnectTokenRequest","type":"object"},"ConnectGrant":{"additionalProperties":false,"properties":{"accessToken":{"title":"Accesstoken","type":"string"},"connectionId":{"format":"uuid","title":"Connectionid","type":"string"},"expiresIn":{"title":"Expiresin","type":"integer"},"interaction":{"description":"Whether one of this connection's sources reads the interaction platform room","title":"Interaction","type":"boolean"},"refreshToken":{"title":"Refreshtoken","type":"string"},"room":{"$ref":"#/components/schemas/RoomRef"},"scopes":{"items":{"enum":["room:read","rtc:receive","data","interaction","audio:send"],"type":"string"},"title":"Scopes","type":"array"},"tokenType":{"const":"Bearer","title":"Tokentype","type":"string"}},"required":["accessToken","refreshToken","tokenType","expiresIn","connectionId","room","scopes","interaction"],"title":"ConnectGrant","type":"object"},"RoomRef":{"additionalProperties":false,"properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"RoomRef","type":"object"},"Meta":{"additionalProperties":false,"properties":{"origins":{"$ref":"#/components/schemas/Origins"},"revision":{"title":"Revision","type":"string"},"surface":{"$ref":"#/components/schemas/Surface"}},"required":["surface","revision","origins"],"title":"Meta","type":"object"},"Origins":{"additionalProperties":false,"properties":{"admin":{"title":"Admin","type":"string"},"docs":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"User documentation site; null when this environment has none","title":"Docs"},"openapi":{"title":"Openapi","type":"string"},"workspace":{"title":"Workspace","type":"string"}},"required":["workspace","admin","openapi","docs"],"title":"Origins","type":"object"},"Surface":{"enum":["workspace","admin","openapi"],"title":"Surface","type":"string"},"RoomView":{"additionalProperties":false,"properties":{"me":{"$ref":"#/components/schemas/RoomMe"},"room":{"$ref":"#/components/schemas/Room"},"session":{"anyOf":[{"$ref":"#/components/schemas/LiveSession"},{"type":"null"}]}},"required":["room","session","me"],"title":"RoomView","type":"object"},"RoomMe":{"additionalProperties":false,"properties":{"connectionId":{"format":"uuid","title":"Connectionid","type":"string"},"interaction":{"title":"Interaction","type":"boolean"},"scopes":{"items":{"enum":["room:read","rtc:receive","data","interaction","audio:send"],"type":"string"},"title":"Scopes","type":"array"},"sources":{"items":{"$ref":"#/components/schemas/Source"},"title":"Sources","type":"array"}},"required":["connectionId","scopes","interaction","sources"],"title":"RoomMe","type":"object"},"Source":{"additionalProperties":false,"properties":{"capabilities":{"additionalProperties":{"anyOf":[{"enum":["full","masked","masked_nokey"],"type":"string"},{"type":"boolean"}]},"title":"Capabilities","type":"object"},"channel":{"enum":["page_push","page_poll","page_dom","console_page","manual"],"title":"Channel","type":"string"},"collector":{"$ref":"#/components/schemas/CollectorInfo"},"connectionId":{"format":"uuid","title":"Connectionid","type":"string"},"createdAt":{"format":"date-time","title":"Createdat","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"identity":{"enum":["full","masked","masked_nokey"],"title":"Identity","type":"string"},"interaction":{"description":"Whether its comments go to the reply queue","title":"Interaction","type":"boolean"},"lastDataAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Lastdataat"},"loginState":{"enum":["anonymous","viewer","owner"],"title":"Loginstate","type":"string"},"platformLiveId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platformliveid"},"platformRoom":{"$ref":"#/components/schemas/PlatformRoom"},"state":{"enum":["collecting","degraded","blocked","idle","failed"],"title":"State","type":"string"},"stateMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statemessage"},"stateReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statereason"},"status":{"enum":["unknown","live","offline","stopped"],"title":"Status","type":"string"},"stoppedAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Stoppedat"}},"required":["id","connectionId","platformRoom","channel","loginState","identity","capabilities","collector","platformLiveId","status","state","stateReason","stateMessage","interaction","lastDataAt","createdAt","stoppedAt"],"title":"Source","type":"object"},"CollectorInfo":{"additionalProperties":false,"properties":{"adapter":{"anyOf":[{"maxLength":40,"minLength":1,"type":"string"},{"type":"null"}],"title":"Adapter"},"kind":{"enum":["page_inject","cdp","other"],"title":"Kind","type":"string"},"name":{"maxLength":40,"minLength":1,"title":"Name","type":"string"},"version":{"maxLength":20,"minLength":1,"title":"Version","type":"string"}},"required":["kind","name","version"],"title":"CollectorInfo","type":"object"},"PlatformRoom":{"additionalProperties":false,"properties":{"anchorName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Anchorname"},"createdAt":{"format":"date-time","title":"Createdat","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"idType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idtype"},"name":{"title":"Name","type":"string"},"platform":{"enum":["douyin","kuaishou","taobao","jd","wechat_channels","xiaohongshu","bilibili","other"],"title":"Platform","type":"string"},"platformRoomKey":{"title":"Platformroomkey","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"}},"required":["id","platform","platformRoomKey","idType","name","url","anchorName","createdAt"],"title":"PlatformRoom","type":"object"},"Room":{"additionalProperties":false,"properties":{"avatar":{"$ref":"#/components/schemas/RoomAvatar"},"clientsOnline":{"title":"Clientsonline","type":"integer"},"commentFilter":{"$ref":"#/components/schemas/CommentFilter"},"createdAt":{"format":"date-time","title":"Createdat","type":"string"},"dataSources":{"default":0,"description":"Other sources collecting, not kept yet","title":"Datasources","type":"integer"},"effectiveOutput":{"description":"What the next session puts on air","enum":["video","audio"],"title":"Effectiveoutput","type":"string"},"games":{"$ref":"#/components/schemas/RoomGames","description":"Motion requests and gift motions (ADR 0016 §6)"},"id":{"format":"uuid","title":"Id","type":"string"},"idleMoves":{"$ref":"#/components/schemas/RoomIdleMoves","description":"Idle moves when the avatar is still (ADR 0019)"},"interactionSource":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"The source whose data the room keeps, with its platform room"},"interactionSourceId":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"A source of the platform room that holds the interaction role; every source reading that platform room from a connection allowed to interact feeds the reply queue","title":"Interactionsourceid"},"name":{"title":"Name","type":"string"},"output":{"anyOf":[{"enum":["video","audio"],"type":"string"},{"type":"null"}],"description":"video or audio; null follows the avatar","title":"Output"},"pendingRequests":{"title":"Pendingrequests","type":"integer"},"platformRooms":{"title":"Platformrooms","type":"integer"},"scenes":{"additionalProperties":{"$ref":"#/components/schemas/SceneSetting"},"description":"The scenes the room airs","propertyNames":{"enum":["opening","urge","follow","like","gift_guide","gift_thanks","welcome","follow_thanks","share_thanks","like_thanks","pk_open","pk_rush","pk_win","pk_lose","pk_draw"]},"title":"Scenes","type":"object"},"sessionId":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The active session, if any","title":"Sessionid"},"shortWhenBusy":{"description":"With three replies waiting to air, the next is half as long (ADR 0012 §5)","title":"Shortwhenbusy","type":"boolean"},"singing":{"description":"The operator may queue the avatar's songs (ADR 0015 §8)","title":"Singing","type":"boolean"},"smartMotion":{"description":"Replies and pick suggestions air with a built-in motion (ADR 0009 §7)","title":"Smartmotion","type":"boolean"},"smartPick":{"description":"The live job picks comments into the queue itself","title":"Smartpick","type":"boolean"},"smartReview":{"description":"Replies the model did not mark and the review did not cut air unapproved","title":"Smartreview","type":"boolean"},"status":{"description":"live while a session is active","enum":["idle","live"],"title":"Status","type":"string"},"version":{"title":"Version","type":"integer"},"warmup":{"$ref":"#/components/schemas/RoomWarmup","description":"Warm-up when the room is quiet (ADR 0016 §1)"}},"required":["id","name","avatar","status","sessionId","output","effectiveOutput","interactionSourceId","clientsOnline","platformRooms","pendingRequests","commentFilter","smartPick","smartReview","smartMotion","shortWhenBusy","singing","idleMoves","scenes","warmup","games","createdAt","version"],"title":"Room","type":"object"},"RoomAvatar":{"additionalProperties":false,"properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"photoFileId":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Photofileid"}},"required":["id","name","photoFileId"],"title":"RoomAvatar","type":"object"},"CommentFilter":{"additionalProperties":false,"description":"Which comments the list's filtered view and smart picking consider (ADR 0009 §2).\n\nWhitelisted viewers always pass; with no condition and an empty whitelist everything\npasses. A level the platform does not report never meets a condition, and a viewer\nwithout a key has no whitelist entry or gift count.","properties":{"fansClubAtLeast":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"title":"Fansclubatleast"},"giftsAtLeast":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"description":"Gifts from this viewer this session","title":"Giftsatleast"},"match":{"default":"any","description":"any: one set condition is enough; all: every set one","enum":["any","all"],"title":"Match","type":"string"},"payAtLeast":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"title":"Payatleast"},"whitelist":{"items":{"$ref":"#/components/schemas/WhitelistEntry"},"maxItems":100,"title":"Whitelist","type":"array"}},"title":"CommentFilter","type":"object"},"WhitelistEntry":{"additionalProperties":false,"properties":{"key":{"description":"The platform viewer key (ADR 0005 §2.2)","pattern":"^[a-z_]{2,20}:.{1,160}$","title":"Key","type":"string"},"name":{"default":"","description":"Shown in the console only","maxLength":60,"title":"Name","type":"string"}},"required":["key"],"title":"WhitelistEntry","type":"object"},"RoomGames":{"additionalProperties":false,"description":"What viewers and gifts can ask of the avatar in this room, and the games it plays\n(ADR 0016 §10).","properties":{"games":{"additionalProperties":{"$ref":"#/components/schemas/GameSetting"},"description":"Members may change it; a game left out is on","propertyNames":{"enum":["riddle","number_bomb","choice","soup"]},"title":"Games","type":"object"},"giftMotions":{"description":"Gifts the avatar answers with a motion; managers only","items":{"$ref":"#/components/schemas/GiftMotion"},"maxItems":20,"title":"Giftmotions","type":"array"},"motionRequests":{"$ref":"#/components/schemas/MotionRequests"}},"title":"RoomGames","type":"object"},"GameSetting":{"additionalProperties":false,"properties":{"enabled":{"default":true,"title":"Enabled","type":"boolean"},"smart":{"default":true,"description":"May start by itself while smart warm-up is on (ADR 0016 §4.2)","title":"Smart","type":"boolean"}},"title":"GameSetting","type":"object"},"GiftMotion":{"additionalProperties":false,"properties":{"gift":{"description":"The gift's name as the platform reports it","maxLength":40,"minLength":1,"title":"Gift","type":"string"},"line":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"description":"Said as it goes out, instead of the usual thanks","title":"Line"},"motionId":{"description":"A built-in motion, or custom:<id> for one of the avatar's own","pattern":"^([A-Za-z]{2,30}|custom:[0-9a-f-]{36})$","title":"Motionid","type":"string"}},"required":["gift","motionId"],"title":"GiftMotion","type":"object"},"MotionRequests":{"additionalProperties":false,"description":"Viewers ask the avatar for a gesture in a comment (ADR 0016 §6).","properties":{"enabled":{"default":false,"title":"Enabled","type":"boolean"},"mode":{"default":"auto","description":"confirm: an operator says yes to each first; managers only","enum":["auto","confirm"],"title":"Mode","type":"string"}},"title":"MotionRequests","type":"object"},"RoomIdleMoves":{"additionalProperties":false,"description":"Small moves the avatar makes when it has been still a while (ADR 0019 §5, §11.6).","properties":{"enabled":{"default":true,"title":"Enabled","type":"boolean"},"pace":{"default":"mid","description":"How long it stays still first: low 20 s, mid 12 s, high 8 s","enum":["low","mid","high"],"title":"Pace","type":"string"}},"title":"RoomIdleMoves","type":"object"},"SceneSetting":{"additionalProperties":false,"properties":{"enabled":{"default":false,"title":"Enabled","type":"boolean"},"everyMinutes":{"anyOf":[{"maximum":60,"minimum":3,"type":"integer"},{"type":"null"}],"description":"Timed scenes only; null for the scene's default","title":"Everyminutes"}},"title":"SceneSetting","type":"object"},"RoomWarmup":{"additionalProperties":false,"description":"Whether the room warms itself up when it is quiet, and how often a flat room is warmed\n(ADR 0016 §1). It only runs while smart review is on (§2.4).","properties":{"enabled":{"default":false,"title":"Enabled","type":"boolean"},"pace":{"default":"mid","description":"low: every 3 minutes; mid: 90 s; high: 45 s, when flat","enum":["low","mid","high"],"title":"Pace","type":"string"}},"title":"RoomWarmup","type":"object"},"LiveSession":{"additionalProperties":false,"properties":{"avatar":{"$ref":"#/components/schemas/LiveAvatar"},"balanceLow":{"description":"Under 100 credits, or under 10 minutes at this session's rate","title":"Balancelow","type":"boolean"},"balanceMilli":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Credits (milli) the workspace had left after the last hold (ADR 0013 §2)","title":"Balancemilli"},"balanceMinutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Whole minutes that balance lasts","title":"Balanceminutes"},"billedSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Air time charged, once settled","title":"Billedseconds"},"chargedMilli":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Credits (milli) charged, once settled","title":"Chargedmilli"},"counters":{"$ref":"#/components/schemas/SessionCounters"},"createdAt":{"format":"date-time","title":"Createdat","type":"string"},"endReason":{"anyOf":[{"$ref":"#/components/schemas/EndReason"},{"type":"null"}]},"endedAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Endedat"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Diagnostic detail from a provider, not for viewers","title":"Error"},"fundedSeconds":{"description":"Air time the hold pays for","title":"Fundedseconds","type":"integer"},"heat":{"anyOf":[{"enum":["cold","flat","busy"],"type":"string"},{"type":"null"}],"description":"How lively the room is by its recent comments (ADR 0016 §1); null until the live job has looked","title":"Heat"},"id":{"format":"uuid","title":"Id","type":"string"},"interactionPaused":{"description":"While true, new comments are kept as received but none is picked or replied to, and scenes pause; what is queued still airs (ADR 0009 §3)","title":"Interactionpaused","type":"boolean"},"maxSeconds":{"title":"Maxseconds","type":"integer"},"online":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Viewers online at the latest report; approximate when only shown","title":"Online"},"onlineDisplay":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The platform's own way of showing it, e.g. 1.2万","title":"Onlinedisplay"},"output":{"description":"video: avatar video and voice; audio: voice only","enum":["video","audio"],"title":"Output","type":"string"},"rateMilli":{"description":"Credits (milli) per minute of air time","title":"Ratemilli","type":"string"},"reservedMilli":{"description":"Credits (milli) currently or finally held","title":"Reservedmilli","type":"string"},"revisionNumber":{"description":"The snapshot of the avatar's content taken at start","title":"Revisionnumber","type":"integer"},"room":{"$ref":"#/components/schemas/LiveRoomRef"},"startedAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Startedat"},"status":{"description":"queued → starting → live → stopping → ended; failed from any running state","enum":["queued","starting","live","stopping","ended","failed"],"title":"Status","type":"string"},"stopRequested":{"title":"Stoprequested","type":"boolean"},"stopsAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the paid air time ends while the next minute could not be held","title":"Stopsat"}},"required":["id","room","avatar","revisionNumber","output","status","maxSeconds","stopRequested","interactionPaused","endReason","error","createdAt","startedAt","endedAt","rateMilli","reservedMilli","fundedSeconds","billedSeconds","chargedMilli","balanceMilli","balanceMinutes","balanceLow","stopsAt"],"title":"LiveSession","type":"object"},"LiveAvatar":{"additionalProperties":false,"properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"photoFileId":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Photofileid"}},"required":["id","name","photoFileId"],"title":"LiveAvatar","type":"object"},"SessionCounters":{"additionalProperties":false,"description":"What the interaction source reported this session (ADR 0009 §10.3).","properties":{"enters":{"default":0,"title":"Enters","type":"integer"},"follows":{"default":0,"title":"Follows","type":"integer"},"likes":{"default":0,"title":"Likes","type":"integer"},"shares":{"default":0,"title":"Shares","type":"integer"}},"title":"SessionCounters","type":"object"},"EndReason":{"description":"Why a session ended.","enum":["stopped","stopped_before_start","max_duration","insufficient_credits","subscription_ended","billing_unavailable","provider_error","provider_unknown","provider_ended","connection_lost","connection_closed","lease_lost","worker_lost","worker_shutdown","invalid_revision","output_unavailable","rtc_join_failed","rtc_lost","rtc_error","internal"],"title":"EndReason","type":"string"},"LiveRoomRef":{"additionalProperties":false,"properties":{"id":{"format":"uuid","title":"Id","type":"string"},"name":{"title":"Name","type":"string"}},"required":["id","name"],"title":"LiveRoomRef","type":"object"},"AudioTicket":{"additionalProperties":false,"description":"A one-time ticket for an audio channel (ADR 0014 §3).","properties":{"expiresAt":{"format":"date-time","title":"Expiresat","type":"string"},"pkId":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"description":"The PK round the opponent's voice is for","title":"Pkid"},"ticket":{"description":"Send in the auth frame; valid 30 s, usable once","title":"Ticket","type":"string"},"url":{"description":"WebSocket URL; connect with subprotocol ailive.audio.v1","title":"Url","type":"string"}},"required":["ticket","expiresAt","url","pkId"],"title":"AudioTicket","type":"object"},"AudioStatus":{"additionalProperties":false,"description":"What a client can do about the opponent's voice this round (ADR 0014 appendix §3.3).","properties":{"pkId":{"format":"uuid","title":"Pkid","type":"string"},"reason":{"anyOf":[{"enum":["app_not_found","os_unsupported","permission_denied","capture_failed","other"],"type":"string"},{"type":"null"}],"description":"Required when unavailable","title":"Reason"},"source":{"anyOf":[{"enum":["process","device"],"type":"string"},{"type":"null"}],"title":"Source"},"state":{"enum":["ready","unavailable"],"title":"State","type":"string"}},"required":["pkId","state"],"title":"AudioStatus","type":"object"},"DataBatch":{"additionalProperties":false,"description":"Items are validated one by one, so one bad item does not reject the batch.","properties":{"batchId":{"description":"Unchanged when the same batch is resent","format":"uuid","title":"Batchid","type":"string"},"epoch":{"description":"New each time the collector starts; seq restarts at 1","pattern":"^[A-Za-z0-9-]{1,64}$","title":"Epoch","type":"string"},"items":{"description":"EventItem, MetricItem, SnapshotItem or StatusItem, by `kind`","items":{"additionalProperties":true,"type":"object"},"maxItems":100,"minItems":1,"title":"Items","type":"array"},"sentAt":{"format":"date-time","title":"Sentat","type":"string"},"sourceId":{"format":"uuid","title":"Sourceid","type":"string"}},"required":["batchId","sourceId","epoch","sentAt","items"],"title":"DataBatch","type":"object"},"DataResult":{"additionalProperties":false,"properties":{"accepted":{"title":"Accepted","type":"integer"},"ackSeq":{"description":"Highest seq up to which everything has been received","title":"Ackseq","type":"integer"},"batchId":{"format":"uuid","title":"Batchid","type":"string"},"duplicates":{"title":"Duplicates","type":"integer"},"gaps":{"description":"Missing seq ranges after ack_seq","items":{"maxItems":2,"minItems":2,"prefixItems":[{"type":"integer"},{"type":"integer"}],"type":"array"},"title":"Gaps","type":"array"},"rejected":{"items":{"$ref":"#/components/schemas/Rejected"},"title":"Rejected","type":"array"},"serverTime":{"format":"date-time","title":"Servertime","type":"string"}},"required":["batchId","accepted","duplicates","rejected","ackSeq","gaps","serverTime"],"title":"DataResult","type":"object"},"Rejected":{"additionalProperties":false,"properties":{"code":{"title":"Code","type":"string"},"index":{"title":"Index","type":"integer"},"message":{"title":"Message","type":"string"}},"required":["index","code","message"],"title":"Rejected","type":"object"},"Feed":{"additionalProperties":false,"description":"What airs, for clients to render as they like: only what is cleared to go on air.","properties":{"game":{"anyOf":[{"$ref":"#/components/schemas/FeedGame"},{"type":"null"}],"description":"The game being played, if any"},"handled":{"description":"The latest 50 reported comments handled","items":{"$ref":"#/components/schemas/FeedHandled"},"title":"Handled","type":"array"},"now":{"anyOf":[{"$ref":"#/components/schemas/FeedNow"},{"type":"null"}],"description":"What is being said; null while quiet"},"pk":{"anyOf":[{"$ref":"#/components/schemas/FeedPk"},{"type":"null"}],"description":"The PK round in progress, if any"},"queue":{"description":"The playback queue in order, at most 20","items":{"$ref":"#/components/schemas/FeedQueueItem"},"title":"Queue","type":"array"}},"required":["queue","now","handled"],"title":"Feed","type":"object"},"FeedGame":{"additionalProperties":false,"description":"A game as a client may show it (ADR 0016 §12.3): never its answer before it is out.","properties":{"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only once revealed","title":"Answer"},"board":{"description":"Most right answers this game, at most 3","items":{"$ref":"#/components/schemas/GameBoardEntry"},"title":"Board","type":"array"},"endsAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"description":"When the round or the vote closes","title":"Endsat"},"found":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"soup: key points guessed so far","title":"Found"},"game":{"enum":["riddle","number_bomb","choice","soup"],"title":"Game","type":"string"},"goal":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"soup: key points to guess","title":"Goal"},"high":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"High"},"hints":{"description":"The hints given so far","items":{"type":"string"},"title":"Hints","type":"array"},"id":{"format":"uuid","title":"Id","type":"string"},"low":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"number_bomb: the range it is in","title":"Low"},"options":{"description":"choice: the two options","items":{"type":"string"},"title":"Options","type":"array"},"phase":{"enum":["intro","open","reveal","ended"],"title":"Phase","type":"string"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The riddle or the question; null for the bomb","title":"Prompt"},"round":{"title":"Round","type":"integer"},"rounds":{"title":"Rounds","type":"integer"},"votes":{"description":"choice: votes for each option so far","items":{"type":"integer"},"title":"Votes","type":"array"}},"required":["id","game","phase","round","rounds","prompt","answer","hints","endsAt","low","high","options","votes","board"],"title":"FeedGame","type":"object"},"GameBoardEntry":{"additionalProperties":false,"properties":{"points":{"title":"Points","type":"integer"},"viewer":{"description":"Empty for a viewer whose name is masked","title":"Viewer","type":"string"}},"required":["viewer","points"],"title":"GameBoardEntry","type":"object"},"FeedHandled":{"additionalProperties":false,"properties":{"at":{"format":"date-time","title":"At","type":"string"},"platformEventId":{"title":"Platformeventid","type":"string"},"state":{"enum":["picked","answering","answered","comment_only","withdrawn","dropped"],"title":"State","type":"string"}},"required":["platformEventId","state","at"],"title":"FeedHandled","type":"object"},"FeedNow":{"additionalProperties":false,"properties":{"comment":{"anyOf":[{"$ref":"#/components/schemas/FeedComment"},{"type":"null"}]},"commentOnly":{"description":"A reply's turn came before approval: the question airs","title":"Commentonly","type":"boolean"},"durationMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A song's length","title":"Durationms"},"endMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A song's line: when it ends in it","title":"Endms"},"id":{"format":"uuid","title":"Id","type":"string"},"index":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"That sentence's place in the item, from 0","title":"Index"},"kind":{"enum":["reply","speak","scene","talk","warmup","song"],"title":"Kind","type":"string"},"lyrics":{"anyOf":[{"items":{"$ref":"#/components/schemas/FeedLyricLine"},"type":"array"},{"type":"null"}],"description":"A song's whole timed lyrics, for drawing them ahead","title":"Lyrics"},"motionPresetId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motionpresetid"},"scene":{"anyOf":[{"enum":["opening","urge","follow","like","gift_guide","gift_thanks","welcome","follow_thanks","share_thanks","like_thanks","pk_open","pk_rush","pk_win","pk_lose","pk_draw"],"type":"string"},{"type":"null"}],"title":"Scene"},"sentence":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The sentence being said, once it has started","title":"Sentence"},"startMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A song's line: when it starts in it","title":"Startms"},"startedAt":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Startedat"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A song's title","title":"Title"}},"required":["id","kind","commentOnly","comment","sentence","index","startedAt","motionPresetId"],"title":"FeedNow","type":"object"},"FeedComment":{"additionalProperties":false,"properties":{"platformEventId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The event id the client reported the comment with; null for console input","title":"Platformeventid"},"text":{"title":"Text","type":"string"},"viewerName":{"title":"Viewername","type":"string"}},"required":["platformEventId","viewerName","text"],"title":"FeedComment","type":"object"},"FeedLyricLine":{"additionalProperties":false,"description":"One line of a song's lyrics, timed in the song (ADR 0015 §10).","properties":{"endMs":{"title":"Endms","type":"integer"},"startMs":{"title":"Startms","type":"integer"},"text":{"title":"Text","type":"string"},"words":{"anyOf":[{"items":{"$ref":"#/components/schemas/FeedLyricWord"},"type":"array"},{"type":"null"}],"description":"When each word is sung, from recognition; absent where it could not be told","title":"Words"}},"required":["startMs","endMs","text"],"title":"FeedLyricLine","type":"object"},"FeedLyricWord":{"additionalProperties":false,"description":"A word (a Chinese or Japanese character, a Latin word) of a lyric line and when it is sung;\na line's words together are its text, spaces and punctuation riding with the word before.","properties":{"endMs":{"title":"Endms","type":"integer"},"startMs":{"title":"Startms","type":"integer"},"text":{"title":"Text","type":"string"}},"required":["startMs","endMs","text"],"title":"FeedLyricWord","type":"object"},"FeedPk":{"additionalProperties":false,"description":"The PK round as a client sees it: to show it, and to know when to send audio.","properties":{"audio":{"$ref":"#/components/schemas/FeedPkAudio"},"endsAt":{"format":"date-time","title":"Endsat","type":"string"},"id":{"format":"uuid","title":"Id","type":"string"},"opponentName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponentname"},"phase":{"enum":["active","punish","ended"],"title":"Phase","type":"string"},"replyToOpponent":{"title":"Replytoopponent","type":"boolean"},"startedAt":{"format":"date-time","title":"Startedat","type":"string"}},"required":["id","phase","opponentName","startedAt","endsAt","replyToOpponent","audio"],"title":"FeedPk","type":"object"},"FeedPkAudio":{"additionalProperties":false,"properties":{"required":{"description":"Whether the client should send the opponent's audio (ADR 0014 appendix)","title":"Required","type":"boolean"}},"required":["required"],"title":"FeedPkAudio","type":"object"},"FeedQueueItem":{"additionalProperties":false,"properties":{"comment":{"anyOf":[{"$ref":"#/components/schemas/FeedComment"},{"type":"null"}],"description":"The comment a reply answers"},"durationMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"A song's length","title":"Durationms"},"id":{"format":"uuid","title":"Id","type":"string"},"kind":{"description":"reply: an answer to a comment; speak: an operator line; scene: a scene line","enum":["reply","speak","scene","talk","warmup","song"],"title":"Kind","type":"string"},"motionPresetId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The built-in motion it airs with, if any","title":"Motionpresetid"},"position":{"description":"1 airs next","title":"Position","type":"integer"},"scene":{"anyOf":[{"enum":["opening","urge","follow","like","gift_guide","gift_thanks","welcome","follow_thanks","share_thanks","like_thanks","pk_open","pk_rush","pk_win","pk_lose","pk_draw"],"type":"string"},{"type":"null"}],"description":"Which scene a scene line is","title":"Scene"},"state":{"description":"preparing: the reply is being written or reviewed; ready: cleared to air","enum":["preparing","ready"],"title":"State","type":"string"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"What will be said; only once ready, never a draft","title":"Text"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A song's title","title":"Title"}},"required":["id","kind","position","state","comment","text","motionPresetId"],"title":"FeedQueueItem","type":"object"},"MotionPreset":{"additionalProperties":false,"properties":{"group":{"enum":["reset","gestures","selling","expressions","small","food","props","looks","play"],"title":"Group","type":"string"},"holdSeconds":{"description":"How long it takes on air, as measured (ADR 0019 §3)","title":"Holdseconds","type":"integer"},"id":{"title":"Id","type":"string"},"text":{"description":"The description the avatar acts out","title":"Text","type":"string"}},"required":["id","group","text","holdSeconds"],"title":"MotionPreset","type":"object"},"LivePlayback":{"additionalProperties":false,"description":"A subscribe-only RTC credential for watching one session.","properties":{"appId":{"title":"Appid","type":"string"},"channelId":{"title":"Channelid","type":"string"},"expiresAt":{"description":"Unix seconds","title":"Expiresat","type":"integer"},"media":{"description":"Tracks the publisher sends: audio only for a voice-only session","items":{"enum":["audio","video"],"type":"string"},"title":"Media","type":"array"},"provider":{"const":"volcengine","title":"Provider","type":"string"},"publisherId":{"title":"Publisherid","type":"string"},"token":{"title":"Token","type":"string"},"userId":{"title":"Userid","type":"string"}},"required":["provider","appId","channelId","userId","publisherId","token","expiresAt","media"],"title":"LivePlayback","type":"object"},"RealtimeTicket":{"additionalProperties":false,"description":"A one-time ticket for opening the realtime channel of one room.","properties":{"expiresAt":{"format":"date-time","title":"Expiresat","type":"string"},"ticket":{"description":"Send as the first frame; valid 30 s, usable once","title":"Ticket","type":"string"},"url":{"description":"WebSocket URL; connect with subprotocol ailive.v1","title":"Url","type":"string"}},"required":["ticket","expiresAt","url"],"title":"RealtimeTicket","type":"object"},"SourceCreate":{"additionalProperties":false,"properties":{"capabilities":{"maxProperties":40,"patternProperties":{"^[a-z_]{1,40}$":{"anyOf":[{"enum":["full","masked","masked_nokey"],"type":"string"},{"type":"boolean"}]}},"title":"Capabilities","type":"object"},"channel":{"enum":["page_push","page_poll","page_dom","console_page","manual"],"title":"Channel","type":"string"},"collector":{"$ref":"#/components/schemas/CollectorInfo"},"identity":{"enum":["full","masked","masked_nokey"],"title":"Identity","type":"string"},"loginState":{"enum":["anonymous","viewer","owner"],"title":"Loginstate","type":"string"},"platform":{"enum":["douyin","kuaishou","taobao","jd","wechat_channels","xiaohongshu","bilibili","other"],"title":"Platform","type":"string"},"platformLiveId":{"anyOf":[{"maxLength":128,"minLength":1,"type":"string"},{"type":"null"}],"title":"Platformliveid"},"platformRoom":{"$ref":"#/components/schemas/PlatformRoomInfo"}},"required":["platform","platformRoom","collector","channel","loginState","identity"],"title":"SourceCreate","type":"object"},"PlatformRoomInfo":{"additionalProperties":false,"properties":{"anchor":{"anyOf":[{"$ref":"#/components/schemas/AnchorInfo"},{"type":"null"}]},"id":{"maxLength":128,"minLength":1,"title":"Id","type":"string"},"idType":{"anyOf":[{"maxLength":32,"minLength":1,"type":"string"},{"type":"null"}],"title":"Idtype"},"name":{"maxLength":60,"minLength":1,"title":"Name","type":"string"},"url":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Url"}},"required":["id","name"],"title":"PlatformRoomInfo","type":"object"},"AnchorInfo":{"additionalProperties":false,"properties":{"key":{"anyOf":[{"maxLength":160,"minLength":1,"type":"string"},{"type":"null"}],"title":"Key"},"name":{"anyOf":[{"maxLength":60,"minLength":1,"type":"string"},{"type":"null"}],"title":"Name"}},"title":"AnchorInfo","type":"object"},"SourceRegistered":{"additionalProperties":false,"properties":{"interaction":{"title":"Interaction","type":"boolean"},"limits":{"$ref":"#/components/schemas/SourceLimits"},"platformRoomId":{"format":"uuid","title":"Platformroomid","type":"string"},"sourceId":{"format":"uuid","title":"Sourceid","type":"string"}},"required":["sourceId","platformRoomId","interaction","limits"],"title":"SourceRegistered","type":"object"},"SourceLimits":{"additionalProperties":false,"properties":{"maxBatch":{"title":"Maxbatch","type":"integer"},"maxItemsPerSecond":{"title":"Maxitemspersecond","type":"integer"}},"required":["maxBatch","maxItemsPerSecond"],"title":"SourceLimits","type":"object"},"SourceUpdate":{"additionalProperties":false,"properties":{"capabilities":{"anyOf":[{"maxProperties":40,"patternProperties":{"^[a-z_]{1,40}$":{"anyOf":[{"enum":["full","masked","masked_nokey"],"type":"string"},{"type":"boolean"}]}},"type":"object"},{"type":"null"}],"title":"Capabilities"},"identity":{"anyOf":[{"enum":["full","masked","masked_nokey"],"type":"string"},{"type":"null"}],"title":"Identity"},"loginState":{"anyOf":[{"enum":["anonymous","viewer","owner"],"type":"string"},{"type":"null"}],"title":"Loginstate"},"platformLiveId":{"anyOf":[{"maxLength":128,"minLength":1,"type":"string"},{"type":"null"}],"title":"Platformliveid"},"status":{"anyOf":[{"enum":["unknown","live","offline","stopped"],"type":"string"},{"type":"null"}],"title":"Status"}},"title":"SourceUpdate","type":"object"}}},"tags":[{"name":"接入与令牌"},{"name":"直播间"},{"name":"平台数据"},{"name":"播出与音视频"},{"name":"PK 对手声音"},{"name":"系统"}]}