REST API 总览与调用约定
鉴权、信封、分页、错误、幂等、请求追踪与各产品端点索引(构建时从 openapi.json 生成)。
由公开 REST 接口定义生成
版本 v1.1.0 · 更新于 2026-10-26 · 修订 1
本页是 REST API Reference 的入口。所有接口表都在构建时从公开 REST 接口定义生成:下面的产品分组、后续每个分组页里的方法/路径/参数/请求体/响应/curl,都由脚本读接口定义直接渲染,不存在手抄的接口清单。
调用前提与请求示例#
- 基址:
https://api.your-domain.example(占位符,替换为你的控制面地址)。 - 鉴权:服务端调用使用
Authorization: Basic base64(customerId:customerSecret);控制台调用使用 Authorization: Bearer <session>。 - 请求头:写操作必须带
Content-Type: application/json;建议带 X-Request-Id 便于排障。 - 响应:成功返回资源对象;失败返回统一错误信封
{ code, message, reason, sdkCode, details? }。
bashcurl -s https://api.your-domain.example/v1/tokens \
-u "$CUSTOMER_ID:$CUSTOMER_SECRET" \
-H 'Content-Type: application/json' \
-d '{"channelName":"weekly-sync","uid":10001,"role":"host","ttlSeconds":3600}'
什么时候用 REST、什么时候用 SDK#
| 场景 | 用什么 | 说明 |
| 客户端要入会、发布、订阅 | 客户端 SDK | 见 SDK 平台总览;Token 由你的后端签发 |
| 服务端签发/续期 Token | POST /v1/tokens | 必须用项目 Basic 凭证(customerId:customerSecret) |
| 服务端查询频道/踢人/禁言 | /v1/channels/* | 语义化路径;声网等价路径见 声网兼容频道 |
| 服务端发起录制/推流/拉流/转码 | 对应产品分组 | 都是「任务」模型:创建 → 查询 → 停止/销毁 |
| 拿质量与用量数据 | /v1/analytics/* | 水晶球口径见 水晶球 |
| 控制台页面自身用 | /console/* | 控制台 BFF,浏览器持 Bearer 会话 |
权限与凭证边界#
| 凭证 | 出现位置 | 谁能看到 |
appId | 客户端 SDK 初始化 | 公开(可下发到浏览器/App) |
customerId / customerSecret | Authorization: Basic base64(...) | 仅服务端,泄露须立刻轮换 |
appCertificate | 只用于签发 Token | 仅服务端,绝不下发 |
| 控制台会话 | Authorization: Bearer <session> | 控制台前端 |
每个分组页里有什么#
- 该分组的操作索引(方法 / 路径 / 摘要,可点击跳转);
- 每个操作:参数表(名称/位置/必填/类型/约束)、请求体字段表 + 示例、响应表、可直接复制的
curl; - 该分组用到的
components.schemas(字段表由接口定义展开)。
与其他页面的关系#
- 错误信封与错误码: 错误码全表(由
接口定义 生成)。 - 回调(Webhook)事件: 回调事件参考(由
接口定义 生成)。 - 端到端示例:见 快速开始 中的可运行脚本。
下一步#
鉴权
| 凭证家族 | 用法 | 说明 |
projectBasic | basic | 请求头 Authorization: Basic base64(customerId:customerSecret),与声网 RESTful API 一致。 |
consoleBearer | bearer | 请求头 Authorization: Bearer <session>,先调用 POST /console/auth/login。 |
opsToken | bearer | operator token (NIMEET_OPS_TOKEN), required by the /internal/ops/** surface; when the token is unset that surface is closed |
sfuWebhookSignature | apiKey | SFU webhook signature verified by the media adapter (see verifyAndParseWebhook); a bad or missing signature is rejected with invalid_token |
项目凭证(Basic)只应存在于服务端;浏览器/移动端只持有 { appId, rtcToken, rtcUid }。
通用约定
- 写操作(POST/PUT/PATCH)必须带
Content-Type: application/json,否则返回 415 unsupported_media_type。 - 列表分页使用
page_no(0 起)与 page_size(1..500,默认 100)。 - 失败响应用统一信封
{ code, message, reason, sdkCode, details? },完整错误码见 错误码。 - 每个响应都回显
X-Request-Id,排障时优先提供它。 - 声网兼容路径以
/dev/v1/*、/v1/apps/{appid}/cloud_recording/*、/v1/projects/{appid}/fls/* 为前缀,响应使用声网的 success/data、{resourceId,sid,serverResponse} 等信封。 - 幂等:创建类接口重复提交可能返回同一资源;写操作失败后先查询再重试(见 错误码 的 409 说明)。
共 189 个操作,分 15 个产品分组,每个分组一个独立页面:
| 标签(页面) | 说明 | 操作数 |
tokens | Token issuance, renewal, verification and uid mapping (IM integration). | 5 |
channels | Channel and participant queries plus moderation. | 7 |
ban-rules | Kicking rules (Agora `kicking-rule` semantics). | 4 |
agora-channel | Agora-compatible RTC REST surface (`/dev/v1`). | 8 |
recordings | Cloud recording tasks and Agora-compatible cloud_recording flow. | 13 |
streaming | Bypass RTMP/HLS streaming tasks. | 10 |
webhooks | Callback endpoint configuration, delivery log and ingest. | 1 |
analytics | Crystal Ball: real-time monitoring, usage, quality, call search and data insights. | 7 |
console | Console BFF: sessions, projects, keys, services, collaborators, audit. | 80 |
media-push | Media Push: converters that push one RTC channel to a CDN address. | 5 |
media-gateway | Media Gateway: RTMP ingress streaming keys, flow configuration templates and online streams. | 12 |
media-pull | Media Pull: cloud players that pull an online media stream into an RTC channel. | 6 |
cloud-transcoding | Cloud Transcoding: builder tokens, transcoding tasks and adaptive-bitrate templates. | 7 |
notifications | Message-notification service addresses (firewall allow-list). | 2 |
whiteboard | Interactive Whiteboard rooms, scenes, content, replay and tokens. | 22 |
Schema 字典
components.schemas 声明与引用统计:
各分组页面内也会展开该分组用到的 schema。
AgoraRecordingFile — object{ fileName, duration, size }
| 字段 | 类型 | 必填 | 说明 |
fileName | string | 是 | |
duration | number | 是 | seconds; 0 while the file is still being written |
size | number | 是 | bytes; 0 while the file is still being written |
AgoraRecordingLayout — object{ resourceId, sid, serverResponse }
| 字段 | 类型 | 必填 | 说明 |
resourceId | string | 是 | |
sid | string | 是 | |
serverResponse | object{ taskId, layout } | 是 | |
AgoraRecordingQuery — object{ resourceId, sid, serverResponse }
| 字段 | 类型 | 必填 | 说明 |
resourceId | string | 是 | |
sid | string | 是 | |
serverResponse | object{ taskId, status, fileList, error } | 是 | |
AgoraRecordingResource — object{ resourceId }
| 字段 | 类型 | 必填 | 说明 |
resourceId | string | 是 | single-use marker valid for 30 s; pass it to start |
AgoraRecordingStart — object{ resourceId, sid, serverResponse }
| 字段 | 类型 | 必填 | 说明 |
resourceId | string | 是 | |
sid | string | 是 | our recording task id (Agora calls it sid) |
serverResponse | object{ taskId, state } | 是 | |
AgoraRecordingStop — object{ resourceId, sid, serverResponse }
| 字段 | 类型 | 必填 | 说明 |
resourceId | string | 是 | |
sid | string | 是 | |
serverResponse | object{ taskId, status, fileList } | 是 | |
AnalyticsCallEvent — object{ ts, kind, uid, detail }
| 字段 | 类型 | 必填 | 说明 |
ts | string | 是 | format date-time |
kind | enum(join | leave | network | video-send | audio-send) | 是 | |
uid | integer | 是 | |
detail | string | | |
AnalyticsCallSession — object
| 字段 | 类型 | 必填 | 说明 |
projectId | string | 是 | |
channelName | string | 是 | |
startedAt | string | 是 | format date-time |
endedAt | string | null | 是 | format date-time |
peakUsers | integer | 是 | |
users | array<object> | 是 | |
events | array<object{ ts, kind, uid, detail }> | 是 | |
AnalyticsCallUser — object
| 字段 | 类型 | 必填 | 说明 |
uid | integer | 是 | |
userId | string | null | 是 | |
role | enum(host | audience) | 是 | |
platform | integer | 是 | Agora platform code (0 iOS, 1 Android, 2 Windows, 5 Web, 6 macOS, 7 Linux, 8 Other) |
joinedAt | string | 是 | format date-time |
leftAt | string | null | 是 | format date-time |
durationSeconds | number | 是 | |
audioFreezeRate | number | 是 | |
videoFreezeRate | number | 是 | |
networkDelayRate | number | 是 | |
AnalyticsDiagnosis — object{ video, audio, network }
| 字段 | 类型 | 必填 | 说明 |
video | enum(good | warn | bad) | 是 | |
audio | enum(good | warn | bad) | 是 | |
network | enum(good | warn | bad) | 是 | |
AnalyticsQualityBucket — object
| 字段 | 类型 | 必填 | 说明 |
bucketStart | string | 是 | format date-time |
averageLoginTimeMs | number | 是 | |
audioFreezeRate | number | 是 | |
videoFreezeRate | number | 是 | |
networkDelayRate | number | 是 | |
inCallUsers | integer | 是 | |
inCallChannels | integer | 是 | |
joinAttempts | integer | 是 | |
joinSuccesses | integer | 是 | |
joinWithin5s | integer | 是 | |
AnalyticsUsageBucket — object{ bucket, type, minutes, channels, users }
| 字段 | 类型 | 必填 | 说明 |
bucket | string | 是 | |
type | enum(audio | video | recording | streaming | transcoding) | 是 | |
minutes | number | 是 | |
channels | integer | 是 | |
users | integer | 是 | |
BanRule — object
| 字段 | 类型 | 必填 | 说明 |
id | integer | | |
channelName | string | null | | |
uid | integer | null | | |
ip | string | null | | |
privileges | array<enum(join_channel | publish_audio | publish_video)> | | |
expireAt | string | null | | format date-time |
createdAt | string | | format date-time |
BillingOverview — object
| 字段 | 类型 | 必填 | 说明 |
provider | object | 是 | |
plans | array<object> | 是 | |
subscription | any | 是 | |
invoices | array<object> | 是 | |
topUps | array<object> | 是 | |
charges | array<object> | 是 | |
taxProfile | any | 是 | |
totals | object{ outstanding, paid, credit, currency } | 是 | |
generatedAt | string | 是 | format date-time |
BillingPlan — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
name | string | 是 | |
pricePerMonth | number | 是 | monthly list price in major units (see x-money-scale) |
currency | string | | ISO-4217 currency code;pattern ^[A-Z]{3}$ |
includedMinutes | number | 是 | metered minutes included before overage |
description | string | 是 | |
features | array<string> | 是 | |
BillingProvider — object
| 字段 | 类型 | 必填 | 说明 |
kind | enum(sandbox | live) | 是 | |
live | boolean | 是 | |
configured | boolean | 是 | |
currency | string | 是 | ISO-4217 currency code;pattern ^[A-Z]{3}$ |
taxRatePercent | number | 是 | |
disclaimer | string | 是 | |
capabilities | object{ payInvoice, topUp, subscribe } | 是 | |
BillingTotals — object{ outstanding, paid, credit, currency }
| 字段 | 类型 | 必填 | 说明 |
outstanding | number | 是 | invoiced but unpaid amount |
paid | number | 是 | settled amount |
credit | number | 是 | unconsumed top-up credit |
currency | string | 是 | ISO-4217 currency code;pattern ^[A-Z]{3}$ |
ChannelSummary — object{ channelName, userCount, profile, createdAt }
| 字段 | 类型 | 必填 | 说明 |
channelName | string | | |
userCount | integer | | |
profile | enum(communication | live) | | |
createdAt | string | null | | format date-time |
Error — object{ code, message, reason, sdkCode, details }
| 字段 | 类型 | 必填 | 说明 |
code | string | 是 | stable machine code, see errors.json |
message | string | 是 | |
reason | string | | |
sdkCode | integer | | Agora-aligned client error number |
details | object | | |
FlsEntryPoint — object{ entryPoint, entryPoints }
| 字段 | 类型 | 必填 | 说明 |
entryPoint | string | 是 | |
entryPoints | array<string> | 是 | |
FlsEntryPointDelete — object{ deleted, entryPoint }
| 字段 | 类型 | 必填 | 说明 |
deleted | boolean | 是 | |
entryPoint | string | 是 | |
FlsEntryPointList — object{ entryPoints }
| 字段 | 类型 | 必填 | 说明 |
entryPoints | array<string> | 是 | |
FlsTaskAccepted — object{ streamName, taskId, state, region }
| 字段 | 类型 | 必填 | 说明 |
streamName | string | 是 | |
taskId | string | 是 | |
state | enum(starting | running | stopping | stopped | failed | expired) | 是 | |
region | string | 是 | |
FlsTaskStop — object{ streamName, taskId, state }
| 字段 | 类型 | 必填 | 说明 |
streamName | string | 是 | |
taskId | string | 是 | |
state | enum(starting | running | stopping | stopped | failed | expired) | 是 | |
Invoice — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
projectId | string | null | 是 | |
projectName | string | 是 | |
period | string | 是 | billing period label, e.g. 2026-10 |
currency | string | 是 | ISO-4217 currency code;pattern ^[A-Z]{3}$ |
subtotal | number | 是 | amount before tax |
tax | number | 是 | tax amount |
total | number | 是 | amount due |
status | enum(open | paid | void) | 是 | |
issuedAt | string | 是 | format date-time |
paidAt | string | null | 是 | format date-time |
chargeId | string | null | 是 | |
lines | array<object{ type, minutes, amount }> | 是 | |
InvoiceLine — object{ type, minutes, amount }
| 字段 | 类型 | 必填 | 说明 |
type | string | 是 | |
minutes | number | 是 | |
amount | number | 是 | line amount |
PaymentCharge — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
kind | enum(invoice | topup) | 是 | |
referenceId | string | 是 | |
amount | number | 是 | charged amount |
currency | string | 是 | ISO-4217 currency code;pattern ^[A-Z]{3}$ |
provider | enum(sandbox) | 是 | |
status | enum(succeeded) | 是 | |
simulated | boolean | 是 | |
createdAt | string | 是 | format date-time |
Point — object{ x, y }
| 字段 | 类型 | 必填 | 说明 |
x | number | 是 | |
y | number | 是 | |
Project — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
appId | string | 是 | |
customerId | string | 是 | |
name | string | 是 | |
authMode | enum(token | appid) | 是 | |
status | enum(active | suspended) | 是 | |
tokenTtlSeconds | integer | 是 | |
privilegeTtlSeconds | integer | 是 | |
services | object{ recording, streaming, analytics } | 是 | |
quotas | object{ recordingConcurrent, streamingConcurrent, maxChannels } | 是 | |
createdAt | string | 是 | format date-time |
updatedAt | string | 是 | format date-time |
Quotas — object{ recordingConcurrent, streamingConcurrent, maxChannels }
| 字段 | 类型 | 必填 | 说明 |
recordingConcurrent | integer | 是 | |
streamingConcurrent | integer | 是 | |
maxChannels | integer | 是 | 0 = unlimited |
RecordingTaskBody — object
| 字段 | 类型 | 必填 | 说明 |
id | string | | |
channelName | string | | |
mode | enum(composite | individual | web) | | |
state | enum(starting | running | stopping | stopped | failed | expired) | | |
layout | object{ preset, canvasWidth, canvasHeight, backgroundColor } | | |
files | array<object{ objectKey, url, format, durationSeconds, sizeBytes }> | | |
usageSeconds | number | | |
error | string | null | | |
startedAt | string | null | | |
endedAt | string | null | | |
RecordingTaskList — object{ total, tasks }
| 字段 | 类型 | 必填 | 说明 |
total | integer | 是 | |
tasks | array<object> | 是 | |
ScenePpt — object{ src, width, height }
| 字段 | 类型 | 必填 | 说明 |
src | string | 是 | Image URL (http(s) or object-storage path). |
width | integer | 是 | >= 1 |
height | integer | 是 | >= 1 |
Services — object{ recording, streaming, analytics }
| 字段 | 类型 | 必填 | 说明 |
recording | boolean | 是 | |
streaming | boolean | 是 | |
analytics | boolean | 是 | |
StreamingTask — object
| 字段 | 类型 | 必填 | 说明 |
id | string | | |
channelName | string | | |
entryPoint | string | | |
streamName | string | | |
rtmpUrl | string | | |
hlsUrl | string | | |
state | enum(starting | running | stopping | stopped | failed | expired) | | |
idleTimeoutSeconds | integer | | |
lastActiveAt | string | | format date-time |
error | string | null | | |
StreamingTaskList — object{ total, streams }
| 字段 | 类型 | 必填 | 说明 |
total | integer | 是 | |
streams | array<object> | 是 | |
Subscription — object{ planId, status, startedAt, currentPeriodEnd, pricePerMonth, includedMinutes }
| 字段 | 类型 | 必填 | 说明 |
planId | string | 是 | |
status | enum(active | cancelled) | 是 | |
startedAt | string | 是 | format date-time |
currentPeriodEnd | string | 是 | format date-time |
pricePerMonth | number | 是 | subscription price in major units |
includedMinutes | number | 是 | |
TaxProfile — object{ legalName, country, taxId, address, updatedAt, status }
| 字段 | 类型 | 必填 | 说明 |
legalName | string | 是 | |
country | string | 是 | ISO-3166 alpha-2 |
taxId | string | 是 | |
address | string | 是 | |
updatedAt | string | 是 | format date-time |
status | enum(unverified) | 是 | this deployment never validates the tax id against an authority |
TokenIssueResponse — object
| 字段 | 类型 | 必填 | 说明 |
appId | string | 是 | |
channelName | string | 是 | |
rtcToken | string | 是 | |
rtcUid | integer | 是 | 1..2147483647 |
role | enum(host | audience) | 是 | |
privileges | array<string> | 是 | |
controlToken | string | | Opaque control-plane token for REST diagnostics/renewal. TokenIssueResult.controlToken is optional; toResult() always sets it. |
mediaRoom | string | | SFU room name when the media adapter namespaces by App ID (TokenIssueResult.mediaRoom). |
expireAt | string | 是 | format date-time |
privilegeExpireAt | string | 是 | format date-time |
TopUp — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
amount | number | 是 | credited amount |
currency | string | 是 | ISO-4217 currency code;pattern ^[A-Z]{3}$ |
status | enum(succeeded) | 是 | |
provider | enum(sandbox) | 是 | |
chargeId | string | 是 | |
note | string | 是 | |
createdAt | string | 是 | format date-time |
UserView — object
| 字段 | 类型 | 必填 | 说明 |
uid | integer | | |
userId | string | null | | |
role | enum(host | audience) | | |
platform | integer | | |
joinedAt | string | | format date-time |
audioMuted | boolean | | |
videoMuted | boolean | | |
publishing | object{ audio, video, screen } | | |
WebhookDelivery — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
projectId | string | 是 | |
envelope | object{ noticeId, productId, eventType, notifyMs, sid, payload } | 是 | |
url | string | 是 | |
state | enum(pending | delivering | delivered | failed | dropped) | 是 | |
attempts | integer | 是 | |
maxAttempts | integer | 是 | |
nextAttemptAt | string | null | 是 | format date-time |
lastStatusCode | integer | null | 是 | |
lastError | string | null | 是 | |
createdAt | string | 是 | format date-time |
updatedAt | string | 是 | format date-time |
WhiteboardImage — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
scenePath | string | 是 | |
src | string | 是 | |
width | number | 是 | |
height | number | 是 | |
x | number | 是 | |
y | number | 是 | |
locked | boolean | 是 | |
memberId | string | 是 | |
createdAt | string | 是 | format date-time |
WhiteboardMemberState — object
| 字段 | 类型 | 必填 | 说明 |
memberId | string | 是 | |
role | enum(admin | writer | reader) | 是 | |
appliance | string | 是 | canvas appliance name, e.g. pencil / pencilEraser / rectangle |
strokeColor | string | 是 | |
strokeWidth | number | 是 | |
canUndo | integer | 是 | |
canRedo | integer | 是 | |
WhiteboardOperation — object
| 字段 | 类型 | 必填 | 说明 |
seq | integer | 是 | |
type | enum(scene.add | scene.switch | scene.clear | stroke.append | stroke.erase | stroke.undo | stroke.redo | image.insert | viewport.set | room.ban | room.close | member.join | member.leave) | 是 | |
memberId | string | 是 | |
scenePath | string | null | 是 | |
strokeId | string | null | 是 | |
roomVersion | integer | 是 | |
payload | object | 是 | operation-specific payload, already validated by the service |
createdAt | string | 是 | format date-time |
WhiteboardPpt — object{ src, width, height }
| 字段 | 类型 | 必填 | 说明 |
src | string | 是 | |
width | number | 是 | |
height | number | 是 | |
WhiteboardReplay — object{ roomUUID, duration, from, to, frames }
| 字段 | 类型 | 必填 | 说明 |
roomUUID | string | 是 | |
duration | number | 是 | milliseconds between the first and the last frame |
from | string | null | 是 | |
to | string | null | 是 | |
frames | array<object{ offset, operation }> | 是 | |
WhiteboardRoom — object
| 字段 | 类型 | 必填 | 说明 |
uuid | string | 是 | |
teamUUID | string | 是 | |
appUUID | string | 是 | |
isRecord | boolean | 是 | |
isBan | boolean | 是 | |
phase | enum(active | banned | closed) | 是 | |
limit | integer | 是 | |
version | integer | 是 | |
createdAt | string | 是 | format date-time |
updatedAt | string | 是 | format date-time |
closedAt | string | null | 是 | format date-time |
WhiteboardRoomState — object
| 字段 | 类型 | 必填 | 说明 |
room | object | 是 | |
currentScenePath | string | 是 | |
viewport | object{ x, y, width, height, scale, updatedAt } | 是 | |
scenes | array<object> | 是 | |
memberStates | object | 是 | member id → current drawing state |
canUndoSteps | integer | 是 | |
canRedoSteps | integer | 是 | |
WhiteboardSceneSummary — object
| 字段 | 类型 | 必填 | 说明 |
path | string | 是 | |
name | string | 是 | |
ppt | any | 是 | |
strokeCount | integer | 是 | |
imageCount | integer | 是 | |
createdAt | string | 是 | format date-time |
updatedAt | string | 是 | format date-time |
WhiteboardSnapshot — object
| 字段 | 类型 | 必填 | 说明 |
roomUUID | string | 是 | |
appUUID | string | 是 | |
roomVersion | integer | 是 | |
exportedAt | string | 是 | format date-time |
currentScenePath | string | 是 | |
viewport | object{ x, y, width, height, scale, updatedAt } | 是 | |
scenes | array<object{ path, name, ppt, strokes, images }> | 是 | |
operations | array<object> | | |
WhiteboardStroke — object
| 字段 | 类型 | 必填 | 说明 |
id | string | 是 | |
scenePath | string | 是 | |
appliance | string | 是 | canvas appliance name, e.g. pencil / pencilEraser / rectangle |
color | string | 是 | |
width | number | 是 | |
points | array<array<number>> | 是 | flat [x, y, ...] point list |
memberId | string | 是 | |
seq | integer | 是 | |
undone | boolean | 是 | |
erased | boolean | 是 | |
createdAt | string | 是 | format date-time |
WhiteboardViewport — object{ x, y, width, height, scale, updatedAt }
| 字段 | 类型 | 必填 | 说明 |
x | number | 是 | |
y | number | 是 | |
width | number | 是 | |
height | number | 是 | |
scale | number | 是 | |
updatedAt | string | 是 | format date-time |
XlaMetricSet — object
| 字段 | 类型 | 必填 | 说明 |
samples | integer | 是 | |
joinAttempts | integer | 是 | |
joinSuccessRate | number | null | 是 | joinSuccess / joinAttempt samples; null when there is no sample |
joinWithin5sRate | number | null | 是 | |
videoFreezeRate | number | null | 是 | |
audioFreezeRate | number | null | 是 | |
networkDelayMs | number | null | 是 | |
availability | number | null | 是 | telemetry availability: observed 5-minute buckets / buckets in the month |
observedBuckets | integer | 是 | |
expectedBuckets | integer | 是 | |
XlaMonthReport — object
| 字段 | 类型 | 必填 | 说明 |
month | string | 是 | YYYY-MM |
from | string | 是 | format date-time |
to | string | 是 | format date-time |
scope | object{ kind, projectId, projectName } | 是 | |
metrics | object | 是 | |
projects | array<any> | 是 | |
insufficient | boolean | 是 | |
reason | string | null | 是 | |
note | string | 是 | how each metric is computed (no modelled percentages) |
generatedAt | string | 是 | format date-time |
XlaProjectRow — any
无字段声明。