From c9aaea503935a92208110a19f0c084995320e2a2 Mon Sep 17 00:00:00 2001 From: ysyneu Date: Sat, 17 Oct 2026 03:46:07 -0700 Subject: [PATCH] docs(api): describe access rules for team filters, private resources and roles - is_my_team / channel filters: an empty intersection with the caller's teams or accessible channels returns an empty result (alert events, templates, insights, schedules, RUM applications) - mapping API headers are returned only to callers who can edit the API - has_next_page on alert and incident lists stays exact past 1,000 rows - schedule delete checks every schedule and fails on an incomplete reference check; drop rule writes require Channels Manage; the 5-calendar limit applies to every member - disabled roles grant no permissions; built-in roles are rejected by upsert/enable/disable/delete; upsert only updates roles of the account - RUM private applications are enforced on batch get, facet count, session replay and issue detail/update; webhook test requires Applications Manage; replay segment not-yet-indexed error - Monitors SLS metadata and Prometheus proxy require datasource query access; rule detail requires folder access --- api-reference/monitors.openapi.en.json | 12 ++-- api-reference/monitors.openapi.zh.json | 12 ++-- api-reference/on-call.openapi.en.json | 56 +++++++-------- api-reference/on-call.openapi.zh.json | 56 +++++++-------- api-reference/openapi.en.json | 98 +++++++++++++------------- api-reference/openapi.zh.json | 98 +++++++++++++------------- api-reference/platform.openapi.en.json | 12 ++-- api-reference/platform.openapi.zh.json | 12 ++-- api-reference/rum.openapi.en.json | 18 ++--- api-reference/rum.openapi.zh.json | 18 ++--- en/openapi/pagination.mdx | 6 +- zh/openapi/pagination.mdx | 6 +- 12 files changed, 198 insertions(+), 206 deletions(-) diff --git a/api-reference/monitors.openapi.en.json b/api-reference/monitors.openapi.en.json index de1407db..71cc4812 100644 --- a/api-reference/monitors.openapi.en.json +++ b/api-reference/monitors.openapi.en.json @@ -662,7 +662,7 @@ "Monitors/Data sources" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- Use `query` to filter the project list and `offset` and `size` to paginate; `count` is the number of projects in the page and `total` the number matching the filter.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- The caller needs query access to the datasource (see `readonly_team_ids` on the datasource); otherwise the call fails with 403 `AccessDenied`.\n- Use `query` to filter the project list and `offset` and `size` to paginate; `count` is the number of projects in the page and `total` the number matching the filter.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-sls-projects", "metadata": { "sidebarTitle": "List SLS projects" @@ -761,7 +761,7 @@ "Monitors/Data sources" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- Supply `project` to select the SLS project whose logstores to list; use `offset` and `size` to paginate. The response is a plain array of logstore names.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- The caller needs query access to the datasource (see `readonly_team_ids` on the datasource); otherwise the call fails with 403 `AccessDenied`.\n- Supply `project` to select the SLS project whose logstores to list; use `offset` and `size` to paginate. The response is a plain array of logstore names.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-sls-logstores", "metadata": { "sidebarTitle": "List SLS logstores" @@ -1451,7 +1451,7 @@ "Monitors/Alert rules" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Alerting Rules Read** or **Alerting Rules Manage** (`monit`) |\n\n## Usage\n\n- `id` is required and must not be `0`; otherwise the call returns `InvalidParameter`.\n- A missing rule, or a rule of another account, returns `InvalidParameter` (`alert rule not found`).\n- No folder-level check applies: any caller with the permission above can read every rule in the account.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Alerting Rules Read** or **Alerting Rules Manage** (`monit`) |\n\n## Usage\n\n- `id` is required and must not be `0`; otherwise the call returns `InvalidParameter`.\n- A missing rule, or a rule of another account, returns `InvalidParameter` (`alert rule not found`).\n- The caller must have access to the rule's folder (the account owner or an admin, the creator of the folder or an ancestor, or a member of the team bound to it or an ancestor); otherwise the call returns `AccessDenied`. A rule whose folder no longer exists returns `InvalidParameter` (folder not found).", "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-info-v2", "metadata": { "sidebarTitle": "Get alert rule detail (V2)" @@ -2475,7 +2475,7 @@ } }, "400": { - "description": "The `X-DSID` header is not a number, the data source is not a Prometheus data source, or no monit-edge is registered for the data source's cluster. Returned as `text/plain`.", + "description": "The `X-DSID` header is not a number, the data source is not a Prometheus data source, no monit-edge is registered for the data source's cluster, or the data source does not exist or belongs to another account (message `data source not found`). Returned as `text/plain`.", "content": { "text/plain": { "schema": { @@ -2494,7 +2494,7 @@ "$ref": "#/components/responses/TooManyRequests" }, "500": { - "description": "The data source does not exist or belongs to another account (message `data source not found`), or the data source lookup or proxied request failed. Returned as `text/plain`.", + "description": "The data source lookup or proxied request failed. Returned as `text/plain`.", "content": { "text/plain": { "schema": { @@ -2509,7 +2509,7 @@ "Monitors/Data sources" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Any valid `app_key` (read-only; not gated by a specific permission class) |\n| Edge requirement | Querying a specific data source requires **monit-edge v0.35.0 or later** |\n\n## Usage\n\n- Pass the target data source ID in the `X-DSID` header. It must belong to the authenticated account and be a Prometheus data source; use `/monit/datasource/list` to obtain its ID.\n- The 200 body is the data source's native Prometheus HTTP API payload, **not** the standard `{ request_id, data }` envelope. Query-string parameters are forwarded unchanged, so Prometheus's own parameters such as `match[]`, `start`, and `end` work.\n- When `X-DSID` is omitted, or any monit-edge of the data source's cluster is older than v0.35.0, the request is answered by the platform's own Prometheus instead of your data source. Send the header and keep monit-edge up to date to get your data source's values.\n- Failures raised before the data source is reached are returned as `text/plain` with the matching 4xx or 5xx status. A status of 400 or above returned by the data source itself is passed through with its own body.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Any valid `app_key` (read-only; not gated by a specific permission class) |\n| Edge requirement | Querying a specific data source requires **monit-edge v0.35.0 or later** |\n\n## Usage\n\n- Pass the target data source ID in the `X-DSID` header. It must belong to the authenticated account and be a Prometheus data source; use `/monit/datasource/list` to obtain its ID.\n- When the data source restricts querying to certain teams, only members of those teams, its managing team, and account owners or admins can query it; others get 403. An unknown data source ID returns 400.\n- The 200 body is the data source's native Prometheus HTTP API payload, **not** the standard `{ request_id, data }` envelope. Query-string parameters are forwarded unchanged, so Prometheus's own parameters such as `match[]`, `start`, and `end` work.\n- When `X-DSID` is omitted, or any monit-edge of the data source's cluster is older than v0.35.0, the request is answered by the platform's own Prometheus instead of your data source. Send the header and keep monit-edge up to date to get your data source's values.\n- Failures raised before the data source is reached are returned as `text/plain` with the matching 4xx or 5xx status. A status of 400 or above returned by the data source itself is passed through with its own body.", "href": "/en/api-reference/monitors/data-sources/monit-prometheus-read-label-values", "metadata": { "sidebarTitle": "List Prometheus label values" diff --git a/api-reference/monitors.openapi.zh.json b/api-reference/monitors.openapi.zh.json index 283a2824..92ee6fca 100644 --- a/api-reference/monitors.openapi.zh.json +++ b/api-reference/monitors.openapi.zh.json @@ -662,7 +662,7 @@ "Monitors/告警数据源" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 使用 `query` 过滤项目列表,使用 `offset` 和 `size` 分页;`count` 为当前页项目数,`total` 为满足过滤条件的项目总数。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 调用者需要有该数据源的查询权限(见数据源的 `readonly_team_ids`),否则返回 403 `AccessDenied`。\n- 使用 `query` 过滤项目列表,使用 `offset` 和 `size` 分页;`count` 为当前页项目数,`total` 为满足过滤条件的项目总数。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", "href": "/zh/api-reference/monitors/data-sources/monit-datasource-read-sls-projects", "metadata": { "sidebarTitle": "查询 SLS 项目列表" @@ -761,7 +761,7 @@ "Monitors/告警数据源" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 通过 `project` 指定要列出日志库的 SLS 项目;使用 `offset` 和 `size` 分页。响应是日志库名称组成的数组。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 调用者需要有该数据源的查询权限(见数据源的 `readonly_team_ids`),否则返回 403 `AccessDenied`。\n- 通过 `project` 指定要列出日志库的 SLS 项目;使用 `offset` 和 `size` 分页。响应是日志库名称组成的数组。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", "href": "/zh/api-reference/monitors/data-sources/monit-datasource-read-sls-logstores", "metadata": { "sidebarTitle": "查询 SLS 日志库列表" @@ -1451,7 +1451,7 @@ "Monitors/告警规则" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **告警规则查看**或**告警规则管理**(`monit`) |\n\n## 使用说明\n\n- `id` 必填且不能为 `0`,否则返回 `InvalidParameter`。\n- 规则不存在或属于其他账户时返回 `InvalidParameter`(`alert rule not found`)。\n- 不做文件夹级权限校验:具备上述权限的调用者可读取账户内的任意规则。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **告警规则查看**或**告警规则管理**(`monit`) |\n\n## 使用说明\n\n- `id` 必填且不能为 `0`,否则返回 `InvalidParameter`。\n- 规则不存在或属于其他账户时返回 `InvalidParameter`(`alert rule not found`)。\n- 调用者必须有该规则所在文件夹的权限(账户所有者或管理员、该文件夹或其上级文件夹的创建者,或绑定到该文件夹或其上级文件夹的团队成员),否则返回 `AccessDenied`。所在文件夹已不存在的规则返回 `InvalidParameter`(folder not found)。", "href": "/zh/api-reference/monitors/alert-rules/monit-rule-read-info-v2", "metadata": { "sidebarTitle": "获取告警规则详情 V2" @@ -2475,7 +2475,7 @@ } }, "400": { - "description": "`X-DSID` 请求头不是数字、数据源不是 Prometheus 类型,或数据源所在集群没有已注册的 monit-edge。以 `text/plain` 返回。", + "description": "`X-DSID` 请求头不是数字、数据源不是 Prometheus 类型,数据源所在集群没有已注册的 monit-edge,或数据源不存在、属于其他账户(消息为 `data source not found`)。以 `text/plain` 返回。", "content": { "text/plain": { "schema": { @@ -2494,7 +2494,7 @@ "$ref": "#/components/responses/TooManyRequests" }, "500": { - "description": "数据源不存在或属于其他账户(消息为 `data source not found`),或数据源查询、代理请求失败。以 `text/plain` 返回。", + "description": "数据源查询或代理请求失败。以 `text/plain` 返回。", "content": { "text/plain": { "schema": { @@ -2509,7 +2509,7 @@ "Monitors/告警数据源" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 任意有效的 `app_key`(只读,不受特定权限分类限制) |\n| Edge 版本要求 | 查询指定数据源要求 **monit-edge v0.35.0 或更高版本** |\n\n## 使用说明\n\n- 通过 `X-DSID` 请求头传入目标数据源 ID。数据源必须属于当前账户且为 Prometheus 类型;可用 `/monit/datasource/list` 获取 ID。\n- 200 响应体是数据源原生的 Prometheus HTTP API 结构,**不是**统一的 `{ request_id, data }` envelope。查询字符串参数会原样转发,因此 Prometheus 自身的 `match[]`、`start`、`end` 等参数都可使用。\n- 省略 `X-DSID`,或数据源所在集群中有任意 monit-edge 低于 v0.35.0 时,请求会由平台自有的 Prometheus 响应,而不是您的数据源。请携带该请求头并保持 monit-edge 为较新版本,才能获得数据源自身的取值。\n- 到达数据源之前发生的失败以 `text/plain` 返回,并携带对应的 4xx/5xx 状态码。数据源自身返回的 400 及以上状态码会连同其响应体一并透传。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 任意有效的 `app_key`(只读,不受特定权限分类限制) |\n| Edge 版本要求 | 查询指定数据源要求 **monit-edge v0.35.0 或更高版本** |\n\n## 使用说明\n\n- 通过 `X-DSID` 请求头传入目标数据源 ID。数据源必须属于当前账户且为 Prometheus 类型;可用 `/monit/datasource/list` 获取 ID。\n- 若数据源限制了可查询的团队,只有这些团队的成员、其管理团队以及账户所有者或管理员可以查询,其他人会收到 403。数据源 ID 不存在时返回 400。\n- 200 响应体是数据源原生的 Prometheus HTTP API 结构,**不是**统一的 `{ request_id, data }` envelope。查询字符串参数会原样转发,因此 Prometheus 自身的 `match[]`、`start`、`end` 等参数都可使用。\n- 省略 `X-DSID`,或数据源所在集群中有任意 monit-edge 低于 v0.35.0 时,请求会由平台自有的 Prometheus 响应,而不是您的数据源。请携带该请求头并保持 monit-edge 为较新版本,才能获得数据源自身的取值。\n- 到达数据源之前发生的失败以 `text/plain` 返回,并携带对应的 4xx/5xx 状态码。数据源自身返回的 400 及以上状态码会连同其响应体一并透传。", "href": "/zh/api-reference/monitors/data-sources/monit-prometheus-read-label-values", "metadata": { "sidebarTitle": "查询 Prometheus 标签值列表" diff --git a/api-reference/on-call.openapi.en.json b/api-reference/on-call.openapi.en.json index bd1132a3..50ec5cb3 100644 --- a/api-reference/on-call.openapi.en.json +++ b/api-reference/on-call.openapi.en.json @@ -1017,7 +1017,7 @@ "On-call/Alert enrichment" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `data: null` when no mapping API with this ID exists in the account.\n- A soft-deleted mapping API is still returned, with `status` = `deleted`.\n- There is no team check: any caller in the account can read any mapping API, including its `headers` in plain text.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `data: null` when no mapping API with this ID exists in the account.\n- A soft-deleted mapping API is still returned, with `status` = `deleted`.\n- Any caller in the account can read any mapping API. `headers` is returned in plain text only when the caller can edit the API (the account owner or an admin, the API's creator, or a member of its team); otherwise it is `null`.", "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-read-info", "metadata": { "sidebarTitle": "Get mapping API detail" @@ -1608,7 +1608,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per team per time bucket. Incidents without a team are aggregated into a row that has no `team_id`. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per team per time bucket. Incidents without a team are aggregated into a row that has no `team_id`. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-team", "metadata": { "sidebarTitle": "Get team insight" @@ -2173,7 +2173,7 @@ "On-call/Alerts" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Incidents Read** (`on-call`) or **Incidents Manage** (`on-call`) or **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- `start_time` and `end_time` are required Unix seconds and filter on the alert's `start_time`; the span must not exceed 31 days.\n- With `by_updated_at: true`, an `updated_at` window with the same bounds is added on top of the `start_time` filter, and the span must not exceed 7 days.\n- A `start_time` earlier than the account's data retention period is moved up to the retention start; an `end_time` before that start returns `InvalidParameter`.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.\n- `total` is capped at 1,000. In page-number mode `has_next_page` is computed from that capped total, so it turns `false` once you reach 1,000 alerts even when more match. Every non-empty page returns `search_after_ctx` for its last alert; to read past 1,000, pass it back and continue in cursor mode, where `has_next_page` is exact.\n- Results are filtered by the caller's channel data-access permissions.\n- Set `is_active` to `true` to retrieve only active (firing) alerts; `false` to retrieve resolved alerts.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Incidents Read** (`on-call`) or **Incidents Manage** (`on-call`) or **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- `start_time` and `end_time` are required Unix seconds and filter on the alert's `start_time`; the span must not exceed 31 days.\n- With `by_updated_at: true`, an `updated_at` window with the same bounds is added on top of the `start_time` filter, and the span must not exceed 7 days.\n- A `start_time` earlier than the account's data retention period is moved up to the retention start; an `end_time` before that start returns `InvalidParameter`.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.\n- `total` is capped at 1,000. `has_next_page` does not depend on `total`: it is exact in both page-number and cursor mode, also past 1,000 alerts. Every non-empty page returns `search_after_ctx` for its last alert; pass it back to read past the 10,000-row page-number limit.\n- Results are filtered by the caller's channel data-access permissions.\n- Set `is_active` to `true` to retrieve only active (firing) alerts; `false` to retrieve resolved alerts.", "href": "/en/api-reference/on-call/alerts/alert-read-list", "metadata": { "sidebarTitle": "List alerts" @@ -3433,7 +3433,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only a `disabled` rule can be enabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Only a `disabled` rule can be enabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-enable", "metadata": { "sidebarTitle": "Enable drop rule" @@ -3507,7 +3507,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- Sorted by incident creation time, newest first by default (`asc: true` for oldest first).\n- Page with `p` + `limit` (at most 10,000 records reachable) or, for deeper reads, pass the previous page's `search_after_ctx` back. When `search_after_ctx` is sent, `total` counts only the incidents after the cursor.\n- `responder_ids` keeps incidents in which any of the given members was a responder.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- Sorted by incident creation time, newest first by default (`asc: true` for oldest first).\n- Page with `p` + `limit` (at most 10,000 records reachable) or, for deeper reads, pass the previous page's `search_after_ctx` back. When `search_after_ctx` is sent, `total` counts only the incidents after the cursor.\n- `responder_ids` keeps incidents in which any of the given members was a responder.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-incident-list", "metadata": { "sidebarTitle": "List insight incidents" @@ -4758,7 +4758,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only a `disabled` rule can be deleted; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Only a `disabled` rule can be deleted; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-delete", "metadata": { "sidebarTitle": "Delete drop rule" @@ -5009,7 +5009,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per time bucket for the whole account. `responder_ids` and `incident_ids` are ignored; use `/insight/responder` or `/insight/incident/list` for those.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per time bucket for the whole account. `responder_ids` and `incident_ids` are ignored; use `/insight/responder` or `/insight/incident/list` for those.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-account", "metadata": { "sidebarTitle": "Get account-level insight" @@ -6229,7 +6229,7 @@ "On-call/Schedules" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Sorted by creation time, newest first. `query` matches the schedule name or description as a substring.\n- `is_my_team: true` keeps schedules owned by the caller's teams. `is_my_manage: true` keeps schedules owned by the caller's teams or created by the caller. The two cannot both be true. `team_ids` is intersected with either filter.\n- Without `start`/`end`, items carry stored configuration only (`layers`, `schedule_layers`, `cur_oncall`, `next_oncall` are `null`). With both set, `layers`, `schedule_layers`, `final_schedule`, `cur_oncall` and `next_oncall` are computed; `layer_schedules` stays `null` here.\n- `start` and `end` are 10-digit Unix timestamps in seconds; `end` must be after `start` and at most 45 days later. Sending `end` without `start` is rejected.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Sorted by creation time, newest first. `query` matches the schedule name or description as a substring.\n- `is_my_team: true` keeps schedules owned by the caller's teams, optionally narrowed by `team_ids`; when `team_ids` shares no team with the caller, or the caller belongs to no team, the list is empty. `is_my_manage: true` keeps schedules created by the caller plus those owned by the caller's teams (narrowed by `team_ids`; team IDs outside the caller's teams are ignored). The two cannot both be true.\n- Without `start`/`end`, items carry stored configuration only (`layers`, `schedule_layers`, `cur_oncall`, `next_oncall` are `null`). With both set, `layers`, `schedule_layers`, `final_schedule`, `cur_oncall` and `next_oncall` are computed; `layer_schedules` stays `null` here.\n- `start` and `end` are 10-digit Unix timestamps in seconds; `end` must be after `start` and at most 45 days later. Sending `end` without `start` is rejected.", "href": "/en/api-reference/on-call/schedules/schedule-list", "metadata": { "sidebarTitle": "List schedules" @@ -6821,7 +6821,7 @@ "On-call/Schedules" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Schedules Manage** (`on-call`) |\n\n## Usage\n\n- A schedule still referenced by an escalation rule cannot be deleted: the call fails with HTTP 400 `ReferenceExist`, nothing is deleted, and `data.refs` lists the referencing rules (`kind`, `name`, `href`).\n- IDs that do not exist are ignored. The deletion of all listed schedules happens in one transaction.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Schedules Manage** (`on-call`) |\n\n## Usage\n\n- A schedule still referenced by an escalation rule cannot be deleted: the call fails with HTTP 400 `ReferenceExist`, nothing is deleted, and `data.refs` lists the referencing rules (`kind`, `name`, `href`).\n- The caller must be able to edit every listed schedule: the account owner or an admin, the schedule's creator, or a member of its team. Otherwise the call returns `AccessDenied` and nothing is deleted.\n- If the reference check cannot be completed, the call returns `InternalError` and nothing is deleted.\n- IDs that do not exist are ignored. The deletion of all listed schedules happens in one transaction.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/schedules/schedule-delete", "metadata": { "sidebarTitle": "Delete schedules" @@ -7050,7 +7050,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Full replacement: an omitted `description` becomes empty, and an omitted `filters` clears all conditions so the rule matches nothing.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Full replacement: an omitted `description` becomes empty, and an omitted `filters` clears all conditions so the rule matches nothing.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-update", "metadata": { "sidebarTitle": "Update drop rule" @@ -7231,7 +7231,7 @@ "On-call/Calendars" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |\n\n## Usage\n\n- A limit of 5 calendars is checked only when the caller is the account owner: once the account holds 5 calendars, the owner's create call returns `InvalidParameter`. Calls made by other members are not counted against this limit.\n- `cal_name` must be unique within the account, `timezone` must be a valid IANA name, and a nonzero `team_id` must be a team of the account; otherwise the call returns `InvalidParameter`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |\n\n## Usage\n\n- An account can hold at most 5 calendars: once it has 5, a create call by any member returns `InvalidParameter`.\n- `cal_name` must be unique within the account, `timezone` must be a valid IANA name, and a nonzero `team_id` must be a team of the account; otherwise the call returns `InvalidParameter`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/calendars/calendar-create", "metadata": { "sidebarTitle": "Create calendar" @@ -8047,7 +8047,7 @@ "On-call/Alerts" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Both `start_time` and `end_time` are required Unix epoch seconds. `start_time` must be less than `end_time`; the span must not exceed 31 days.\n- Results are filtered by the caller's channel data-access permissions.\n- `severities` is a comma-separated list matched against `event_severity`, e.g. `\"Critical,Warning\"`. Values are not validated, so an unknown value (or `Ok`) matches nothing.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Both `start_time` and `end_time` are required Unix epoch seconds. `start_time` must be less than `end_time`; the span must not exceed 31 days.\n- Results are filtered by the caller's channel data-access permissions. When `channel_ids` is sent and none of the listed channels is accessible to the caller, the result is empty.\n- `severities` is a comma-separated list matched against `event_severity`, e.g. `\"Critical,Warning\"`. Values are not validated, so an unknown value (or `Ok`) matches nothing.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.", "href": "/en/api-reference/on-call/alerts/alert-event-read-list", "metadata": { "sidebarTitle": "List raw alert events" @@ -9045,7 +9045,7 @@ "On-call/Incidents" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Read** or **Incidents Manage** or **Channels Read** or **Channels Manage** or **Templates Read** or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Only incidents in channels the caller can access are returned.\n- `start_time` and `end_time` filter on incident start time and may span at most 31 days. A `start_time` earlier than the account's data retention period is moved up to the retention boundary; an `end_time` before that boundary fails with `InvalidParameter`.\n- Results are sorted by `start_time`, newest first unless `asc` is `true`.\n- Paginate with `p` and `limit`, or pass the previous response's `search_after_ctx`, in which case `p` is ignored.\n- `total` is capped at 1,000. With `p`/`limit` paging, `has_next_page` turns `false` once `p` × `limit` reaches 1,000 even if more incidents match. To read further, pass the `search_after_ctx` returned with every non-empty page; in cursor mode `has_next_page` reflects whether more rows really exist.\n- Without `progress`, incidents in every progress state are returned.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Read** or **Incidents Manage** or **Channels Read** or **Channels Manage** or **Templates Read** or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Only incidents in channels the caller can access are returned.\n- `start_time` and `end_time` filter on incident start time and may span at most 31 days. A `start_time` earlier than the account's data retention period is moved up to the retention boundary; an `end_time` before that boundary fails with `InvalidParameter`.\n- Results are sorted by `start_time`, newest first unless `asc` is `true`.\n- Paginate with `p` and `limit`, or pass the previous response's `search_after_ctx`, in which case `p` is ignored.\n- `total` is capped at 1,000. `has_next_page` does not depend on `total`: with `p`/`limit` paging and in cursor mode alike it reflects whether more rows really exist, also past 1,000 incidents. Every non-empty page also returns `search_after_ctx` for cursor paging.\n- Without `progress`, incidents in every progress state are returned.", "href": "/en/api-reference/on-call/incidents/incident-list", "metadata": { "sidebarTitle": "List incidents" @@ -10045,7 +10045,7 @@ "On-call/Alert enrichment" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Returns every non-deleted mapping API in one response, without pagination; `total` is the number of items.\n- Mapping APIs of all teams are returned, with their `headers` in plain text.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Returns every non-deleted mapping API in one response, without pagination; `total` is the number of items.\n- Mapping APIs of all teams are returned. `headers` is returned in plain text only for APIs the caller can edit (the account owner or an admin, the API's creator, or a member of its team); for the other APIs it is `null`.", "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-read-list", "metadata": { "sidebarTitle": "List mapping APIs" @@ -10435,7 +10435,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per channel per time bucket. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per channel per time bucket. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-channel", "metadata": { "sidebarTitle": "Get channel insight" @@ -10615,7 +10615,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Drop rules are checked first, before silence and inhibit rules. An event matching any enabled drop rule is discarded: no alert, incident or notification is produced.\n- Without `filters`, or with an empty list, the rule matches nothing.\n- An unknown `channel_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Drop rules are checked first, before silence and inhibit rules. An event matching any enabled drop rule is discarded: no alert, incident or notification is produced.\n- Without `filters`, or with an empty list, the rule matches nothing.\n- An unknown `channel_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-create", "metadata": { "sidebarTitle": "Create drop rule" @@ -13072,7 +13072,7 @@ "On-call/Notification templates" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Templates Read** (`on-call`) or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- The first page always starts with the built-in preset template (`template_id` `6321aad26c12104586a88916`), whatever the filters; it is also counted in `total`.\n- Results are sorted by `orderby` (default `created_at`), newest first unless `asc` is `true`. Soft-deleted templates are excluded.\n- `is_my_team: true` limits results to templates of the caller's teams; with `team_ids` also sent, only the teams in both lists are kept. If that intersection is empty, no team filter is applied and templates of all teams are returned. If the caller belongs to no team, the response is empty (`total` = 0, no preset).\n- `query` is a case-insensitive regular expression on `template_name`; an invalid expression is matched as literal text.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Templates Read** (`on-call`) or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- The first page always starts with the built-in preset template (`template_id` `6321aad26c12104586a88916`), whatever the filters; it is also counted in `total`.\n- Results are sorted by `orderby` (default `created_at`), newest first unless `asc` is `true`. Soft-deleted templates are excluded.\n- `is_my_team: true` limits results to templates of the caller's teams; with `team_ids` also sent, only the teams in both lists are kept. If that intersection is empty, or the caller belongs to no team, the response is empty (`total` = 0, no preset).\n- `query` is a case-insensitive regular expression on `template_name`; an invalid expression is matched as literal text.", "href": "/en/api-reference/on-call/notification-templates/template-read-list", "metadata": { "sidebarTitle": "List templates" @@ -13188,7 +13188,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per responder per time bucket; `responder_ids` limits which responders are returned. `seconds_to_close_from`/`seconds_to_close_to` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per responder per time bucket; `responder_ids` limits which responders are returned. `seconds_to_close_from`/`seconds_to_close_to` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-responder", "metadata": { "sidebarTitle": "Get responder insight" @@ -14299,7 +14299,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only an `enabled` rule can be disabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Only an `enabled` rule can be disabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-disable", "metadata": { "sidebarTitle": "Disable drop rule" @@ -19440,7 +19440,7 @@ "type": "integer", "format": "int64" }, - "description": "Filter by channel IDs. At most 100 entries.", + "description": "Filter by channel IDs. At most 100 entries. Channels the caller cannot access are dropped; if none remain, the result is empty.", "maxItems": 100 }, "severities": { @@ -20308,7 +20308,7 @@ }, "has_next_page": { "type": "boolean", - "description": "`true` when another page exists. In cursor mode (`search_after_ctx` sent) it is exact. In page-number mode it compares `p * limit` with the capped `total`, so it is `false` past 1,000 alerts even when more match; continue with `search_after_ctx` instead." + "description": "`true` when another page exists. Exact in both cursor mode (`search_after_ctx` sent) and page-number mode, including past the 1,000 cap of `total`." }, "search_after_ctx": { "type": "string", @@ -25102,7 +25102,7 @@ }, "has_next_page": { "type": "boolean", - "description": "Whether another page exists. With `p`/`limit` paging it is computed against the capped `total`, so it is `false` past 1,000 matches even when more exist; with `search_after_ctx` paging it reflects the real data. Always `false` for `POST /incident/list-by-ids`." + "description": "Whether another page exists. Reflects the real data with both `p`/`limit` and `search_after_ctx` paging, including past the 1,000 cap of `total`. Always `false` for `POST /incident/list-by-ids`." }, "search_after_ctx": { "type": "string", @@ -25651,7 +25651,7 @@ }, "is_my_team": { "type": "boolean", - "description": "Restrict results to the caller's teams (intersected with `team_ids` when both are set). When the caller belongs to no team, the result is empty." + "description": "Restrict results to the caller's teams (intersected with `team_ids` when both are set). When that intersection is empty, or the caller belongs to no team, the result is empty." }, "time_zone": { "type": "string", @@ -26723,7 +26723,7 @@ "additionalProperties": { "type": "string" }, - "description": "Request headers sent with every call, returned in plain text. `null` when none are configured." + "description": "Request headers sent with every call, returned in plain text to callers who can edit the API (the account owner or an admin, the API's creator, or a member of its team). `null` when none are configured or the caller cannot edit the API." }, "timeout": { "type": "integer", @@ -29081,11 +29081,11 @@ }, "is_my_team": { "type": "boolean", - "description": "Only schedules owned by the caller's teams. A caller in no team gets an empty list." + "description": "Only schedules owned by the caller's teams. When `team_ids` shares no team with the caller, or the caller belongs to no team, the list is empty." }, "is_my_manage": { "type": "boolean", - "description": "Only schedules owned by the caller's teams or created by the caller." + "description": "Only schedules owned by the caller's teams or created by the caller. `team_ids` narrows the team part; team IDs outside the caller's teams are ignored." }, "team_ids": { "type": "array", @@ -29093,7 +29093,7 @@ "type": "integer", "format": "int64" }, - "description": "Only schedules owned by these teams; intersected with `is_my_team`/`is_my_manage` when either is set." + "description": "Only schedules owned by these teams. With `is_my_team` or `is_my_manage`, only the teams the caller belongs to are kept." }, "start": { "type": "integer", @@ -30438,7 +30438,7 @@ }, "is_my_team": { "type": "boolean", - "description": "When `true`, only templates of teams the caller belongs to are returned. If `team_ids` is also sent, only teams in both lists are kept; when they share no team, no team filter is applied and templates of all teams are returned. A caller in no team gets an empty result.", + "description": "When `true`, only templates of teams the caller belongs to are returned. If `team_ids` is also sent, only teams in both lists are kept. When they share no team, or the caller belongs to no team, the result is empty.", "default": false }, "team_ids": { diff --git a/api-reference/on-call.openapi.zh.json b/api-reference/on-call.openapi.zh.json index 23528f69..d9db047a 100644 --- a/api-reference/on-call.openapi.zh.json +++ b/api-reference/on-call.openapi.zh.json @@ -1017,7 +1017,7 @@ "On-call/标签增强" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 账户内不存在该 ID 的映射 API 时返回 `data: null`。\n- 已软删除的映射 API 仍会返回,此时 `status` 为 `deleted`。\n- 不做团队校验:账户内任何调用方都能读取任意映射 API,包括明文的 `headers`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 账户内不存在该 ID 的映射 API 时返回 `data: null`。\n- 已软删除的映射 API 仍会返回,此时 `status` 为 `deleted`。\n- 账户内任何调用方都能读取任意映射 API。只有调用者可编辑该 API(账户所有者或管理员、该 API 的创建者或其所属团队成员)时才以明文返回 `headers`,否则为 `null`。", "href": "/zh/api-reference/on-call/alert-enrichment/mapping-api-read-info", "metadata": { "sidebarTitle": "查看映射 API 详情" @@ -1608,7 +1608,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个团队、每个时间桶返回一行。未归属团队的故障汇总为一行,该行没有 `team_id`。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个团队、每个时间桶返回一行。未归属团队的故障汇总为一行,该行没有 `team_id`。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-team", "metadata": { "sidebarTitle": "查看团队洞察" @@ -2173,7 +2173,7 @@ "On-call/告警管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **故障查看**(`on-call`) 或 **故障管理**(`on-call`) 或 **集成中心查看**(`on-call`) 或 **集成中心管理**(`on-call`) |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 为必填的 Unix 时间戳(秒),按告警的 `start_time` 过滤,跨度不超过 31 天。\n- `by_updated_at` 为 `true` 时,在 `start_time` 过滤之外再按相同区间过滤 `updated_at`,且跨度不超过 7 天。\n- `start_time` 早于账户数据保留期时会被调整为保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。\n- `total` 最多为 1,000。页码模式下 `has_next_page` 基于这个封顶后的总数计算,读到第 1,000 条后会变为 `false`,即使还有更多匹配的告警。每个非空页都会返回最后一条告警的 `search_after_ctx`;要读取 1,000 条以后的数据,请传回该值改用游标模式,游标模式下 `has_next_page` 是准确的。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。\n- 将 `is_active` 设为 `true` 可仅返回活跃(触发中)告警;设为 `false` 返回已恢复告警。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **故障查看**(`on-call`) 或 **故障管理**(`on-call`) 或 **集成中心查看**(`on-call`) 或 **集成中心管理**(`on-call`) |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 为必填的 Unix 时间戳(秒),按告警的 `start_time` 过滤,跨度不超过 31 天。\n- `by_updated_at` 为 `true` 时,在 `start_time` 过滤之外再按相同区间过滤 `updated_at`,且跨度不超过 7 天。\n- `start_time` 早于账户数据保留期时会被调整为保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。\n- `total` 最多为 1,000。`has_next_page` 不依赖 `total`:页码模式和游标模式下都准确,超过 1,000 条也一样。每个非空页都会返回最后一条告警的 `search_after_ctx`;要越过页码模式 10,000 条的上限,请传回该值继续读取。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。\n- 将 `is_active` 设为 `true` 可仅返回活跃(触发中)告警;设为 `false` 返回已恢复告警。", "href": "/zh/api-reference/on-call/alerts/alert-read-list", "metadata": { "sidebarTitle": "查询告警列表" @@ -3433,7 +3433,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可启用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可启用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-enable", "metadata": { "sidebarTitle": "启用排除规则" @@ -3507,7 +3507,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 默认按故障创建时间从新到旧排序(`asc: true` 为从旧到新)。\n- 可用 `p` + `limit` 翻页(最多可取到第 10,000 条),更深的翻页请把上一页返回的 `search_after_ctx` 传回。传入 `search_after_ctx` 时,`total` 只统计游标之后的故障数。\n- `responder_ids` 保留任一指定成员参与响应的故障。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 默认按故障创建时间从新到旧排序(`asc: true` 为从旧到新)。\n- 可用 `p` + `limit` 翻页(最多可取到第 10,000 条),更深的翻页请把上一页返回的 `search_after_ctx` 传回。传入 `search_after_ctx` 时,`total` 只统计游标之后的故障数。\n- `responder_ids` 保留任一指定成员参与响应的故障。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-incident-list", "metadata": { "sidebarTitle": "查询洞察故障列表" @@ -4758,7 +4758,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可删除,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可删除,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-delete", "metadata": { "sidebarTitle": "删除排除规则" @@ -5009,7 +5009,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个时间桶返回一行整个账户的汇总。`responder_ids` 和 `incident_ids` 不生效;如需按人员或按故障查看,请使用 `/insight/responder` 或 `/insight/incident/list`。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个时间桶返回一行整个账户的汇总。`responder_ids` 和 `incident_ids` 不生效;如需按人员或按故障查看,请使用 `/insight/responder` 或 `/insight/incident/list`。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-account", "metadata": { "sidebarTitle": "查看账户级别洞察" @@ -6229,7 +6229,7 @@ "On-call/值班排班" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 按创建时间从新到旧排序。`query` 对值班表名称或描述做子串匹配。\n- `is_my_team` 为 true 时只保留调用者所在团队的值班表;`is_my_manage` 为 true 时保留调用者所在团队的值班表以及调用者创建的值班表。两者不能同时为 true。`team_ids` 会与上述过滤取交集。\n- 不传 `start`/`end` 时只返回已保存的配置(`layers`、`schedule_layers`、`cur_oncall`、`next_oncall` 为 `null`)。两者都传时计算 `layers`、`schedule_layers`、`final_schedule`、`cur_oncall` 和 `next_oncall`;本接口中 `layer_schedules` 始终为 `null`。\n- `start` 和 `end` 为 10 位 Unix 秒级时间戳;`end` 必须晚于 `start`,且相差不超过 45 天。只传 `end` 不传 `start` 会被拒绝。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 按创建时间从新到旧排序。`query` 对值班表名称或描述做子串匹配。\n- `is_my_team` 为 true 时只保留调用者所在团队的值班表,可用 `team_ids` 进一步收窄;`team_ids` 与调用者所在团队没有交集,或调用者不属于任何团队时,返回空列表。`is_my_manage` 为 true 时保留调用者创建的值班表,以及调用者所在团队的值班表(可用 `team_ids` 收窄,不属于调用者的团队 ID 会被忽略)。两者不能同时为 true。\n- 不传 `start`/`end` 时只返回已保存的配置(`layers`、`schedule_layers`、`cur_oncall`、`next_oncall` 为 `null`)。两者都传时计算 `layers`、`schedule_layers`、`final_schedule`、`cur_oncall` 和 `next_oncall`;本接口中 `layer_schedules` 始终为 `null`。\n- `start` 和 `end` 为 10 位 Unix 秒级时间戳;`end` 必须晚于 `start`,且相差不超过 45 天。只传 `end` 不传 `start` 会被拒绝。", "href": "/zh/api-reference/on-call/schedules/schedule-list", "metadata": { "sidebarTitle": "查询值班表列表" @@ -6821,7 +6821,7 @@ "On-call/值班排班" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **值班管理**(`on-call`) |\n\n## 使用说明\n\n- 仍被分派策略引用的值班表不能删除:请求返回 HTTP 400 `ReferenceExist`,不会删除任何值班表,`data.refs` 列出引用它的规则(`kind`、`name`、`href`)。\n- 不存在的 ID 会被忽略。列出的值班表在同一事务中删除。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **值班管理**(`on-call`) |\n\n## 使用说明\n\n- 仍被分派策略引用的值班表不能删除:请求返回 HTTP 400 `ReferenceExist`,不会删除任何值班表,`data.refs` 列出引用它的规则(`kind`、`name`、`href`)。\n- 调用者必须能编辑列出的每个值班表:账户所有者或管理员、值班表创建者,或其所属团队成员,否则返回 `AccessDenied`,不会删除任何值班表。\n- 引用检查无法完成时返回 `InternalError`,不会删除任何值班表。\n- 不存在的 ID 会被忽略。列出的值班表在同一事务中删除。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/schedules/schedule-delete", "metadata": { "sidebarTitle": "删除值班表" @@ -7050,7 +7050,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 整体替换:未传 `description` 会被清空;未传 `filters` 会清除全部条件,规则不再匹配任何事件。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 整体替换:未传 `description` 会被清空;未传 `filters` 会清除全部条件,规则不再匹配任何事件。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-update", "metadata": { "sidebarTitle": "更新排除规则" @@ -7231,7 +7231,7 @@ "On-call/日历管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **服务日历管理**(`on-call`) |\n\n## 使用说明\n\n- 5 个日历的上限仅在调用方为主体账户时校验:账户已有 5 个日历后,主体账户的创建请求返回 `InvalidParameter`;其他成员发起的调用不受此上限限制。\n- `cal_name` 在账户内必须唯一,`timezone` 必须是合法的 IANA 时区,非零 `team_id` 必须是账户中的团队,否则返回 `InvalidParameter`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **服务日历管理**(`on-call`) |\n\n## 使用说明\n\n- 每个账户最多 5 个日历:账户已有 5 个日历后,任何成员的创建请求都返回 `InvalidParameter`。\n- `cal_name` 在账户内必须唯一,`timezone` 必须是合法的 IANA 时区,非零 `team_id` 必须是账户中的团队,否则返回 `InvalidParameter`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/calendars/calendar-create", "metadata": { "sidebarTitle": "创建服务日历" @@ -8047,7 +8047,7 @@ "On-call/告警管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 均为必填的 Unix 时间戳(秒)。`start_time` 必须小于 `end_time`,跨度不超过 31 天。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。\n- `severities` 为逗号分隔的列表,按 `event_severity` 匹配,如 `\"Critical,Warning\"`。取值不做校验,未知值(或 `Ok`)不会匹配任何事件。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 均为必填的 Unix 时间戳(秒)。`start_time` 必须小于 `end_time`,跨度不超过 31 天。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。传了 `channel_ids` 但其中没有调用方可访问的协作空间时,结果为空。\n- `severities` 为逗号分隔的列表,按 `event_severity` 匹配,如 `\"Critical,Warning\"`。取值不做校验,未知值(或 `Ok`)不会匹配任何事件。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。", "href": "/zh/api-reference/on-call/alerts/alert-event-read-list", "metadata": { "sidebarTitle": "查询原始告警事件列表" @@ -9045,7 +9045,7 @@ "On-call/故障管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障查看**或**故障管理**或**协作空间查看**或**协作空间管理**或**模板查看**或**模板管理**(`on-call`) |\n\n## 使用说明\n\n- 只返回调用者有权访问的协作空间中的故障。\n- `start_time` 和 `end_time` 按故障开始时间过滤,跨度最多 31 天。`start_time` 早于账户数据保留期时会被调整到保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 结果按 `start_time` 排序,默认最新在前,`asc` 为 `true` 时最早在前。\n- 可用 `p` 和 `limit` 分页,也可传入上次响应的 `search_after_ctx`,此时忽略 `p`。\n- `total` 最多为 1,000。按 `p`/`limit` 分页时,一旦 `p` × `limit` 达到 1,000,即使还有更多匹配故障 `has_next_page` 也会变为 `false`。如需继续读取,请传入每个非空页都会返回的 `search_after_ctx`;游标模式下 `has_next_page` 如实反映是否还有更多数据。\n- 不传 `progress` 时返回所有处理进度的故障。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障查看**或**故障管理**或**协作空间查看**或**协作空间管理**或**模板查看**或**模板管理**(`on-call`) |\n\n## 使用说明\n\n- 只返回调用者有权访问的协作空间中的故障。\n- `start_time` 和 `end_time` 按故障开始时间过滤,跨度最多 31 天。`start_time` 早于账户数据保留期时会被调整到保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 结果按 `start_time` 排序,默认最新在前,`asc` 为 `true` 时最早在前。\n- 可用 `p` 和 `limit` 分页,也可传入上次响应的 `search_after_ctx`,此时忽略 `p`。\n- `total` 最多为 1,000。`has_next_page` 不依赖 `total`:按 `p`/`limit` 分页和游标模式下都如实反映是否还有更多数据,超过 1,000 条也一样。每个非空页还会返回 `search_after_ctx`,可用于游标分页。\n- 不传 `progress` 时返回所有处理进度的故障。", "href": "/zh/api-reference/on-call/incidents/incident-list", "metadata": { "sidebarTitle": "查询故障列表" @@ -10045,7 +10045,7 @@ "On-call/标签增强" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **映射数据查看**(`on-call`) 或 **映射数据管理**(`on-call`) |\n\n## 使用说明\n\n- 一次返回全部未删除的映射 API,不分页;`total` 即条目数。\n- 返回所有团队的映射 API,`headers` 以明文返回。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **映射数据查看**(`on-call`) 或 **映射数据管理**(`on-call`) |\n\n## 使用说明\n\n- 一次返回全部未删除的映射 API,不分页;`total` 即条目数。\n- 返回所有团队的映射 API。只有调用者可编辑的映射 API(账户所有者或管理员、该 API 的创建者或其所属团队成员)才以明文返回 `headers`,其余映射 API 的 `headers` 为 `null`。", "href": "/zh/api-reference/on-call/alert-enrichment/mapping-api-read-list", "metadata": { "sidebarTitle": "查询映射 API 列表" @@ -10435,7 +10435,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个协作空间、每个时间桶返回一行。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个协作空间、每个时间桶返回一行。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-channel", "metadata": { "sidebarTitle": "查看协作空间洞察" @@ -10615,7 +10615,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 排除规则最先检查,早于静默和抑制策略。命中任一启用的排除规则的事件直接丢弃,不产生告警、故障或通知。\n- 不传 `filters` 或传空列表时,该规则不匹配任何事件。\n- `channel_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 排除规则最先检查,早于静默和抑制策略。命中任一启用的排除规则的事件直接丢弃,不产生告警、故障或通知。\n- 不传 `filters` 或传空列表时,该规则不匹配任何事件。\n- `channel_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-create", "metadata": { "sidebarTitle": "创建排除规则" @@ -13072,7 +13072,7 @@ "On-call/通知模板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **模板查看**(`on-call`) 或 **模板管理**(`on-call`) |\n\n## 使用说明\n\n- 第一页的第一条总是内置预设模板(`template_id` 为 `6321aad26c12104586a88916`),不受过滤条件影响,并计入 `total`。\n- 按 `orderby`(默认 `created_at`)排序,默认倒序,`asc` 为 `true` 时正序。已软删除的模板不返回。\n- `is_my_team: true` 时只返回调用方所在团队的模板;同时传了 `team_ids` 则只保留两者共有的团队。若交集为空,则不按团队过滤,返回所有团队的模板。调用方不属于任何团队时返回空结果(`total` 为 0,也没有预设模板)。\n- `query` 是对 `template_name` 的正则匹配,不区分大小写;不合法的正则按普通文本匹配。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **模板查看**(`on-call`) 或 **模板管理**(`on-call`) |\n\n## 使用说明\n\n- 第一页的第一条总是内置预设模板(`template_id` 为 `6321aad26c12104586a88916`),不受过滤条件影响,并计入 `total`。\n- 按 `orderby`(默认 `created_at`)排序,默认倒序,`asc` 为 `true` 时正序。已软删除的模板不返回。\n- `is_my_team: true` 时只返回调用方所在团队的模板;同时传了 `team_ids` 则只保留两者共有的团队。交集为空或调用方不属于任何团队时,返回空结果(`total` 为 0,也没有预设模板)。\n- `query` 是对 `template_name` 的正则匹配,不区分大小写;不合法的正则按普通文本匹配。", "href": "/zh/api-reference/on-call/notification-templates/template-read-list", "metadata": { "sidebarTitle": "查询模板列表" @@ -13188,7 +13188,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个响应人、每个时间桶返回一行;`responder_ids` 用于限定返回哪些响应人。`seconds_to_close_from`/`seconds_to_close_to` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个响应人、每个时间桶返回一行;`responder_ids` 用于限定返回哪些响应人。`seconds_to_close_from`/`seconds_to_close_to` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-responder", "metadata": { "sidebarTitle": "查看处理人员洞察" @@ -14299,7 +14299,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 仅 `enabled` 状态的规则可禁用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 仅 `enabled` 状态的规则可禁用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-disable", "metadata": { "sidebarTitle": "禁用排除规则" @@ -19440,7 +19440,7 @@ "type": "integer", "format": "int64" }, - "description": "按协作空间 ID 过滤,最多 100 个。", + "description": "按协作空间 ID 过滤,最多 100 个。调用方无权访问的协作空间会被去掉;一个都不剩时结果为空。", "maxItems": 100 }, "severities": { @@ -20308,7 +20308,7 @@ }, "has_next_page": { "type": "boolean", - "description": "存在下一页时为 `true`。游标模式(传了 `search_after_ctx`)下结果准确;页码模式下按 `p * limit` 与封顶后的 `total` 比较,超过 1,000 条后即使还有匹配的告警也会返回 `false`,此时请改用 `search_after_ctx` 继续。" + "description": "存在下一页时为 `true`。游标模式(传了 `search_after_ctx`)和页码模式下都准确,超过 `total` 的 1,000 上限后也一样。" }, "search_after_ctx": { "type": "string", @@ -25102,7 +25102,7 @@ }, "has_next_page": { "type": "boolean", - "description": "是否还有下一页。按 `p`/`limit` 分页时根据封顶后的 `total` 计算,超过 1,000 条后即使还有数据也为 `false`;按 `search_after_ctx` 分页时如实反映。`POST /incident/list-by-ids` 恒为 `false`。" + "description": "是否还有下一页。按 `p`/`limit` 或 `search_after_ctx` 分页时都如实反映,超过 `total` 的 1,000 上限后也一样。`POST /incident/list-by-ids` 恒为 `false`。" }, "search_after_ctx": { "type": "string", @@ -25651,7 +25651,7 @@ }, "is_my_team": { "type": "boolean", - "description": "只看调用者所在团队的数据(同时传 `team_ids` 时取交集)。调用者不属于任何团队时结果为空。" + "description": "只看调用者所在团队的数据(同时传 `team_ids` 时取交集)。交集为空或调用者不属于任何团队时,结果为空。" }, "time_zone": { "type": "string", @@ -26723,7 +26723,7 @@ "additionalProperties": { "type": "string" }, - "description": "每次调用都会携带的请求头,以明文返回。未配置时为 `null`。" + "description": "每次调用都会携带的请求头,对可编辑该 API 的调用者(账户所有者或管理员、该 API 的创建者或其所属团队成员)以明文返回。未配置或调用者无编辑权时为 `null`。" }, "timeout": { "type": "integer", @@ -29081,11 +29081,11 @@ }, "is_my_team": { "type": "boolean", - "description": "只返回调用者所在团队的值班表。调用者不属于任何团队时返回空列表。" + "description": "只返回调用者所在团队的值班表。`team_ids` 与调用者所在团队没有交集,或调用者不属于任何团队时,返回空列表。" }, "is_my_manage": { "type": "boolean", - "description": "只返回调用者所在团队的值班表以及调用者创建的值班表。" + "description": "只返回调用者所在团队的值班表以及调用者创建的值班表。`team_ids` 只收窄团队部分,不属于调用者的团队 ID 会被忽略。" }, "team_ids": { "type": "array", @@ -29093,7 +29093,7 @@ "type": "integer", "format": "int64" }, - "description": "只返回这些团队的值班表;同时设置 `is_my_team`/`is_my_manage` 时取交集。" + "description": "只返回这些团队的值班表。设置 `is_my_team` 或 `is_my_manage` 时只保留调用者所在的团队。" }, "start": { "type": "integer", @@ -30438,7 +30438,7 @@ }, "is_my_team": { "type": "boolean", - "description": "为 `true` 时只返回调用方所在团队的模板。同时传了 `team_ids` 时只保留两者共有的团队;两者没有共同团队时不按团队过滤,返回所有团队的模板。调用方不属于任何团队时返回空结果。", + "description": "为 `true` 时只返回调用方所在团队的模板。同时传了 `team_ids` 时只保留两者共有的团队。两者没有共同团队,或调用方不属于任何团队时,返回空结果。", "default": false }, "team_ids": { diff --git a/api-reference/openapi.en.json b/api-reference/openapi.en.json index 72a55d5c..46304e04 100644 --- a/api-reference/openapi.en.json +++ b/api-reference/openapi.en.json @@ -945,7 +945,7 @@ "type": "integer", "format": "int64" }, - "description": "Filter by channel IDs. At most 100 entries.", + "description": "Filter by channel IDs. At most 100 entries. Channels the caller cannot access are dropped; if none remain, the result is empty.", "maxItems": 100 }, "severities": { @@ -1813,7 +1813,7 @@ }, "has_next_page": { "type": "boolean", - "description": "`true` when another page exists. In cursor mode (`search_after_ctx` sent) it is exact. In page-number mode it compares `p * limit` with the capped `total`, so it is `false` past 1,000 alerts even when more match; continue with `search_after_ctx` instead." + "description": "`true` when another page exists. Exact in both cursor mode (`search_after_ctx` sent) and page-number mode, including past the 1,000 cap of `total`." }, "search_after_ctx": { "type": "string", @@ -12394,7 +12394,7 @@ }, "has_next_page": { "type": "boolean", - "description": "Whether another page exists. With `p`/`limit` paging it is computed against the capped `total`, so it is `false` past 1,000 matches even when more exist; with `search_after_ctx` paging it reflects the real data. Always `false` for `POST /incident/list-by-ids`." + "description": "Whether another page exists. Reflects the real data with both `p`/`limit` and `search_after_ctx` paging, including past the 1,000 cap of `total`. Always `false` for `POST /incident/list-by-ids`." }, "search_after_ctx": { "type": "string", @@ -12967,7 +12967,7 @@ }, "is_my_team": { "type": "boolean", - "description": "Restrict results to the caller's teams (intersected with `team_ids` when both are set). When the caller belongs to no team, the result is empty." + "description": "Restrict results to the caller's teams (intersected with `team_ids` when both are set). When that intersection is empty, or the caller belongs to no team, the result is empty." }, "time_zone": { "type": "string", @@ -15637,7 +15637,7 @@ "additionalProperties": { "type": "string" }, - "description": "Request headers sent with every call, returned in plain text. `null` when none are configured." + "description": "Request headers sent with every call, returned in plain text to callers who can edit the API (the account owner or an admin, the API's creator, or a member of its team). `null` when none are configured or the caller cannot edit the API." }, "timeout": { "type": "integer", @@ -19245,7 +19245,7 @@ "enabled", "disabled" ], - "description": "Role status. `enabled` — active; `disabled` — turned off with `POST /role/disable`. Built-in roles are always `enabled`; deleted roles are never returned." + "description": "Role status. `enabled` — active; `disabled` — turned off with `POST /role/disable`; it grants no permissions to the members who hold it. Built-in roles are always `enabled`; deleted roles are never returned." }, "permission_ids": { "type": "array", @@ -20513,7 +20513,7 @@ "type": "boolean" }, "is_my_team": { - "description": "If `true`, return only applications owned by teams the caller belongs to. Has no effect when the caller belongs to no team.", + "description": "If `true`, return only applications owned by teams the caller belongs to. When the caller belongs to no team, the list is empty.", "type": "boolean" }, "limit": { @@ -24208,11 +24208,11 @@ }, "is_my_team": { "type": "boolean", - "description": "Only schedules owned by the caller's teams. A caller in no team gets an empty list." + "description": "Only schedules owned by the caller's teams. When `team_ids` shares no team with the caller, or the caller belongs to no team, the list is empty." }, "is_my_manage": { "type": "boolean", - "description": "Only schedules owned by the caller's teams or created by the caller." + "description": "Only schedules owned by the caller's teams or created by the caller. `team_ids` narrows the team part; team IDs outside the caller's teams are ignored." }, "team_ids": { "type": "array", @@ -24220,7 +24220,7 @@ "type": "integer", "format": "int64" }, - "description": "Only schedules owned by these teams; intersected with `is_my_team`/`is_my_manage` when either is set." + "description": "Only schedules owned by these teams. With `is_my_team` or `is_my_manage`, only the teams the caller belongs to are kept." }, "start": { "type": "integer", @@ -27725,7 +27725,7 @@ }, "is_my_team": { "type": "boolean", - "description": "When `true`, only templates of teams the caller belongs to are returned. If `team_ids` is also sent, only teams in both lists are kept; when they share no team, no team filter is applied and templates of all teams are returned. A caller in no team gets an empty result.", + "description": "When `true`, only templates of teams the caller belongs to are returned. If `team_ids` is also sent, only teams in both lists are kept. When they share no team, or the caller belongs to no team, the result is empty.", "default": false }, "team_ids": { @@ -34660,7 +34660,7 @@ "On-call/Alerts" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Both `start_time` and `end_time` are required Unix epoch seconds. `start_time` must be less than `end_time`; the span must not exceed 31 days.\n- Results are filtered by the caller's channel data-access permissions.\n- `severities` is a comma-separated list matched against `event_severity`, e.g. `\"Critical,Warning\"`. Values are not validated, so an unknown value (or `Ok`) matches nothing.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Both `start_time` and `end_time` are required Unix epoch seconds. `start_time` must be less than `end_time`; the span must not exceed 31 days.\n- Results are filtered by the caller's channel data-access permissions. When `channel_ids` is sent and none of the listed channels is accessible to the caller, the result is empty.\n- `severities` is a comma-separated list matched against `event_severity`, e.g. `\"Critical,Warning\"`. Values are not validated, so an unknown value (or `Ok`) matches nothing.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.", "href": "/en/api-reference/on-call/alerts/alert-event-read-list", "metadata": { "sidebarTitle": "List raw alert events" @@ -35010,7 +35010,7 @@ "On-call/Alerts" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Incidents Read** (`on-call`) or **Incidents Manage** (`on-call`) or **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- `start_time` and `end_time` are required Unix seconds and filter on the alert's `start_time`; the span must not exceed 31 days.\n- With `by_updated_at: true`, an `updated_at` window with the same bounds is added on top of the `start_time` filter, and the span must not exceed 7 days.\n- A `start_time` earlier than the account's data retention period is moved up to the retention start; an `end_time` before that start returns `InvalidParameter`.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.\n- `total` is capped at 1,000. In page-number mode `has_next_page` is computed from that capped total, so it turns `false` once you reach 1,000 alerts even when more match. Every non-empty page returns `search_after_ctx` for its last alert; to read past 1,000, pass it back and continue in cursor mode, where `has_next_page` is exact.\n- Results are filtered by the caller's channel data-access permissions.\n- Set `is_active` to `true` to retrieve only active (firing) alerts; `false` to retrieve resolved alerts.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Incidents Read** (`on-call`) or **Incidents Manage** (`on-call`) or **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- `start_time` and `end_time` are required Unix seconds and filter on the alert's `start_time`; the span must not exceed 31 days.\n- With `by_updated_at: true`, an `updated_at` window with the same bounds is added on top of the `start_time` filter, and the span must not exceed 7 days.\n- A `start_time` earlier than the account's data retention period is moved up to the retention start; an `end_time` before that start returns `InvalidParameter`.\n- Pass `search_after_ctx` from the previous response for the next page; without it, `p`/`limit` page numbers apply and `p * limit` must stay within 10,000.\n- `total` is capped at 1,000. `has_next_page` does not depend on `total`: it is exact in both page-number and cursor mode, also past 1,000 alerts. Every non-empty page returns `search_after_ctx` for its last alert; pass it back to read past the 10,000-row page-number limit.\n- Results are filtered by the caller's channel data-access permissions.\n- Set `is_active` to `true` to retrieve only active (firing) alerts; `false` to retrieve resolved alerts.", "href": "/en/api-reference/on-call/alerts/alert-read-list", "metadata": { "sidebarTitle": "List alerts" @@ -35776,7 +35776,7 @@ "On-call/Calendars" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |\n\n## Usage\n\n- A limit of 5 calendars is checked only when the caller is the account owner: once the account holds 5 calendars, the owner's create call returns `InvalidParameter`. Calls made by other members are not counted against this limit.\n- `cal_name` must be unique within the account, `timezone` must be a valid IANA name, and a nonzero `team_id` must be a team of the account; otherwise the call returns `InvalidParameter`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |\n\n## Usage\n\n- An account can hold at most 5 calendars: once it has 5, a create call by any member returns `InvalidParameter`.\n- `cal_name` must be unique within the account, `timezone` must be a valid IANA name, and a nonzero `team_id` must be a team of the account; otherwise the call returns `InvalidParameter`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/calendars/calendar-create", "metadata": { "sidebarTitle": "Create calendar" @@ -38829,7 +38829,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Drop rules are checked first, before silence and inhibit rules. An event matching any enabled drop rule is discarded: no alert, incident or notification is produced.\n- Without `filters`, or with an empty list, the rule matches nothing.\n- An unknown `channel_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Drop rules are checked first, before silence and inhibit rules. An event matching any enabled drop rule is discarded: no alert, incident or notification is produced.\n- Without `filters`, or with an empty list, the rule matches nothing.\n- An unknown `channel_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-create", "metadata": { "sidebarTitle": "Create drop rule" @@ -38919,7 +38919,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only a `disabled` rule can be deleted; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Only a `disabled` rule can be deleted; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-delete", "metadata": { "sidebarTitle": "Delete drop rule" @@ -38993,7 +38993,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only an `enabled` rule can be disabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Only an `enabled` rule can be disabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-disable", "metadata": { "sidebarTitle": "Disable drop rule" @@ -39067,7 +39067,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only a `disabled` rule can be enabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Only a `disabled` rule can be enabled; any other status returns `InvalidParameter`.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-enable", "metadata": { "sidebarTitle": "Enable drop rule" @@ -39239,7 +39239,7 @@ "On-call/Channels" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Full replacement: an omitted `description` becomes empty, and an omitted `filters` clears all conditions so the rule matches nothing.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |\n\n## Usage\n\n- Full replacement: an omitted `description` becomes empty, and an omitted `filters` clears all conditions so the rule matches nothing.\n- An unknown `channel_id` or `rule_id` returns `InvalidParameter`.\n- The caller must also be able to edit the channel: the account owner or an admin, the channel creator, or a member of its managing teams (of its owning team when `managing_team_ids` is empty). Otherwise the call returns `AccessDenied`.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-update", "metadata": { "sidebarTitle": "Update drop rule" @@ -39916,7 +39916,7 @@ "On-call/Alert enrichment" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `data: null` when no mapping API with this ID exists in the account.\n- A soft-deleted mapping API is still returned, with `status` = `deleted`.\n- There is no team check: any caller in the account can read any mapping API, including its `headers` in plain text.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `data: null` when no mapping API with this ID exists in the account.\n- A soft-deleted mapping API is still returned, with `status` = `deleted`.\n- Any caller in the account can read any mapping API. `headers` is returned in plain text only when the caller can edit the API (the account owner or an admin, the API's creator, or a member of its team); otherwise it is `null`.", "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-read-info", "metadata": { "sidebarTitle": "Get mapping API detail" @@ -40006,7 +40006,7 @@ "On-call/Alert enrichment" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Returns every non-deleted mapping API in one response, without pagination; `total` is the number of items.\n- Mapping APIs of all teams are returned, with their `headers` in plain text.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Returns every non-deleted mapping API in one response, without pagination; `total` is the number of items.\n- Mapping APIs of all teams are returned. `headers` is returned in plain text only for APIs the caller can edit (the account owner or an admin, the API's creator, or a member of its team); for the other APIs it is `null`.", "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-read-list", "metadata": { "sidebarTitle": "List mapping APIs" @@ -43041,7 +43041,7 @@ "On-call/Incidents" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Read** or **Incidents Manage** or **Channels Read** or **Channels Manage** or **Templates Read** or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Only incidents in channels the caller can access are returned.\n- `start_time` and `end_time` filter on incident start time and may span at most 31 days. A `start_time` earlier than the account's data retention period is moved up to the retention boundary; an `end_time` before that boundary fails with `InvalidParameter`.\n- Results are sorted by `start_time`, newest first unless `asc` is `true`.\n- Paginate with `p` and `limit`, or pass the previous response's `search_after_ctx`, in which case `p` is ignored.\n- `total` is capped at 1,000. With `p`/`limit` paging, `has_next_page` turns `false` once `p` × `limit` reaches 1,000 even if more incidents match. To read further, pass the `search_after_ctx` returned with every non-empty page; in cursor mode `has_next_page` reflects whether more rows really exist.\n- Without `progress`, incidents in every progress state are returned.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Read** or **Incidents Manage** or **Channels Read** or **Channels Manage** or **Templates Read** or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Only incidents in channels the caller can access are returned.\n- `start_time` and `end_time` filter on incident start time and may span at most 31 days. A `start_time` earlier than the account's data retention period is moved up to the retention boundary; an `end_time` before that boundary fails with `InvalidParameter`.\n- Results are sorted by `start_time`, newest first unless `asc` is `true`.\n- Paginate with `p` and `limit`, or pass the previous response's `search_after_ctx`, in which case `p` is ignored.\n- `total` is capped at 1,000. `has_next_page` does not depend on `total`: with `p`/`limit` paging and in cursor mode alike it reflects whether more rows really exist, also past 1,000 incidents. Every non-empty page also returns `search_after_ctx` for cursor paging.\n- Without `progress`, incidents in every progress state are returned.", "href": "/en/api-reference/on-call/incidents/incident-list", "metadata": { "sidebarTitle": "List incidents" @@ -46755,7 +46755,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per time bucket for the whole account. `responder_ids` and `incident_ids` are ignored; use `/insight/responder` or `/insight/incident/list` for those.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per time bucket for the whole account. `responder_ids` and `incident_ids` are ignored; use `/insight/responder` or `/insight/incident/list` for those.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-account", "metadata": { "sidebarTitle": "Get account-level insight" @@ -46956,7 +46956,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per channel per time bucket. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per channel per time bucket. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-channel", "metadata": { "sidebarTitle": "Get channel insight" @@ -47204,7 +47204,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- Sorted by incident creation time, newest first by default (`asc: true` for oldest first).\n- Page with `p` + `limit` (at most 10,000 records reachable) or, for deeper reads, pass the previous page's `search_after_ctx` back. When `search_after_ctx` is sent, `total` counts only the incidents after the cursor.\n- `responder_ids` keeps incidents in which any of the given members was a responder.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- Sorted by incident creation time, newest first by default (`asc: true` for oldest first).\n- Page with `p` + `limit` (at most 10,000 records reachable) or, for deeper reads, pass the previous page's `search_after_ctx` back. When `search_after_ctx` is sent, `total` counts only the incidents after the cursor.\n- `responder_ids` keeps incidents in which any of the given members was a responder.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-incident-list", "metadata": { "sidebarTitle": "List insight incidents" @@ -47338,7 +47338,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per responder per time bucket; `responder_ids` limits which responders are returned. `seconds_to_close_from`/`seconds_to_close_to` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per responder per time bucket; `responder_ids` limits which responders are returned. `seconds_to_close_from`/`seconds_to_close_to` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-responder", "metadata": { "sidebarTitle": "Get responder insight" @@ -47504,7 +47504,7 @@ "On-call/Analytics" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per team per time bucket. Incidents without a team are aggregated into a row that has no `team_id`. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams; a caller who belongs to no team gets an empty result.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |\n\n## Usage\n\n- One row per team per time bucket. Incidents without a team are aggregated into a row that has no `team_id`. `responder_ids` and `incident_ids` are ignored.\n- Incidents are counted by creation time. Rows are sorted by `ts` from newest to oldest, and a bucket (or dimension value) with no incidents produces no row — missing rows mean zero. `split_hours: true` returns up to three rows per bucket, one per `hours` value.\n- `total_alert_cnt`, `total_alert_event_cnt` and `noise_reduction_pct` honor only the time range, team, channel and severity filters; `query`, `labels`, `fields` and the duration filters apply to incident metrics only.\n- Members who are neither the account owner nor an admin only get data from channels they can access; other channels are silently excluded.\n- With `is_my_team: true`, `team_ids` is narrowed to the caller's teams. If none of the sent `team_ids` is one of the caller's teams, or the caller belongs to no team, the result is empty.", "href": "/en/api-reference/on-call/analytics/insight-by-team", "metadata": { "sidebarTitle": "Get team insight" @@ -48737,7 +48737,7 @@ "Monitors/Data sources" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- Supply `project` to select the SLS project whose logstores to list; use `offset` and `size` to paginate. The response is a plain array of logstore names.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- The caller needs query access to the datasource (see `readonly_team_ids` on the datasource); otherwise the call fails with 403 `AccessDenied`.\n- Supply `project` to select the SLS project whose logstores to list; use `offset` and `size` to paginate. The response is a plain array of logstore names.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-sls-logstores", "metadata": { "sidebarTitle": "List SLS logstores" @@ -48816,7 +48816,7 @@ "Monitors/Data sources" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- Use `query` to filter the project list and `offset` and `size` to paginate; `count` is the number of projects in the page and `total` the number matching the filter.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Read** (`monit`) |\n\n## Usage\n\n- The datasource identified by `id` must be of type `sls`; other types fail with `InvalidParameter`.\n- The caller needs query access to the datasource (see `readonly_team_ids` on the datasource); otherwise the call fails with 403 `AccessDenied`.\n- Use `query` to filter the project list and `offset` and `size` to paginate; `count` is the number of projects in the page and `total` the number matching the filter.\n- The request is relayed to the Monitors edge cluster of the datasource, which calls Alibaba Cloud with the stored credentials; it times out after 30 seconds. Fails with `InvalidParameter` when no edge instance of that cluster is online, and with HTTP 503 `ServiceUnavailable` when the edge version does not support metadata discovery.", "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-sls-projects", "metadata": { "sidebarTitle": "List SLS projects" @@ -49270,7 +49270,7 @@ } }, "400": { - "description": "The `X-DSID` header is not a number, the data source is not a Prometheus data source, or no monit-edge is registered for the data source's cluster. Returned as `text/plain`.", + "description": "The `X-DSID` header is not a number, the data source is not a Prometheus data source, no monit-edge is registered for the data source's cluster, or the data source does not exist or belongs to another account (message `data source not found`). Returned as `text/plain`.", "content": { "text/plain": { "schema": { @@ -49289,7 +49289,7 @@ "$ref": "#/components/responses/TooManyRequests" }, "500": { - "description": "The data source does not exist or belongs to another account (message `data source not found`), or the data source lookup or proxied request failed. Returned as `text/plain`.", + "description": "The data source lookup or proxied request failed. Returned as `text/plain`.", "content": { "text/plain": { "schema": { @@ -49304,7 +49304,7 @@ "Monitors/Data sources" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Any valid `app_key` (read-only; not gated by a specific permission class) |\n| Edge requirement | Querying a specific data source requires **monit-edge v0.35.0 or later** |\n\n## Usage\n\n- Pass the target data source ID in the `X-DSID` header. It must belong to the authenticated account and be a Prometheus data source; use `/monit/datasource/list` to obtain its ID.\n- The 200 body is the data source's native Prometheus HTTP API payload, **not** the standard `{ request_id, data }` envelope. Query-string parameters are forwarded unchanged, so Prometheus's own parameters such as `match[]`, `start`, and `end` work.\n- When `X-DSID` is omitted, or any monit-edge of the data source's cluster is older than v0.35.0, the request is answered by the platform's own Prometheus instead of your data source. Send the header and keep monit-edge up to date to get your data source's values.\n- Failures raised before the data source is reached are returned as `text/plain` with the matching 4xx or 5xx status. A status of 400 or above returned by the data source itself is passed through with its own body.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Any valid `app_key` (read-only; not gated by a specific permission class) |\n| Edge requirement | Querying a specific data source requires **monit-edge v0.35.0 or later** |\n\n## Usage\n\n- Pass the target data source ID in the `X-DSID` header. It must belong to the authenticated account and be a Prometheus data source; use `/monit/datasource/list` to obtain its ID.\n- When the data source restricts querying to certain teams, only members of those teams, its managing team, and account owners or admins can query it; others get 403. An unknown data source ID returns 400.\n- The 200 body is the data source's native Prometheus HTTP API payload, **not** the standard `{ request_id, data }` envelope. Query-string parameters are forwarded unchanged, so Prometheus's own parameters such as `match[]`, `start`, and `end` work.\n- When `X-DSID` is omitted, or any monit-edge of the data source's cluster is older than v0.35.0, the request is answered by the platform's own Prometheus instead of your data source. Send the header and keep monit-edge up to date to get your data source's values.\n- Failures raised before the data source is reached are returned as `text/plain` with the matching 4xx or 5xx status. A status of 400 or above returned by the data source itself is passed through with its own body.", "href": "/en/api-reference/monitors/data-sources/monit-prometheus-read-label-values", "metadata": { "sidebarTitle": "List Prometheus label values" @@ -50382,7 +50382,7 @@ "Monitors/Alert rules" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Alerting Rules Read** or **Alerting Rules Manage** (`monit`) |\n\n## Usage\n\n- `id` is required and must not be `0`; otherwise the call returns `InvalidParameter`.\n- A missing rule, or a rule of another account, returns `InvalidParameter` (`alert rule not found`).\n- No folder-level check applies: any caller with the permission above can read every rule in the account.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Alerting Rules Read** or **Alerting Rules Manage** (`monit`) |\n\n## Usage\n\n- `id` is required and must not be `0`; otherwise the call returns `InvalidParameter`.\n- A missing rule, or a rule of another account, returns `InvalidParameter` (`alert rule not found`).\n- The caller must have access to the rule's folder (the account owner or an admin, the creator of the folder or an ancestor, or a member of the team bound to it or an ancestor); otherwise the call returns `AccessDenied`. A rule whose folder no longer exists returns `InvalidParameter` (folder not found).", "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-info-v2", "metadata": { "sidebarTitle": "Get alert rule detail (V2)" @@ -51042,7 +51042,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- While members still hold the role, the call fails with `400 ReferenceExist` and lists them in `data.refs` (`kind` `member`); set `is_force` to `true` to revoke the role from all of them and then delete it.\n- A role selected as a default role in the SSO configuration cannot be deleted, even with `is_force`; the call fails with `400 ReferenceExist` until it is unselected there.\n- A role ID that does not exist or was already deleted is ignored and the call succeeds.\n- Do not pass a built-in role ID (`2`, `6`, `8`): the built-in role itself is not deleted, but with `is_force: true` it is revoked from every member who holds it.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- While members still hold the role, the call fails with `400 ReferenceExist` and lists them in `data.refs` (`kind` `member`); set `is_force` to `true` to revoke the role from all of them and then delete it.\n- A role selected as a default role in the SSO configuration cannot be deleted, even with `is_force`; the call fails with `400 ReferenceExist` until it is unselected there.\n- A role ID that does not exist or was already deleted is ignored and the call succeeds.\n- The built-in roles (`2`, `6`, `8`) cannot be deleted: with or without `is_force`, the call returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-delete", "metadata": { "sidebarTitle": "Delete a role" @@ -51115,7 +51115,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `enabled` status can be disabled; calling it on a role that is already disabled returns `400 InvalidParameter`.\n- The built-in roles (`2`, `6`, `8`) cannot be disabled: the call succeeds but changes nothing.\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Disabling does not revoke the role from the members who hold it.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `enabled` status can be disabled; calling it on a role that is already disabled returns `400 InvalidParameter`.\n- The built-in roles (`2`, `6`, `8`) cannot be disabled: the call returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Disabling does not revoke the role from the members who hold it, but a disabled role grants no permissions: those members, and the app keys they created, lose the role's permissions until it is enabled again.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-disable", "metadata": { "sidebarTitle": "Disable a role" @@ -51188,7 +51188,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `disabled` status can be enabled; calling it on an enabled role — including the built-in roles — returns `400 InvalidParameter`.\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `disabled` status can be enabled; calling it on an enabled role returns `400 InvalidParameter`.\n- The built-in roles (`2`, `6`, `8`) cannot be enabled or disabled: the call returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- Once enabled, the role's permissions apply again to the members who hold it and to the app keys those members created.\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-enable", "metadata": { "sidebarTitle": "Enable a role" @@ -51479,7 +51479,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Every ID in `member_ids` must be a member of the account, with no duplicates; otherwise the call returns `400` and nobody is changed.\n- `role_id` must be a built-in role or a custom role that has not been deleted (disabled roles are accepted); otherwise the call returns `400`.\n- Members provisioned through SSO cannot be changed while the SSO configuration marks them non-editable; the call returns `400`.\n- Members who already hold the role keep it unchanged.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Every ID in `member_ids` must be a member of the account, with no duplicates; otherwise the call returns `400` and nobody is changed.\n- `role_id` must be a built-in role or a custom role that has not been deleted (disabled roles are accepted, but grant no permissions until enabled); otherwise the call returns `400`.\n- Members provisioned through SSO cannot be changed while the SSO configuration marks them non-editable; the call returns `400`.\n- Members who already hold the role keep it unchanged.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-grant-role", "metadata": { "sidebarTitle": "Grant role to members" @@ -51803,7 +51803,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Omit `role_id` (or set it to 0) to create a role; pass the ID of a custom role to update it.\n- `role_name` must be unique in the account, including the built-in names `Admin`, `Responder`, and `Viewer`; a conflict returns `400`.\n- An update overwrites `role_name`, `description`, and `permission_ids` together: omitting `description` clears it, and omitting `permission_ids` removes every permission from the role.\n- Updating a disabled role re-enables it.\n- Every ID in `permission_ids` must be a permission returned by `POST /role/permission/list` (with `with_all: true`); otherwise the call returns `400` and nothing changes.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Omit `role_id` (or set it to 0) to create a role; a new ID is always assigned. Pass the ID of a custom role of your account to update it; any other ID returns `400 InvalidParameter` (`no role found by id`), and a built-in role ID (`2`, `6`, `8`) returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- `role_name` must be unique in the account, including the built-in names `Admin`, `Responder`, and `Viewer`; a conflict returns `400`.\n- An update overwrites `role_name`, `description`, and `permission_ids` together: omitting `description` clears it, and omitting `permission_ids` removes every permission from the role.\n- Updating a disabled role keeps it disabled; call `POST /role/enable` to enable it.\n- Every ID in `permission_ids` must be a permission returned by `POST /role/permission/list` (with `with_all: true`); otherwise the call returns `400` and nothing changes.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-upsert", "metadata": { "sidebarTitle": "Create or update a role" @@ -52647,7 +52647,7 @@ "RUM/Applications" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Duplicate IDs are collapsed; unknown or deleted IDs are skipped without an error, so `items` can be shorter than `application_ids`.\n- The order of `items` is not guaranteed to follow `application_ids`.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Duplicate IDs are collapsed; unknown or deleted IDs, and private applications the caller cannot access, are skipped without an error, so `items` can be shorter than `application_ids`.\n- The order of `items` is not guaranteed to follow `application_ids`.", "href": "/en/api-reference/rum/applications/rum-application-read-infos", "metadata": { "sidebarTitle": "Batch get applications" @@ -52810,7 +52810,7 @@ "RUM/Applications" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Private applications the caller cannot access are left out; the account owner and account admins see every application.\n- `is_my_team: true` keeps only applications owned by the caller's teams. If the caller belongs to no team, the filter is not applied.\n- `team_id`, `query` and `is_my_team` combine with AND.\n- Sorted by `updated_at` descending unless `orderby`/`asc` say otherwise.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Private applications the caller cannot access are left out; the account owner and account admins see every application.\n- `is_my_team: true` keeps only applications owned by the caller's teams. If the caller's teams own no application, or the caller belongs to no team, the list is empty.\n- `team_id`, `query` and `is_my_team` combine with AND.\n- Sorted by `updated_at` descending unless `orderby`/`asc` say otherwise.", "href": "/en/api-reference/rum/applications/rum-application-read-list", "metadata": { "sidebarTitle": "List applications" @@ -53508,7 +53508,7 @@ "RUM/Applications" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- The URL must use `http` or `https`; on Flashduty cloud, hosts that resolve to private, loopback, link-local or reserved addresses are rejected with `InvalidParameter`.\n- The sample body has the same shape as real alert events: `account_id`, `data_source_type` (`rum.alert`), `title`, `event_severity`, `event_status`, `description`, `alert_key`, `labels`, and `event_time` (Unix seconds).\n- Each attempt times out after 10 seconds; transport errors, 5xx and 429 responses are retried up to 2 times.\n- A failed delivery still returns HTTP 200 with `ok: false` and the reason in `message`.\n- The caller must be able to edit the application: the account owner, an account admin, the application's creator, or a member of its owning team; anyone else gets `AccessDenied`.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Applications Manage** (`rum`) |\n\n## Usage\n\n- The URL must use `http` or `https`; on Flashduty cloud, hosts that resolve to private, loopback, link-local or reserved addresses are rejected with `InvalidParameter`.\n- The sample body has the same shape as real alert events: `account_id`, `data_source_type` (`rum.alert`), `title`, `event_severity`, `event_status`, `description`, `alert_key`, `labels`, and `event_time` (Unix seconds).\n- Each attempt times out after 10 seconds; transport errors, 5xx and 429 responses are retried up to 2 times.\n- A failed delivery still returns HTTP 200 with `ok: false` and the reason in `message`.\n- The caller must be able to edit the application: the account owner, an account admin, the application's creator, or a member of its owning team; anyone else gets `AccessDenied`.", "href": "/en/api-reference/rum/applications/rum-application-webhook-test", "metadata": { "sidebarTitle": "Test application webhook" @@ -54415,7 +54415,7 @@ "RUM/Facets" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **100 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Use `POST /rum/field/list` with `is_facet: true` to discover `facet_key` values for each scope.\n- `facet_key` must be a facet field (`is_facet: true`) of the requested `scope` with `show_type: list` and a non-array `value_type`; otherwise the call returns `InvalidParameter`.\n- Events where `facet_key` is `null` are not counted. Pass `facet_value` to count only events equal to that value; its JSON type must match the field's `value_type`.\n- Pass `dql` to filter events before counting. Pass `sql` as a bare `WHERE` condition; the word `SELECT` anywhere in it (case-insensitive) is rejected.\n- `limit` defaults to 100; maximum is 100.\n- `start_time` / `end_time` are required Unix epoch **milliseconds**, at most 31 days apart.\n- For `scope: sourcemap`, `type` and `kind` choose which symbol store is counted.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **100 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Use `POST /rum/field/list` with `is_facet: true` to discover `facet_key` values for each scope.\n- `facet_key` must be a facet field (`is_facet: true`) of the requested `scope` with `show_type: list` and a non-array `value_type`; otherwise the call returns `InvalidParameter`.\n- Events where `facet_key` is `null` are not counted. Pass `facet_value` to count only events equal to that value; its JSON type must match the field's `value_type`.\n- Pass `dql` to filter events before counting. Pass `sql` as a bare `WHERE` condition; the word `SELECT` anywhere in it (case-insensitive) is rejected.\n- Events of private applications the caller cannot access are not counted, as in `POST /rum/data/query`.\n- `limit` defaults to 100; maximum is 100.\n- `start_time` / `end_time` are required Unix epoch **milliseconds**, at most 31 days apart.\n- For `scope: sourcemap`, `type` and `kind` choose which symbol store is counted.", "href": "/en/api-reference/rum/facets/rum-read-facet-count", "metadata": { "sidebarTitle": "Count facet value distribution" @@ -54718,7 +54718,7 @@ "RUM/Issues" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- `team_id` is the owning application's **current** team; `POST /rum/issue/list` and `POST /rum/issue/export` report the team recorded when the issue was first seen, which differs once the application moves to another team.\n- An unknown or deleted `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\"), not `ResourceNotFound`.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- `team_id` is the owning application's **current** team; `POST /rum/issue/list` and `POST /rum/issue/export` report the team recorded when the issue was first seen, which differs once the application moves to another team.\n- An unknown or deleted `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\"), not `ResourceNotFound`.\n- An issue of a private application the caller cannot access returns `AccessDenied` (\"You do not have permission to access this application\").", "href": "/en/api-reference/rum/issues/rum-issue-read-info", "metadata": { "sidebarTitle": "Get issue detail" @@ -55813,7 +55813,7 @@ "RUM/Issues" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only the fields you send are applied; sending a `status` equal to the current one changes nothing.\n- Setting `status` to `resolved` on an unresolved issue stamps `resolved_at` and `resolved_by` and clears `regression`; moving a resolved issue to another status clears `resolved_at` and `resolved_by`.\n- `resolve_mode` is applied only together with `status: resolved`, and defaults to `any` when omitted there; send it with `status: resolved` on an already resolved issue to change only the mode.\n- When the application's alerting is enabled, resolving an issue sends its recovery alert right away.\n- Setting `suspected_cause` marks the cause as user-set (`suspected_cause.source` = `user`, `person_id` = caller), and automatic analysis no longer overwrites it.\n- An unknown `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\").\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only the fields you send are applied; sending a `status` equal to the current one changes nothing.\n- Setting `status` to `resolved` on an unresolved issue stamps `resolved_at` and `resolved_by` and clears `regression`; moving a resolved issue to another status clears `resolved_at` and `resolved_by`.\n- `resolve_mode` is applied only together with `status: resolved`, and defaults to `any` when omitted there; send it with `status: resolved` on an already resolved issue to change only the mode.\n- When the application's alerting is enabled, resolving an issue sends its recovery alert right away.\n- Setting `suspected_cause` marks the cause as user-set (`suspected_cause.source` = `user`, `person_id` = caller), and automatic analysis no longer overwrites it.\n- An unknown `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\").\n- An issue of a private application the caller cannot access returns `AccessDenied` (\"You do not have permission to access this application\").\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/rum/issues/rum-issue-write-update", "metadata": { "sidebarTitle": "Update issue" @@ -56013,7 +56013,7 @@ "RUM/Session replay" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `InvalidParameter` if the session does not exist, or if it has no replay data recorded (`session_has_replay` is false).\n- Returns `InvalidParameter` if no view with replay data is found between the session start and 4 hours after its recorded end.\n- `ts` must equal the session's start time exactly (Unix milliseconds); any other value makes the session lookup miss and returns `InvalidParameter`.\n- All timestamps are client times; no clock-skew correction is applied (`server_time_delta` is always `0`).", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `InvalidParameter` if the session does not exist, or if it has no replay data recorded (`session_has_replay` is false).\n- Returns `InvalidParameter` if no view with replay data is found between the session start and 4 hours after its recorded end.\n- `ts` must equal the session's start time exactly (Unix milliseconds); any other value makes the session lookup miss and returns `InvalidParameter`.\n- If the session belongs to a private application the caller cannot access, the call returns `AccessDenied` (\"You do not have permission to access this application\").\n- All timestamps are client times; no clock-skew correction is applied (`server_time_delta` is always `0`).", "href": "/en/api-reference/rum/session-replay/rum-session-replay-read-metadata", "metadata": { "sidebarTitle": "Get session replay metadata" @@ -56108,7 +56108,7 @@ "RUM/Session replay" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- When `url_mode` is `false` (default), the response streams `application/x-ndjson` — one decompressed replay segment JSON object per line — and is **not** wrapped in the standard envelope. The pagination cursor for the next call is returned in the `X-Search-After-Ctx` response header instead of a body field. A segment that cannot be read is skipped silently.\n- When `url_mode` is `true`, the response is a normal JSON envelope containing presigned download URLs (valid 1 hour) for the zlib-compressed segment objects.\n- Pass `ts` (without `search_after_ctx`) to start from the last full-snapshot segment at or before that time, searching up to 4 hours back; if none is found, paging starts from the beginning.\n- A cursor is returned whenever a page is full (`limit` segments), so the last page can be empty.\n- `limit` accepts 1-99; values of 100 or more are rejected.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- When `url_mode` is `false` (default), the response streams `application/x-ndjson` — one decompressed replay segment JSON object per line — and is **not** wrapped in the standard envelope. The pagination cursor for the next call is returned in the `X-Search-After-Ctx` response header instead of a body field. A segment that cannot be read is skipped silently.\n- When `url_mode` is `true`, the response is a normal JSON envelope containing presigned download URLs (valid 1 hour) for the zlib-compressed segment objects.\n- Pass `ts` (without `search_after_ctx`) to start from the last full-snapshot segment at or before that time, searching up to 4 hours back; if none is found, paging starts from the beginning.\n- A cursor is returned whenever a page is full (`limit` segments), so the last page can be empty.\n- `limit` accepts 1-99; values of 100 or more are rejected.\n- If the session belongs to a private application the caller cannot access, the call returns `AccessDenied` (\"You do not have permission to access this application\").\n- A page with no segments returns an empty result. Segments uploaded moments ago may not be indexed yet; the call then returns `ResourceNotFound` (\"Replay segments are not available yet. Please retry shortly\"), so retry after a short wait.", "href": "/en/api-reference/rum/session-replay/rum-session-replay-read-segments", "metadata": { "sidebarTitle": "List session replay segments" @@ -61444,7 +61444,7 @@ "On-call/Schedules" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Schedules Manage** (`on-call`) |\n\n## Usage\n\n- A schedule still referenced by an escalation rule cannot be deleted: the call fails with HTTP 400 `ReferenceExist`, nothing is deleted, and `data.refs` lists the referencing rules (`kind`, `name`, `href`).\n- IDs that do not exist are ignored. The deletion of all listed schedules happens in one transaction.\n- Every call is recorded in the account audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Schedules Manage** (`on-call`) |\n\n## Usage\n\n- A schedule still referenced by an escalation rule cannot be deleted: the call fails with HTTP 400 `ReferenceExist`, nothing is deleted, and `data.refs` lists the referencing rules (`kind`, `name`, `href`).\n- The caller must be able to edit every listed schedule: the account owner or an admin, the schedule's creator, or a member of its team. Otherwise the call returns `AccessDenied` and nothing is deleted.\n- If the reference check cannot be completed, the call returns `InternalError` and nothing is deleted.\n- IDs that do not exist are ignored. The deletion of all listed schedules happens in one transaction.\n- Every call is recorded in the account audit log.", "href": "/en/api-reference/on-call/schedules/schedule-delete", "metadata": { "sidebarTitle": "Delete schedules" @@ -61978,7 +61978,7 @@ "On-call/Schedules" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Sorted by creation time, newest first. `query` matches the schedule name or description as a substring.\n- `is_my_team: true` keeps schedules owned by the caller's teams. `is_my_manage: true` keeps schedules owned by the caller's teams or created by the caller. The two cannot both be true. `team_ids` is intersected with either filter.\n- Without `start`/`end`, items carry stored configuration only (`layers`, `schedule_layers`, `cur_oncall`, `next_oncall` are `null`). With both set, `layers`, `schedule_layers`, `final_schedule`, `cur_oncall` and `next_oncall` are computed; `layer_schedules` stays `null` here.\n- `start` and `end` are 10-digit Unix timestamps in seconds; `end` must be after `start` and at most 45 days later. Sending `end` without `start` is rejected.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Sorted by creation time, newest first. `query` matches the schedule name or description as a substring.\n- `is_my_team: true` keeps schedules owned by the caller's teams, optionally narrowed by `team_ids`; when `team_ids` shares no team with the caller, or the caller belongs to no team, the list is empty. `is_my_manage: true` keeps schedules created by the caller plus those owned by the caller's teams (narrowed by `team_ids`; team IDs outside the caller's teams are ignored). The two cannot both be true.\n- Without `start`/`end`, items carry stored configuration only (`layers`, `schedule_layers`, `cur_oncall`, `next_oncall` are `null`). With both set, `layers`, `schedule_layers`, `final_schedule`, `cur_oncall` and `next_oncall` are computed; `layer_schedules` stays `null` here.\n- `start` and `end` are 10-digit Unix timestamps in seconds; `end` must be after `start` and at most 45 days later. Sending `end` without `start` is rejected.", "href": "/en/api-reference/on-call/schedules/schedule-list", "metadata": { "sidebarTitle": "List schedules" @@ -66252,7 +66252,7 @@ "On-call/Notification templates" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Templates Read** (`on-call`) or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- The first page always starts with the built-in preset template (`template_id` `6321aad26c12104586a88916`), whatever the filters; it is also counted in `total`.\n- Results are sorted by `orderby` (default `created_at`), newest first unless `asc` is `true`. Soft-deleted templates are excluded.\n- `is_my_team: true` limits results to templates of the caller's teams; with `team_ids` also sent, only the teams in both lists are kept. If that intersection is empty, no team filter is applied and templates of all teams are returned. If the caller belongs to no team, the response is empty (`total` = 0, no preset).\n- `query` is a case-insensitive regular expression on `template_name`; an invalid expression is matched as literal text.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Templates Read** (`on-call`) or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- The first page always starts with the built-in preset template (`template_id` `6321aad26c12104586a88916`), whatever the filters; it is also counted in `total`.\n- Results are sorted by `orderby` (default `created_at`), newest first unless `asc` is `true`. Soft-deleted templates are excluded.\n- `is_my_team: true` limits results to templates of the caller's teams; with `team_ids` also sent, only the teams in both lists are kept. If that intersection is empty, or the caller belongs to no team, the response is empty (`total` = 0, no preset).\n- `query` is a case-insensitive regular expression on `template_name`; an invalid expression is matched as literal text.", "href": "/en/api-reference/on-call/notification-templates/template-read-list", "metadata": { "sidebarTitle": "List templates" diff --git a/api-reference/openapi.zh.json b/api-reference/openapi.zh.json index 230e537d..85f5922a 100644 --- a/api-reference/openapi.zh.json +++ b/api-reference/openapi.zh.json @@ -945,7 +945,7 @@ "type": "integer", "format": "int64" }, - "description": "按协作空间 ID 过滤,最多 100 个。", + "description": "按协作空间 ID 过滤,最多 100 个。调用方无权访问的协作空间会被去掉;一个都不剩时结果为空。", "maxItems": 100 }, "severities": { @@ -1813,7 +1813,7 @@ }, "has_next_page": { "type": "boolean", - "description": "存在下一页时为 `true`。游标模式(传了 `search_after_ctx`)下结果准确;页码模式下按 `p * limit` 与封顶后的 `total` 比较,超过 1,000 条后即使还有匹配的告警也会返回 `false`,此时请改用 `search_after_ctx` 继续。" + "description": "存在下一页时为 `true`。游标模式(传了 `search_after_ctx`)和页码模式下都准确,超过 `total` 的 1,000 上限后也一样。" }, "search_after_ctx": { "type": "string", @@ -12394,7 +12394,7 @@ }, "has_next_page": { "type": "boolean", - "description": "是否还有下一页。按 `p`/`limit` 分页时根据封顶后的 `total` 计算,超过 1,000 条后即使还有数据也为 `false`;按 `search_after_ctx` 分页时如实反映。`POST /incident/list-by-ids` 恒为 `false`。" + "description": "是否还有下一页。按 `p`/`limit` 或 `search_after_ctx` 分页时都如实反映,超过 `total` 的 1,000 上限后也一样。`POST /incident/list-by-ids` 恒为 `false`。" }, "search_after_ctx": { "type": "string", @@ -12967,7 +12967,7 @@ }, "is_my_team": { "type": "boolean", - "description": "只看调用者所在团队的数据(同时传 `team_ids` 时取交集)。调用者不属于任何团队时结果为空。" + "description": "只看调用者所在团队的数据(同时传 `team_ids` 时取交集)。交集为空或调用者不属于任何团队时,结果为空。" }, "time_zone": { "type": "string", @@ -15637,7 +15637,7 @@ "additionalProperties": { "type": "string" }, - "description": "每次调用都会携带的请求头,以明文返回。未配置时为 `null`。" + "description": "每次调用都会携带的请求头,对可编辑该 API 的调用者(账户所有者或管理员、该 API 的创建者或其所属团队成员)以明文返回。未配置或调用者无编辑权时为 `null`。" }, "timeout": { "type": "integer", @@ -19245,7 +19245,7 @@ "enabled", "disabled" ], - "description": "角色状态。`enabled`——启用;`disabled`——已通过 `POST /role/disable` 禁用。内置角色始终为 `enabled`;已删除的角色不会返回。" + "description": "角色状态。`enabled`——启用;`disabled`——已通过 `POST /role/disable` 禁用,持有它的成员不会获得其权限。内置角色始终为 `enabled`;已删除的角色不会返回。" }, "permission_ids": { "type": "array", @@ -20513,7 +20513,7 @@ "type": "boolean" }, "is_my_team": { - "description": "为 `true` 时只返回调用者所在团队拥有的应用;调用者不属于任何团队时不生效。", + "description": "为 `true` 时只返回调用者所在团队拥有的应用;调用者不属于任何团队时返回空列表。", "type": "boolean" }, "limit": { @@ -24208,11 +24208,11 @@ }, "is_my_team": { "type": "boolean", - "description": "只返回调用者所在团队的值班表。调用者不属于任何团队时返回空列表。" + "description": "只返回调用者所在团队的值班表。`team_ids` 与调用者所在团队没有交集,或调用者不属于任何团队时,返回空列表。" }, "is_my_manage": { "type": "boolean", - "description": "只返回调用者所在团队的值班表以及调用者创建的值班表。" + "description": "只返回调用者所在团队的值班表以及调用者创建的值班表。`team_ids` 只收窄团队部分,不属于调用者的团队 ID 会被忽略。" }, "team_ids": { "type": "array", @@ -24220,7 +24220,7 @@ "type": "integer", "format": "int64" }, - "description": "只返回这些团队的值班表;同时设置 `is_my_team`/`is_my_manage` 时取交集。" + "description": "只返回这些团队的值班表。设置 `is_my_team` 或 `is_my_manage` 时只保留调用者所在的团队。" }, "start": { "type": "integer", @@ -27725,7 +27725,7 @@ }, "is_my_team": { "type": "boolean", - "description": "为 `true` 时只返回调用方所在团队的模板。同时传了 `team_ids` 时只保留两者共有的团队;两者没有共同团队时不按团队过滤,返回所有团队的模板。调用方不属于任何团队时返回空结果。", + "description": "为 `true` 时只返回调用方所在团队的模板。同时传了 `team_ids` 时只保留两者共有的团队。两者没有共同团队,或调用方不属于任何团队时,返回空结果。", "default": false }, "team_ids": { @@ -34660,7 +34660,7 @@ "On-call/告警管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 均为必填的 Unix 时间戳(秒)。`start_time` 必须小于 `end_time`,跨度不超过 31 天。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。\n- `severities` 为逗号分隔的列表,按 `event_severity` 匹配,如 `\"Critical,Warning\"`。取值不做校验,未知值(或 `Ok`)不会匹配任何事件。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 均为必填的 Unix 时间戳(秒)。`start_time` 必须小于 `end_time`,跨度不超过 31 天。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。传了 `channel_ids` 但其中没有调用方可访问的协作空间时,结果为空。\n- `severities` 为逗号分隔的列表,按 `event_severity` 匹配,如 `\"Critical,Warning\"`。取值不做校验,未知值(或 `Ok`)不会匹配任何事件。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。", "href": "/zh/api-reference/on-call/alerts/alert-event-read-list", "metadata": { "sidebarTitle": "查询原始告警事件列表" @@ -35010,7 +35010,7 @@ "On-call/告警管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **故障查看**(`on-call`) 或 **故障管理**(`on-call`) 或 **集成中心查看**(`on-call`) 或 **集成中心管理**(`on-call`) |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 为必填的 Unix 时间戳(秒),按告警的 `start_time` 过滤,跨度不超过 31 天。\n- `by_updated_at` 为 `true` 时,在 `start_time` 过滤之外再按相同区间过滤 `updated_at`,且跨度不超过 7 天。\n- `start_time` 早于账户数据保留期时会被调整为保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。\n- `total` 最多为 1,000。页码模式下 `has_next_page` 基于这个封顶后的总数计算,读到第 1,000 条后会变为 `false`,即使还有更多匹配的告警。每个非空页都会返回最后一条告警的 `search_after_ctx`;要读取 1,000 条以后的数据,请传回该值改用游标模式,游标模式下 `has_next_page` 是准确的。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。\n- 将 `is_active` 设为 `true` 可仅返回活跃(触发中)告警;设为 `false` 返回已恢复告警。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **故障查看**(`on-call`) 或 **故障管理**(`on-call`) 或 **集成中心查看**(`on-call`) 或 **集成中心管理**(`on-call`) |\n\n## 使用说明\n\n- `start_time` 和 `end_time` 为必填的 Unix 时间戳(秒),按告警的 `start_time` 过滤,跨度不超过 31 天。\n- `by_updated_at` 为 `true` 时,在 `start_time` 过滤之外再按相同区间过滤 `updated_at`,且跨度不超过 7 天。\n- `start_time` 早于账户数据保留期时会被调整为保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 传入上次响应中的 `search_after_ctx` 获取下一页;不传时按 `p`/`limit` 页码分页,且 `p * limit` 不超过 10,000。\n- `total` 最多为 1,000。`has_next_page` 不依赖 `total`:页码模式和游标模式下都准确,超过 1,000 条也一样。每个非空页都会返回最后一条告警的 `search_after_ctx`;要越过页码模式 10,000 条的上限,请传回该值继续读取。\n- 结果会根据调用方的协作空间数据访问权限进行过滤。\n- 将 `is_active` 设为 `true` 可仅返回活跃(触发中)告警;设为 `false` 返回已恢复告警。", "href": "/zh/api-reference/on-call/alerts/alert-read-list", "metadata": { "sidebarTitle": "查询告警列表" @@ -35776,7 +35776,7 @@ "On-call/日历管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **服务日历管理**(`on-call`) |\n\n## 使用说明\n\n- 5 个日历的上限仅在调用方为主体账户时校验:账户已有 5 个日历后,主体账户的创建请求返回 `InvalidParameter`;其他成员发起的调用不受此上限限制。\n- `cal_name` 在账户内必须唯一,`timezone` 必须是合法的 IANA 时区,非零 `team_id` 必须是账户中的团队,否则返回 `InvalidParameter`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **服务日历管理**(`on-call`) |\n\n## 使用说明\n\n- 每个账户最多 5 个日历:账户已有 5 个日历后,任何成员的创建请求都返回 `InvalidParameter`。\n- `cal_name` 在账户内必须唯一,`timezone` 必须是合法的 IANA 时区,非零 `team_id` 必须是账户中的团队,否则返回 `InvalidParameter`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/calendars/calendar-create", "metadata": { "sidebarTitle": "创建服务日历" @@ -38829,7 +38829,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 排除规则最先检查,早于静默和抑制策略。命中任一启用的排除规则的事件直接丢弃,不产生告警、故障或通知。\n- 不传 `filters` 或传空列表时,该规则不匹配任何事件。\n- `channel_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 排除规则最先检查,早于静默和抑制策略。命中任一启用的排除规则的事件直接丢弃,不产生告警、故障或通知。\n- 不传 `filters` 或传空列表时,该规则不匹配任何事件。\n- `channel_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-create", "metadata": { "sidebarTitle": "创建排除规则" @@ -38919,7 +38919,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可删除,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可删除,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-delete", "metadata": { "sidebarTitle": "删除排除规则" @@ -38993,7 +38993,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 仅 `enabled` 状态的规则可禁用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 仅 `enabled` 状态的规则可禁用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-disable", "metadata": { "sidebarTitle": "禁用排除规则" @@ -39067,7 +39067,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可启用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 仅 `disabled` 状态的规则可启用,其他状态返回 `InvalidParameter`。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-enable", "metadata": { "sidebarTitle": "启用排除规则" @@ -39239,7 +39239,7 @@ "On-call/协作空间" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 整体替换:未传 `description` 会被清空;未传 `filters` 会清除全部条件,规则不再匹配任何事件。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **协作空间管理**(`on-call`) |\n\n## 使用说明\n\n- 整体替换:未传 `description` 会被清空;未传 `filters` 会清除全部条件,规则不再匹配任何事件。\n- `channel_id` 或 `rule_id` 不存在时返回 `InvalidParameter`。\n- 调用者还必须拥有该协作空间的编辑权:账户所有者或管理员、协作空间创建者,或其管理团队成员(`managing_team_ids` 为空时为所属团队成员),否则返回 `AccessDenied`。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/channels/channel-unsubscribe-rule-update", "metadata": { "sidebarTitle": "更新排除规则" @@ -39916,7 +39916,7 @@ "On-call/标签增强" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 账户内不存在该 ID 的映射 API 时返回 `data: null`。\n- 已软删除的映射 API 仍会返回,此时 `status` 为 `deleted`。\n- 不做团队校验:账户内任何调用方都能读取任意映射 API,包括明文的 `headers`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 账户内不存在该 ID 的映射 API 时返回 `data: null`。\n- 已软删除的映射 API 仍会返回,此时 `status` 为 `deleted`。\n- 账户内任何调用方都能读取任意映射 API。只有调用者可编辑该 API(账户所有者或管理员、该 API 的创建者或其所属团队成员)时才以明文返回 `headers`,否则为 `null`。", "href": "/zh/api-reference/on-call/alert-enrichment/mapping-api-read-info", "metadata": { "sidebarTitle": "查看映射 API 详情" @@ -40006,7 +40006,7 @@ "On-call/标签增强" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **映射数据查看**(`on-call`) 或 **映射数据管理**(`on-call`) |\n\n## 使用说明\n\n- 一次返回全部未删除的映射 API,不分页;`total` 即条目数。\n- 返回所有团队的映射 API,`headers` 以明文返回。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **映射数据查看**(`on-call`) 或 **映射数据管理**(`on-call`) |\n\n## 使用说明\n\n- 一次返回全部未删除的映射 API,不分页;`total` 即条目数。\n- 返回所有团队的映射 API。只有调用者可编辑的映射 API(账户所有者或管理员、该 API 的创建者或其所属团队成员)才以明文返回 `headers`,其余映射 API 的 `headers` 为 `null`。", "href": "/zh/api-reference/on-call/alert-enrichment/mapping-api-read-list", "metadata": { "sidebarTitle": "查询映射 API 列表" @@ -43041,7 +43041,7 @@ "On-call/故障管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障查看**或**故障管理**或**协作空间查看**或**协作空间管理**或**模板查看**或**模板管理**(`on-call`) |\n\n## 使用说明\n\n- 只返回调用者有权访问的协作空间中的故障。\n- `start_time` 和 `end_time` 按故障开始时间过滤,跨度最多 31 天。`start_time` 早于账户数据保留期时会被调整到保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 结果按 `start_time` 排序,默认最新在前,`asc` 为 `true` 时最早在前。\n- 可用 `p` 和 `limit` 分页,也可传入上次响应的 `search_after_ctx`,此时忽略 `p`。\n- `total` 最多为 1,000。按 `p`/`limit` 分页时,一旦 `p` × `limit` 达到 1,000,即使还有更多匹配故障 `has_next_page` 也会变为 `false`。如需继续读取,请传入每个非空页都会返回的 `search_after_ctx`;游标模式下 `has_next_page` 如实反映是否还有更多数据。\n- 不传 `progress` 时返回所有处理进度的故障。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障查看**或**故障管理**或**协作空间查看**或**协作空间管理**或**模板查看**或**模板管理**(`on-call`) |\n\n## 使用说明\n\n- 只返回调用者有权访问的协作空间中的故障。\n- `start_time` 和 `end_time` 按故障开始时间过滤,跨度最多 31 天。`start_time` 早于账户数据保留期时会被调整到保留期起点;`end_time` 早于该起点时返回 `InvalidParameter`。\n- 结果按 `start_time` 排序,默认最新在前,`asc` 为 `true` 时最早在前。\n- 可用 `p` 和 `limit` 分页,也可传入上次响应的 `search_after_ctx`,此时忽略 `p`。\n- `total` 最多为 1,000。`has_next_page` 不依赖 `total`:按 `p`/`limit` 分页和游标模式下都如实反映是否还有更多数据,超过 1,000 条也一样。每个非空页还会返回 `search_after_ctx`,可用于游标分页。\n- 不传 `progress` 时返回所有处理进度的故障。", "href": "/zh/api-reference/on-call/incidents/incident-list", "metadata": { "sidebarTitle": "查询故障列表" @@ -46755,7 +46755,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个时间桶返回一行整个账户的汇总。`responder_ids` 和 `incident_ids` 不生效;如需按人员或按故障查看,请使用 `/insight/responder` 或 `/insight/incident/list`。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个时间桶返回一行整个账户的汇总。`responder_ids` 和 `incident_ids` 不生效;如需按人员或按故障查看,请使用 `/insight/responder` 或 `/insight/incident/list`。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-account", "metadata": { "sidebarTitle": "查看账户级别洞察" @@ -46956,7 +46956,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个协作空间、每个时间桶返回一行。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个协作空间、每个时间桶返回一行。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-channel", "metadata": { "sidebarTitle": "查看协作空间洞察" @@ -47204,7 +47204,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 默认按故障创建时间从新到旧排序(`asc: true` 为从旧到新)。\n- 可用 `p` + `limit` 翻页(最多可取到第 10,000 条),更深的翻页请把上一页返回的 `search_after_ctx` 传回。传入 `search_after_ctx` 时,`total` 只统计游标之后的故障数。\n- `responder_ids` 保留任一指定成员参与响应的故障。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 默认按故障创建时间从新到旧排序(`asc: true` 为从旧到新)。\n- 可用 `p` + `limit` 翻页(最多可取到第 10,000 条),更深的翻页请把上一页返回的 `search_after_ctx` 传回。传入 `search_after_ctx` 时,`total` 只统计游标之后的故障数。\n- `responder_ids` 保留任一指定成员参与响应的故障。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-incident-list", "metadata": { "sidebarTitle": "查询洞察故障列表" @@ -47338,7 +47338,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个响应人、每个时间桶返回一行;`responder_ids` 用于限定返回哪些响应人。`seconds_to_close_from`/`seconds_to_close_to` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个响应人、每个时间桶返回一行;`responder_ids` 用于限定返回哪些响应人。`seconds_to_close_from`/`seconds_to_close_to` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-responder", "metadata": { "sidebarTitle": "查看处理人员洞察" @@ -47504,7 +47504,7 @@ "On-call/分析看板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个团队、每个时间桶返回一行。未归属团队的故障汇总为一行,该行没有 `team_id`。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队;调用者不属于任何团队时返回空结果。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **分析看板查看**(`on-call`) |\n\n## 使用说明\n\n- 每个团队、每个时间桶返回一行。未归属团队的故障汇总为一行,该行没有 `team_id`。`responder_ids` 和 `incident_ids` 不生效。\n- 故障按创建时间归入时间桶。结果按 `ts` 从新到旧排列;没有故障的时间桶(或维度取值)不会出现在结果中,缺行即为 0。`split_hours` 为 true 时,每个时间桶最多返回 3 行,每个 `hours` 取值一行。\n- `total_alert_cnt`、`total_alert_event_cnt` 和 `noise_reduction_pct` 只受时间范围、团队、协作空间和严重程度过滤影响;`query`、`labels`、`fields` 以及时长过滤只作用于故障指标。\n- 非账户所有者、非管理员的成员只能看到自己有权访问的协作空间的数据,其他协作空间会被静默排除。\n- `is_my_team` 为 true 时,`team_ids` 收窄为调用者所在的团队。传入的 `team_ids` 都不是调用者所在团队,或调用者不属于任何团队时,返回空结果。", "href": "/zh/api-reference/on-call/analytics/insight-by-team", "metadata": { "sidebarTitle": "查看团队洞察" @@ -48737,7 +48737,7 @@ "Monitors/告警数据源" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 通过 `project` 指定要列出日志库的 SLS 项目;使用 `offset` 和 `size` 分页。响应是日志库名称组成的数组。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 调用者需要有该数据源的查询权限(见数据源的 `readonly_team_ids`),否则返回 403 `AccessDenied`。\n- 通过 `project` 指定要列出日志库的 SLS 项目;使用 `offset` 和 `size` 分页。响应是日志库名称组成的数组。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", "href": "/zh/api-reference/monitors/data-sources/monit-datasource-read-sls-logstores", "metadata": { "sidebarTitle": "查询 SLS 日志库列表" @@ -48816,7 +48816,7 @@ "Monitors/告警数据源" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 使用 `query` 过滤项目列表,使用 `offset` 和 `size` 分页;`count` 为当前页项目数,`total` 为满足过滤条件的项目总数。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **数据源查看**(`monit`) |\n\n## 使用说明\n\n- `id` 指定的数据源类型必须为 `sls`,其他类型返回 `InvalidParameter`。\n- 调用者需要有该数据源的查询权限(见数据源的 `readonly_team_ids`),否则返回 403 `AccessDenied`。\n- 使用 `query` 过滤项目列表,使用 `offset` 和 `size` 分页;`count` 为当前页项目数,`total` 为满足过滤条件的项目总数。\n- 请求会转发给该数据源所属的 Monitors edge 集群,由 edge 使用已保存的凭据调用阿里云,30 秒超时。该集群没有在线的 edge 实例时返回 `InvalidParameter`;edge 版本不支持元数据发现时返回 HTTP 503 `ServiceUnavailable`。", "href": "/zh/api-reference/monitors/data-sources/monit-datasource-read-sls-projects", "metadata": { "sidebarTitle": "查询 SLS 项目列表" @@ -49270,7 +49270,7 @@ } }, "400": { - "description": "`X-DSID` 请求头不是数字、数据源不是 Prometheus 类型,或数据源所在集群没有已注册的 monit-edge。以 `text/plain` 返回。", + "description": "`X-DSID` 请求头不是数字、数据源不是 Prometheus 类型,数据源所在集群没有已注册的 monit-edge,或数据源不存在、属于其他账户(消息为 `data source not found`)。以 `text/plain` 返回。", "content": { "text/plain": { "schema": { @@ -49289,7 +49289,7 @@ "$ref": "#/components/responses/TooManyRequests" }, "500": { - "description": "数据源不存在或属于其他账户(消息为 `data source not found`),或数据源查询、代理请求失败。以 `text/plain` 返回。", + "description": "数据源查询或代理请求失败。以 `text/plain` 返回。", "content": { "text/plain": { "schema": { @@ -49304,7 +49304,7 @@ "Monitors/告警数据源" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 任意有效的 `app_key`(只读,不受特定权限分类限制) |\n| Edge 版本要求 | 查询指定数据源要求 **monit-edge v0.35.0 或更高版本** |\n\n## 使用说明\n\n- 通过 `X-DSID` 请求头传入目标数据源 ID。数据源必须属于当前账户且为 Prometheus 类型;可用 `/monit/datasource/list` 获取 ID。\n- 200 响应体是数据源原生的 Prometheus HTTP API 结构,**不是**统一的 `{ request_id, data }` envelope。查询字符串参数会原样转发,因此 Prometheus 自身的 `match[]`、`start`、`end` 等参数都可使用。\n- 省略 `X-DSID`,或数据源所在集群中有任意 monit-edge 低于 v0.35.0 时,请求会由平台自有的 Prometheus 响应,而不是您的数据源。请携带该请求头并保持 monit-edge 为较新版本,才能获得数据源自身的取值。\n- 到达数据源之前发生的失败以 `text/plain` 返回,并携带对应的 4xx/5xx 状态码。数据源自身返回的 400 及以上状态码会连同其响应体一并透传。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 任意有效的 `app_key`(只读,不受特定权限分类限制) |\n| Edge 版本要求 | 查询指定数据源要求 **monit-edge v0.35.0 或更高版本** |\n\n## 使用说明\n\n- 通过 `X-DSID` 请求头传入目标数据源 ID。数据源必须属于当前账户且为 Prometheus 类型;可用 `/monit/datasource/list` 获取 ID。\n- 若数据源限制了可查询的团队,只有这些团队的成员、其管理团队以及账户所有者或管理员可以查询,其他人会收到 403。数据源 ID 不存在时返回 400。\n- 200 响应体是数据源原生的 Prometheus HTTP API 结构,**不是**统一的 `{ request_id, data }` envelope。查询字符串参数会原样转发,因此 Prometheus 自身的 `match[]`、`start`、`end` 等参数都可使用。\n- 省略 `X-DSID`,或数据源所在集群中有任意 monit-edge 低于 v0.35.0 时,请求会由平台自有的 Prometheus 响应,而不是您的数据源。请携带该请求头并保持 monit-edge 为较新版本,才能获得数据源自身的取值。\n- 到达数据源之前发生的失败以 `text/plain` 返回,并携带对应的 4xx/5xx 状态码。数据源自身返回的 400 及以上状态码会连同其响应体一并透传。", "href": "/zh/api-reference/monitors/data-sources/monit-prometheus-read-label-values", "metadata": { "sidebarTitle": "查询 Prometheus 标签值列表" @@ -50382,7 +50382,7 @@ "Monitors/告警规则" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **告警规则查看**或**告警规则管理**(`monit`) |\n\n## 使用说明\n\n- `id` 必填且不能为 `0`,否则返回 `InvalidParameter`。\n- 规则不存在或属于其他账户时返回 `InvalidParameter`(`alert rule not found`)。\n- 不做文件夹级权限校验:具备上述权限的调用者可读取账户内的任意规则。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **告警规则查看**或**告警规则管理**(`monit`) |\n\n## 使用说明\n\n- `id` 必填且不能为 `0`,否则返回 `InvalidParameter`。\n- 规则不存在或属于其他账户时返回 `InvalidParameter`(`alert rule not found`)。\n- 调用者必须有该规则所在文件夹的权限(账户所有者或管理员、该文件夹或其上级文件夹的创建者,或绑定到该文件夹或其上级文件夹的团队成员),否则返回 `AccessDenied`。所在文件夹已不存在的规则返回 `InvalidParameter`(folder not found)。", "href": "/zh/api-reference/monitors/alert-rules/monit-rule-read-info-v2", "metadata": { "sidebarTitle": "获取告警规则详情 V2" @@ -51042,7 +51042,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 仍有成员持有该角色时,调用返回 `400 ReferenceExist`,并在 `data.refs` 中列出这些成员(`kind` 为 `member`);设置 `is_force` 为 `true` 会先从所有持有成员解除该角色再删除。\n- 被单点登录配置选为默认角色的角色无法删除,即使设置 `is_force` 也一样;在单点登录配置中取消选择前,调用会返回 `400 ReferenceExist`。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 不要传内置角色 ID(`2`、`6`、`8`):内置角色本身不会被删除,但设置 `is_force: true` 时会把它从所有持有成员身上解除。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 仍有成员持有该角色时,调用返回 `400 ReferenceExist`,并在 `data.refs` 中列出这些成员(`kind` 为 `member`);设置 `is_force` 为 `true` 会先从所有持有成员解除该角色再删除。\n- 被单点登录配置选为默认角色的角色无法删除,即使设置 `is_force` 也一样;在单点登录配置中取消选择前,调用会返回 `400 ReferenceExist`。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 内置角色(`2`、`6`、`8`)不能删除:无论是否设置 `is_force`,调用都返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-delete", "metadata": { "sidebarTitle": "删除角色" @@ -51115,7 +51115,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `enabled` 状态的角色可以禁用;对已禁用的角色调用会返回 `400 InvalidParameter`。\n- 内置角色(`2`、`6`、`8`)无法禁用:调用返回成功,但不做任何修改。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 禁用角色不会把它从持有该角色的成员身上解除。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `enabled` 状态的角色可以禁用;对已禁用的角色调用会返回 `400 InvalidParameter`。\n- 内置角色(`2`、`6`、`8`)无法禁用:调用返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 禁用角色不会把它从持有该角色的成员身上解除,但已禁用的角色不提供任何权限:这些成员及其创建的 App Key 会失去该角色的权限,直到角色重新启用。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-disable", "metadata": { "sidebarTitle": "禁用角色" @@ -51188,7 +51188,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `disabled` 状态的角色可以启用;对已启用的角色(包括内置角色)调用会返回 `400 InvalidParameter`。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `disabled` 状态的角色可以启用;对已启用的角色调用会返回 `400 InvalidParameter`。\n- 内置角色(`2`、`6`、`8`)不能启用或禁用:调用返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- 启用后,持有该角色的成员及其创建的 App Key 重新获得该角色的权限。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-enable", "metadata": { "sidebarTitle": "启用角色" @@ -51479,7 +51479,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- `member_ids` 中的每个 ID 都必须是本账户成员且不能重复,否则返回 `400`,不修改任何人。\n- `role_id` 必须是内置角色或未删除的自定义角色(已禁用的角色也可以),否则返回 `400`。\n- 通过单点登录同步的成员,在单点登录配置将其设为不可编辑时无法修改,调用返回 `400`。\n- 已持有该角色的成员保持不变。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- `member_ids` 中的每个 ID 都必须是本账户成员且不能重复,否则返回 `400`,不修改任何人。\n- `role_id` 必须是内置角色或未删除的自定义角色(已禁用的角色也可以授予,但启用前不提供任何权限),否则返回 `400`。\n- 通过单点登录同步的成员,在单点登录配置将其设为不可编辑时无法修改,调用返回 `400`。\n- 已持有该角色的成员保持不变。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-grant-role", "metadata": { "sidebarTitle": "授予成员账户权限" @@ -51803,7 +51803,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 省略 `role_id`(或置为 0)表示创建角色;传入自定义角色的 ID 表示更新。\n- `role_name` 在账户内必须唯一,也不能与内置名称 `Admin`、`Responder`、`Viewer` 重复;冲突时返回 `400`。\n- 更新会同时覆盖 `role_name`、`description`、`permission_ids`:不传 `description` 会清空描述,不传 `permission_ids` 会移除该角色的全部权限。\n- 更新一个已禁用的角色会使其重新启用。\n- `permission_ids` 中的每个 ID 都必须是 `POST /role/permission/list`(`with_all: true`)返回的权限,否则返回 `400`,不做任何修改。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 省略 `role_id`(或置为 0)表示创建角色,总是分配新的 ID。传入本账户自定义角色的 ID 表示更新;其他 ID 返回 `400 InvalidParameter`(`no role found by id`),内置角色 ID(`2`、`6`、`8`)返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- `role_name` 在账户内必须唯一,也不能与内置名称 `Admin`、`Responder`、`Viewer` 重复;冲突时返回 `400`。\n- 更新会同时覆盖 `role_name`、`description`、`permission_ids`:不传 `description` 会清空描述,不传 `permission_ids` 会移除该角色的全部权限。\n- 更新已禁用的角色不会改变其状态,角色仍为禁用;如需启用请调用 `POST /role/enable`。\n- `permission_ids` 中的每个 ID 都必须是 `POST /role/permission/list`(`with_all: true`)返回的权限,否则返回 `400`,不做任何修改。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-upsert", "metadata": { "sidebarTitle": "创建或更新角色" @@ -52647,7 +52647,7 @@ "RUM/应用管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 重复的 ID 会被去重;不存在或已删除的 ID 会被直接跳过而不报错,因此 `items` 可能比 `application_ids` 短。\n- `items` 的顺序不保证与 `application_ids` 一致。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 重复的 ID 会被去重;不存在或已删除的 ID,以及调用者无权访问的私有应用,会被直接跳过而不报错,因此 `items` 可能比 `application_ids` 短。\n- `items` 的顺序不保证与 `application_ids` 一致。", "href": "/zh/api-reference/rum/applications/rum-application-read-infos", "metadata": { "sidebarTitle": "批量查询应用详情" @@ -52810,7 +52810,7 @@ "RUM/应用管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 调用者无权访问的私有应用不会出现在结果中;账户所有者和账户管理员可以看到全部应用。\n- `is_my_team: true` 只保留调用者所在团队拥有的应用;调用者不属于任何团队时,该过滤不生效。\n- `team_id`、`query`、`is_my_team` 之间是“与”关系。\n- 默认按 `updated_at` 倒序排列,可用 `orderby`/`asc` 调整。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 调用者无权访问的私有应用不会出现在结果中;账户所有者和账户管理员可以看到全部应用。\n- `is_my_team: true` 只保留调用者所在团队拥有的应用;调用者所在团队没有任何应用,或调用者不属于任何团队时,返回空列表。\n- `team_id`、`query`、`is_my_team` 之间是“与”关系。\n- 默认按 `updated_at` 倒序排列,可用 `orderby`/`asc` 调整。", "href": "/zh/api-reference/rum/applications/rum-application-read-list", "metadata": { "sidebarTitle": "查询应用列表" @@ -53508,7 +53508,7 @@ "RUM/应用管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- URL 必须使用 `http` 或 `https`;在 Flashduty 云端,解析到私有、回环、链路本地或保留地址的主机会被拒绝并返回 `InvalidParameter`。\n- 样例请求体与真实告警事件结构相同:`account_id`、`data_source_type`(`rum.alert`)、`title`、`event_severity`、`event_status`、`description`、`alert_key`、`labels` 以及 `event_time`(Unix 秒)。\n- 每次尝试 10 秒超时;传输错误、5xx 和 429 响应最多重试 2 次。\n- 投递失败时仍返回 HTTP 200,`ok` 为 `false`,原因在 `message` 中。\n- 调用者须对该应用有编辑权:账户所有者、账户管理员、应用创建者或所属团队成员,否则返回 `AccessDenied`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **应用管理**(`rum`) |\n\n## 使用说明\n\n- URL 必须使用 `http` 或 `https`;在 Flashduty 云端,解析到私有、回环、链路本地或保留地址的主机会被拒绝并返回 `InvalidParameter`。\n- 样例请求体与真实告警事件结构相同:`account_id`、`data_source_type`(`rum.alert`)、`title`、`event_severity`、`event_status`、`description`、`alert_key`、`labels` 以及 `event_time`(Unix 秒)。\n- 每次尝试 10 秒超时;传输错误、5xx 和 429 响应最多重试 2 次。\n- 投递失败时仍返回 HTTP 200,`ok` 为 `false`,原因在 `message` 中。\n- 调用者须对该应用有编辑权:账户所有者、账户管理员、应用创建者或所属团队成员,否则返回 `AccessDenied`。", "href": "/zh/api-reference/rum/applications/rum-application-webhook-test", "metadata": { "sidebarTitle": "测试应用 Webhook" @@ -54415,7 +54415,7 @@ "RUM/RUM 自定义字段" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**100 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 使用 `POST /rum/field/list`(传 `is_facet: true`)发现每个 scope 下可用的 `facet_key`。\n- `facet_key` 必须是所请求 `scope` 下的分面字段(`is_facet: true`),且 `show_type` 为 `list`、`value_type` 不是数组类型,否则返回 `InvalidParameter`。\n- `facet_key` 为 `null` 的事件不参与统计。传入 `facet_value` 时只统计取值等于它的事件,其 JSON 类型须与字段的 `value_type` 一致。\n- 传入 `dql` 可在统计前过滤事件。`sql` 只填 `WHERE` 条件本身;其中任意位置出现 `SELECT`(不区分大小写)都会被拒绝。\n- `limit` 默认 100,最大 100。\n- `start_time` / `end_time` 必填,为 Unix **毫秒**时间戳,跨度不超过 31 天。\n- `scope` 为 `sourcemap` 时,用 `type` 和 `kind` 选择统计哪个符号文件库。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**100 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 使用 `POST /rum/field/list`(传 `is_facet: true`)发现每个 scope 下可用的 `facet_key`。\n- `facet_key` 必须是所请求 `scope` 下的分面字段(`is_facet: true`),且 `show_type` 为 `list`、`value_type` 不是数组类型,否则返回 `InvalidParameter`。\n- `facet_key` 为 `null` 的事件不参与统计。传入 `facet_value` 时只统计取值等于它的事件,其 JSON 类型须与字段的 `value_type` 一致。\n- 传入 `dql` 可在统计前过滤事件。`sql` 只填 `WHERE` 条件本身;其中任意位置出现 `SELECT`(不区分大小写)都会被拒绝。\n- 调用者无权访问的私有应用的事件不参与统计,与 `POST /rum/data/query` 一致。\n- `limit` 默认 100,最大 100。\n- `start_time` / `end_time` 必填,为 Unix **毫秒**时间戳,跨度不超过 31 天。\n- `scope` 为 `sourcemap` 时,用 `type` 和 `kind` 选择统计哪个符号文件库。", "href": "/zh/api-reference/rum/facets/rum-read-facet-count", "metadata": { "sidebarTitle": "查询分值分布" @@ -54718,7 +54718,7 @@ "RUM/RUM 问题跟踪" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `team_id` 为所属应用**当前**的团队;`POST /rum/issue/list` 与 `POST /rum/issue/export` 返回 Issue 首次出现时记录的团队,应用转移到其他团队后两者不同。\n- `issue_id` 不存在或已删除时返回 `InvalidParameter`(\"The specified issue does not exist\"),而不是 `ResourceNotFound`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `team_id` 为所属应用**当前**的团队;`POST /rum/issue/list` 与 `POST /rum/issue/export` 返回 Issue 首次出现时记录的团队,应用转移到其他团队后两者不同。\n- `issue_id` 不存在或已删除时返回 `InvalidParameter`(\"The specified issue does not exist\"),而不是 `ResourceNotFound`。\n- Issue 所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。", "href": "/zh/api-reference/rum/issues/rum-issue-read-info", "metadata": { "sidebarTitle": "查看 Issue 详情" @@ -55813,7 +55813,7 @@ "RUM/RUM 问题跟踪" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 只应用请求中携带的字段;`status` 与当前状态相同时不会产生任何变化。\n- 将未解决的 Issue 的 `status` 设为 `resolved` 会记录 `resolved_at` 和 `resolved_by` 并清除 `regression`;把已解决的 Issue 改为其他状态会清空 `resolved_at` 和 `resolved_by`。\n- `resolve_mode` 只在同时传 `status: resolved` 时生效,此时不传默认为 `any`;对已解决的 Issue 传 `status: resolved` 加新的 `resolve_mode` 可以只修改解决方式。\n- 应用开启告警时,将 Issue 设为已解决会立即发送其恢复告警。\n- 设置 `suspected_cause` 会把根因标记为用户指定(`suspected_cause.source` 为 `user`,`person_id` 为调用者),之后自动分析不会再覆盖它。\n- `issue_id` 不存在时返回 `InvalidParameter`(\"The specified issue does not exist\")。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 只应用请求中携带的字段;`status` 与当前状态相同时不会产生任何变化。\n- 将未解决的 Issue 的 `status` 设为 `resolved` 会记录 `resolved_at` 和 `resolved_by` 并清除 `regression`;把已解决的 Issue 改为其他状态会清空 `resolved_at` 和 `resolved_by`。\n- `resolve_mode` 只在同时传 `status: resolved` 时生效,此时不传默认为 `any`;对已解决的 Issue 传 `status: resolved` 加新的 `resolve_mode` 可以只修改解决方式。\n- 应用开启告警时,将 Issue 设为已解决会立即发送其恢复告警。\n- 设置 `suspected_cause` 会把根因标记为用户指定(`suspected_cause.source` 为 `user`,`person_id` 为调用者),之后自动分析不会再覆盖它。\n- `issue_id` 不存在时返回 `InvalidParameter`(\"The specified issue does not exist\")。\n- Issue 所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/rum/issues/rum-issue-write-update", "metadata": { "sidebarTitle": "更新 Issue" @@ -56013,7 +56013,7 @@ "RUM/RUM 会话回放" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 若会话不存在,或该会话没有录制回放数据(`session_has_replay` 为 false),返回 `InvalidParameter`。\n- 若在会话开始至其记录结束时间后 4 小时内找不到带回放数据的视图,返回 `InvalidParameter`。\n- `ts` 必须与会话开始时间(Unix 毫秒)完全相等;其他取值会导致查不到会话并返回 `InvalidParameter`。\n- 所有时间戳均为客户端时间,不做时钟偏差校正(`server_time_delta` 恒为 `0`)。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 若会话不存在,或该会话没有录制回放数据(`session_has_replay` 为 false),返回 `InvalidParameter`。\n- 若在会话开始至其记录结束时间后 4 小时内找不到带回放数据的视图,返回 `InvalidParameter`。\n- `ts` 必须与会话开始时间(Unix 毫秒)完全相等;其他取值会导致查不到会话并返回 `InvalidParameter`。\n- 会话所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。\n- 所有时间戳均为客户端时间,不做时钟偏差校正(`server_time_delta` 恒为 `0`)。", "href": "/zh/api-reference/rum/session-replay/rum-session-replay-read-metadata", "metadata": { "sidebarTitle": "查看会话回放元数据" @@ -56108,7 +56108,7 @@ "RUM/RUM 会话回放" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 当 `url_mode` 为 `false`(默认)时,响应以 `application/x-ndjson` 流式返回——每行是一条解压后的回放分段 JSON 记录——且**不会**包裹在标准信封中;下一页的分页游标改由响应头 `X-Search-After-Ctx` 返回,而非响应体字段。读取失败的分段会被直接跳过。\n- 当 `url_mode` 为 `true` 时,响应为标准 JSON 信封,内含分段对象(zlib 压缩)的预签名下载地址,1 小时内有效。\n- 传入 `ts`(且不传 `search_after_ctx`)时,从该时间点及之前最近的全量快照分段开始,最多向前查找 4 小时;找不到时从头开始分页。\n- 只要本页取满 `limit` 个分段就会返回游标,因此最后一页可能为空。\n- `limit` 取值范围 1-99;传入 100 及以上将被拒绝。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 当 `url_mode` 为 `false`(默认)时,响应以 `application/x-ndjson` 流式返回——每行是一条解压后的回放分段 JSON 记录——且**不会**包裹在标准信封中;下一页的分页游标改由响应头 `X-Search-After-Ctx` 返回,而非响应体字段。读取失败的分段会被直接跳过。\n- 当 `url_mode` 为 `true` 时,响应为标准 JSON 信封,内含分段对象(zlib 压缩)的预签名下载地址,1 小时内有效。\n- 传入 `ts`(且不传 `search_after_ctx`)时,从该时间点及之前最近的全量快照分段开始,最多向前查找 4 小时;找不到时从头开始分页。\n- 只要本页取满 `limit` 个分段就会返回游标,因此最后一页可能为空。\n- `limit` 取值范围 1-99;传入 100 及以上将被拒绝。\n- 会话所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。\n- 本页没有分段时返回空结果。刚上传的分段可能尚未完成索引,此时返回 `ResourceNotFound`(\"Replay segments are not available yet. Please retry shortly\"),稍后重试即可。", "href": "/zh/api-reference/rum/session-replay/rum-session-replay-read-segments", "metadata": { "sidebarTitle": "查询会话回放分段" @@ -61444,7 +61444,7 @@ "On-call/值班排班" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **值班管理**(`on-call`) |\n\n## 使用说明\n\n- 仍被分派策略引用的值班表不能删除:请求返回 HTTP 400 `ReferenceExist`,不会删除任何值班表,`data.refs` 列出引用它的规则(`kind`、`name`、`href`)。\n- 不存在的 ID 会被忽略。列出的值班表在同一事务中删除。\n- 每次调用都会记录到账户审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **值班管理**(`on-call`) |\n\n## 使用说明\n\n- 仍被分派策略引用的值班表不能删除:请求返回 HTTP 400 `ReferenceExist`,不会删除任何值班表,`data.refs` 列出引用它的规则(`kind`、`name`、`href`)。\n- 调用者必须能编辑列出的每个值班表:账户所有者或管理员、值班表创建者,或其所属团队成员,否则返回 `AccessDenied`,不会删除任何值班表。\n- 引用检查无法完成时返回 `InternalError`,不会删除任何值班表。\n- 不存在的 ID 会被忽略。列出的值班表在同一事务中删除。\n- 每次调用都会记录到账户审计日志。", "href": "/zh/api-reference/on-call/schedules/schedule-delete", "metadata": { "sidebarTitle": "删除值班表" @@ -61978,7 +61978,7 @@ "On-call/值班排班" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 按创建时间从新到旧排序。`query` 对值班表名称或描述做子串匹配。\n- `is_my_team` 为 true 时只保留调用者所在团队的值班表;`is_my_manage` 为 true 时保留调用者所在团队的值班表以及调用者创建的值班表。两者不能同时为 true。`team_ids` 会与上述过滤取交集。\n- 不传 `start`/`end` 时只返回已保存的配置(`layers`、`schedule_layers`、`cur_oncall`、`next_oncall` 为 `null`)。两者都传时计算 `layers`、`schedule_layers`、`final_schedule`、`cur_oncall` 和 `next_oncall`;本接口中 `layer_schedules` 始终为 `null`。\n- `start` 和 `end` 为 10 位 Unix 秒级时间戳;`end` 必须晚于 `start`,且相差不超过 45 天。只传 `end` 不传 `start` 会被拒绝。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 按创建时间从新到旧排序。`query` 对值班表名称或描述做子串匹配。\n- `is_my_team` 为 true 时只保留调用者所在团队的值班表,可用 `team_ids` 进一步收窄;`team_ids` 与调用者所在团队没有交集,或调用者不属于任何团队时,返回空列表。`is_my_manage` 为 true 时保留调用者创建的值班表,以及调用者所在团队的值班表(可用 `team_ids` 收窄,不属于调用者的团队 ID 会被忽略)。两者不能同时为 true。\n- 不传 `start`/`end` 时只返回已保存的配置(`layers`、`schedule_layers`、`cur_oncall`、`next_oncall` 为 `null`)。两者都传时计算 `layers`、`schedule_layers`、`final_schedule`、`cur_oncall` 和 `next_oncall`;本接口中 `layer_schedules` 始终为 `null`。\n- `start` 和 `end` 为 10 位 Unix 秒级时间戳;`end` 必须晚于 `start`,且相差不超过 45 天。只传 `end` 不传 `start` 会被拒绝。", "href": "/zh/api-reference/on-call/schedules/schedule-list", "metadata": { "sidebarTitle": "查询值班表列表" @@ -66252,7 +66252,7 @@ "On-call/通知模板" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **模板查看**(`on-call`) 或 **模板管理**(`on-call`) |\n\n## 使用说明\n\n- 第一页的第一条总是内置预设模板(`template_id` 为 `6321aad26c12104586a88916`),不受过滤条件影响,并计入 `total`。\n- 按 `orderby`(默认 `created_at`)排序,默认倒序,`asc` 为 `true` 时正序。已软删除的模板不返回。\n- `is_my_team: true` 时只返回调用方所在团队的模板;同时传了 `team_ids` 则只保留两者共有的团队。若交集为空,则不按团队过滤,返回所有团队的模板。调用方不属于任何团队时返回空结果(`total` 为 0,也没有预设模板)。\n- `query` 是对 `template_name` 的正则匹配,不区分大小写;不合法的正则按普通文本匹配。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **协作空间查看**(`on-call`) 或 **协作空间管理**(`on-call`) 或 **模板查看**(`on-call`) 或 **模板管理**(`on-call`) |\n\n## 使用说明\n\n- 第一页的第一条总是内置预设模板(`template_id` 为 `6321aad26c12104586a88916`),不受过滤条件影响,并计入 `total`。\n- 按 `orderby`(默认 `created_at`)排序,默认倒序,`asc` 为 `true` 时正序。已软删除的模板不返回。\n- `is_my_team: true` 时只返回调用方所在团队的模板;同时传了 `team_ids` 则只保留两者共有的团队。交集为空或调用方不属于任何团队时,返回空结果(`total` 为 0,也没有预设模板)。\n- `query` 是对 `template_name` 的正则匹配,不区分大小写;不合法的正则按普通文本匹配。", "href": "/zh/api-reference/on-call/notification-templates/template-read-list", "metadata": { "sidebarTitle": "查询模板列表" diff --git a/api-reference/platform.openapi.en.json b/api-reference/platform.openapi.en.json index 19f73a01..9108a8b5 100644 --- a/api-reference/platform.openapi.en.json +++ b/api-reference/platform.openapi.en.json @@ -242,7 +242,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `enabled` status can be disabled; calling it on a role that is already disabled returns `400 InvalidParameter`.\n- The built-in roles (`2`, `6`, `8`) cannot be disabled: the call succeeds but changes nothing.\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Disabling does not revoke the role from the members who hold it.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `enabled` status can be disabled; calling it on a role that is already disabled returns `400 InvalidParameter`.\n- The built-in roles (`2`, `6`, `8`) cannot be disabled: the call returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Disabling does not revoke the role from the members who hold it, but a disabled role grants no permissions: those members, and the app keys they created, lose the role's permissions until it is enabled again.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-disable", "metadata": { "sidebarTitle": "Disable a role" @@ -315,7 +315,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- While members still hold the role, the call fails with `400 ReferenceExist` and lists them in `data.refs` (`kind` `member`); set `is_force` to `true` to revoke the role from all of them and then delete it.\n- A role selected as a default role in the SSO configuration cannot be deleted, even with `is_force`; the call fails with `400 ReferenceExist` until it is unselected there.\n- A role ID that does not exist or was already deleted is ignored and the call succeeds.\n- Do not pass a built-in role ID (`2`, `6`, `8`): the built-in role itself is not deleted, but with `is_force: true` it is revoked from every member who holds it.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- While members still hold the role, the call fails with `400 ReferenceExist` and lists them in `data.refs` (`kind` `member`); set `is_force` to `true` to revoke the role from all of them and then delete it.\n- A role selected as a default role in the SSO configuration cannot be deleted, even with `is_force`; the call fails with `400 ReferenceExist` until it is unselected there.\n- A role ID that does not exist or was already deleted is ignored and the call succeeds.\n- The built-in roles (`2`, `6`, `8`) cannot be deleted: with or without `is_force`, the call returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-delete", "metadata": { "sidebarTitle": "Delete a role" @@ -1026,7 +1026,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `disabled` status can be enabled; calling it on an enabled role — including the built-in roles — returns `400 InvalidParameter`.\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Only a role in `disabled` status can be enabled; calling it on an enabled role returns `400 InvalidParameter`.\n- The built-in roles (`2`, `6`, `8`) cannot be enabled or disabled: the call returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- Once enabled, the role's permissions apply again to the members who hold it and to the app keys those members created.\n- A role ID that does not exist or was deleted is ignored and the call succeeds.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-enable", "metadata": { "sidebarTitle": "Enable a role" @@ -1409,7 +1409,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Every ID in `member_ids` must be a member of the account, with no duplicates; otherwise the call returns `400` and nobody is changed.\n- `role_id` must be a built-in role or a custom role that has not been deleted (disabled roles are accepted); otherwise the call returns `400`.\n- Members provisioned through SSO cannot be changed while the SSO configuration marks them non-editable; the call returns `400`.\n- Members who already hold the role keep it unchanged.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Every ID in `member_ids` must be a member of the account, with no duplicates; otherwise the call returns `400` and nobody is changed.\n- `role_id` must be a built-in role or a custom role that has not been deleted (disabled roles are accepted, but grant no permissions until enabled); otherwise the call returns `400`.\n- Members provisioned through SSO cannot be changed while the SSO configuration marks them non-editable; the call returns `400`.\n- Members who already hold the role keep it unchanged.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-grant-role", "metadata": { "sidebarTitle": "Grant role to members" @@ -1563,7 +1563,7 @@ "Platform/Roles & permissions" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Omit `role_id` (or set it to 0) to create a role; pass the ID of a custom role to update it.\n- `role_name` must be unique in the account, including the built-in names `Admin`, `Responder`, and `Viewer`; a conflict returns `400`.\n- An update overwrites `role_name`, `description`, and `permission_ids` together: omitting `description` clears it, and omitting `permission_ids` removes every permission from the role.\n- Updating a disabled role re-enables it.\n- Every ID in `permission_ids` must be a permission returned by `POST /role/permission/list` (with `with_all: true`); otherwise the call returns `400` and nothing changes.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Omit `role_id` (or set it to 0) to create a role; a new ID is always assigned. Pass the ID of a custom role of your account to update it; any other ID returns `400 InvalidParameter` (`no role found by id`), and a built-in role ID (`2`, `6`, `8`) returns `400 InvalidParameter` (`Preset roles cannot be modified.`).\n- `role_name` must be unique in the account, including the built-in names `Admin`, `Responder`, and `Viewer`; a conflict returns `400`.\n- An update overwrites `role_name`, `description`, and `permission_ids` together: omitting `description` clears it, and omitting `permission_ids` removes every permission from the role.\n- Updating a disabled role keeps it disabled; call `POST /role/enable` to enable it.\n- Every ID in `permission_ids` must be a permission returned by `POST /role/permission/list` (with `with_all: true`); otherwise the call returns `400` and nothing changes.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/platform/roles-permissions/role-write-upsert", "metadata": { "sidebarTitle": "Create or update a role" @@ -4010,7 +4010,7 @@ "enabled", "disabled" ], - "description": "Role status. `enabled` — active; `disabled` — turned off with `POST /role/disable`. Built-in roles are always `enabled`; deleted roles are never returned." + "description": "Role status. `enabled` — active; `disabled` — turned off with `POST /role/disable`; it grants no permissions to the members who hold it. Built-in roles are always `enabled`; deleted roles are never returned." }, "permission_ids": { "type": "array", diff --git a/api-reference/platform.openapi.zh.json b/api-reference/platform.openapi.zh.json index e6633606..fa4e8aa6 100644 --- a/api-reference/platform.openapi.zh.json +++ b/api-reference/platform.openapi.zh.json @@ -242,7 +242,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `enabled` 状态的角色可以禁用;对已禁用的角色调用会返回 `400 InvalidParameter`。\n- 内置角色(`2`、`6`、`8`)无法禁用:调用返回成功,但不做任何修改。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 禁用角色不会把它从持有该角色的成员身上解除。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `enabled` 状态的角色可以禁用;对已禁用的角色调用会返回 `400 InvalidParameter`。\n- 内置角色(`2`、`6`、`8`)无法禁用:调用返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 禁用角色不会把它从持有该角色的成员身上解除,但已禁用的角色不提供任何权限:这些成员及其创建的 App Key 会失去该角色的权限,直到角色重新启用。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-disable", "metadata": { "sidebarTitle": "禁用角色" @@ -315,7 +315,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 仍有成员持有该角色时,调用返回 `400 ReferenceExist`,并在 `data.refs` 中列出这些成员(`kind` 为 `member`);设置 `is_force` 为 `true` 会先从所有持有成员解除该角色再删除。\n- 被单点登录配置选为默认角色的角色无法删除,即使设置 `is_force` 也一样;在单点登录配置中取消选择前,调用会返回 `400 ReferenceExist`。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 不要传内置角色 ID(`2`、`6`、`8`):内置角色本身不会被删除,但设置 `is_force: true` 时会把它从所有持有成员身上解除。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 仍有成员持有该角色时,调用返回 `400 ReferenceExist`,并在 `data.refs` 中列出这些成员(`kind` 为 `member`);设置 `is_force` 为 `true` 会先从所有持有成员解除该角色再删除。\n- 被单点登录配置选为默认角色的角色无法删除,即使设置 `is_force` 也一样;在单点登录配置中取消选择前,调用会返回 `400 ReferenceExist`。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 内置角色(`2`、`6`、`8`)不能删除:无论是否设置 `is_force`,调用都返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-delete", "metadata": { "sidebarTitle": "删除角色" @@ -1026,7 +1026,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `disabled` 状态的角色可以启用;对已启用的角色(包括内置角色)调用会返回 `400 InvalidParameter`。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 只有 `disabled` 状态的角色可以启用;对已启用的角色调用会返回 `400 InvalidParameter`。\n- 内置角色(`2`、`6`、`8`)不能启用或禁用:调用返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- 启用后,持有该角色的成员及其创建的 App Key 重新获得该角色的权限。\n- 角色 ID 不存在或已删除时不做任何操作,调用仍返回成功。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-enable", "metadata": { "sidebarTitle": "启用角色" @@ -1409,7 +1409,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- `member_ids` 中的每个 ID 都必须是本账户成员且不能重复,否则返回 `400`,不修改任何人。\n- `role_id` 必须是内置角色或未删除的自定义角色(已禁用的角色也可以),否则返回 `400`。\n- 通过单点登录同步的成员,在单点登录配置将其设为不可编辑时无法修改,调用返回 `400`。\n- 已持有该角色的成员保持不变。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- `member_ids` 中的每个 ID 都必须是本账户成员且不能重复,否则返回 `400`,不修改任何人。\n- `role_id` 必须是内置角色或未删除的自定义角色(已禁用的角色也可以授予,但启用前不提供任何权限),否则返回 `400`。\n- 通过单点登录同步的成员,在单点登录配置将其设为不可编辑时无法修改,调用返回 `400`。\n- 已持有该角色的成员保持不变。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-grant-role", "metadata": { "sidebarTitle": "授予成员账户权限" @@ -1563,7 +1563,7 @@ "平台/角色与权限" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 省略 `role_id`(或置为 0)表示创建角色;传入自定义角色的 ID 表示更新。\n- `role_name` 在账户内必须唯一,也不能与内置名称 `Admin`、`Responder`、`Viewer` 重复;冲突时返回 `400`。\n- 更新会同时覆盖 `role_name`、`description`、`permission_ids`:不传 `description` 会清空描述,不传 `permission_ids` 会移除该角色的全部权限。\n- 更新一个已禁用的角色会使其重新启用。\n- `permission_ids` 中的每个 ID 都必须是 `POST /role/permission/list`(`with_all: true`)返回的权限,否则返回 `400`,不做任何修改。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **角色管理**(`organization`) |\n\n## 使用说明\n\n- 省略 `role_id`(或置为 0)表示创建角色,总是分配新的 ID。传入本账户自定义角色的 ID 表示更新;其他 ID 返回 `400 InvalidParameter`(`no role found by id`),内置角色 ID(`2`、`6`、`8`)返回 `400 InvalidParameter`(`Preset roles cannot be modified.`)。\n- `role_name` 在账户内必须唯一,也不能与内置名称 `Admin`、`Responder`、`Viewer` 重复;冲突时返回 `400`。\n- 更新会同时覆盖 `role_name`、`description`、`permission_ids`:不传 `description` 会清空描述,不传 `permission_ids` 会移除该角色的全部权限。\n- 更新已禁用的角色不会改变其状态,角色仍为禁用;如需启用请调用 `POST /role/enable`。\n- `permission_ids` 中的每个 ID 都必须是 `POST /role/permission/list`(`with_all: true`)返回的权限,否则返回 `400`,不做任何修改。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/platform/roles-permissions/role-write-upsert", "metadata": { "sidebarTitle": "创建或更新角色" @@ -4010,7 +4010,7 @@ "enabled", "disabled" ], - "description": "角色状态。`enabled`——启用;`disabled`——已通过 `POST /role/disable` 禁用。内置角色始终为 `enabled`;已删除的角色不会返回。" + "description": "角色状态。`enabled`——启用;`disabled`——已通过 `POST /role/disable` 禁用,持有它的成员不会获得其权限。内置角色始终为 `enabled`;已删除的角色不会返回。" }, "permission_ids": { "type": "array", diff --git a/api-reference/rum.openapi.en.json b/api-reference/rum.openapi.en.json index 66c46f87..a85fe7a6 100644 --- a/api-reference/rum.openapi.en.json +++ b/api-reference/rum.openapi.en.json @@ -1014,7 +1014,7 @@ "type": "boolean" }, "is_my_team": { - "description": "If `true`, return only applications owned by teams the caller belongs to. Has no effect when the caller belongs to no team.", + "description": "If `true`, return only applications owned by teams the caller belongs to. When the caller belongs to no team, the list is empty.", "type": "boolean" }, "limit": { @@ -4649,7 +4649,7 @@ "RUM/Applications" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Duplicate IDs are collapsed; unknown or deleted IDs are skipped without an error, so `items` can be shorter than `application_ids`.\n- The order of `items` is not guaranteed to follow `application_ids`.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Duplicate IDs are collapsed; unknown or deleted IDs, and private applications the caller cannot access, are skipped without an error, so `items` can be shorter than `application_ids`.\n- The order of `items` is not guaranteed to follow `application_ids`.", "href": "/en/api-reference/rum/applications/rum-application-read-infos", "metadata": { "sidebarTitle": "Batch get applications" @@ -4812,7 +4812,7 @@ "RUM/Applications" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Private applications the caller cannot access are left out; the account owner and account admins see every application.\n- `is_my_team: true` keeps only applications owned by the caller's teams. If the caller belongs to no team, the filter is not applied.\n- `team_id`, `query` and `is_my_team` combine with AND.\n- Sorted by `updated_at` descending unless `orderby`/`asc` say otherwise.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Private applications the caller cannot access are left out; the account owner and account admins see every application.\n- `is_my_team: true` keeps only applications owned by the caller's teams. If the caller's teams own no application, or the caller belongs to no team, the list is empty.\n- `team_id`, `query` and `is_my_team` combine with AND.\n- Sorted by `updated_at` descending unless `orderby`/`asc` say otherwise.", "href": "/en/api-reference/rum/applications/rum-application-read-list", "metadata": { "sidebarTitle": "List applications" @@ -5510,7 +5510,7 @@ "RUM/Applications" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- The URL must use `http` or `https`; on Flashduty cloud, hosts that resolve to private, loopback, link-local or reserved addresses are rejected with `InvalidParameter`.\n- The sample body has the same shape as real alert events: `account_id`, `data_source_type` (`rum.alert`), `title`, `event_severity`, `event_status`, `description`, `alert_key`, `labels`, and `event_time` (Unix seconds).\n- Each attempt times out after 10 seconds; transport errors, 5xx and 429 responses are retried up to 2 times.\n- A failed delivery still returns HTTP 200 with `ok: false` and the reason in `message`.\n- The caller must be able to edit the application: the account owner, an account admin, the application's creator, or a member of its owning team; anyone else gets `AccessDenied`.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Applications Manage** (`rum`) |\n\n## Usage\n\n- The URL must use `http` or `https`; on Flashduty cloud, hosts that resolve to private, loopback, link-local or reserved addresses are rejected with `InvalidParameter`.\n- The sample body has the same shape as real alert events: `account_id`, `data_source_type` (`rum.alert`), `title`, `event_severity`, `event_status`, `description`, `alert_key`, `labels`, and `event_time` (Unix seconds).\n- Each attempt times out after 10 seconds; transport errors, 5xx and 429 responses are retried up to 2 times.\n- A failed delivery still returns HTTP 200 with `ok: false` and the reason in `message`.\n- The caller must be able to edit the application: the account owner, an account admin, the application's creator, or a member of its owning team; anyone else gets `AccessDenied`.", "href": "/en/api-reference/rum/applications/rum-application-webhook-test", "metadata": { "sidebarTitle": "Test application webhook" @@ -6417,7 +6417,7 @@ "RUM/Facets" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **100 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Use `POST /rum/field/list` with `is_facet: true` to discover `facet_key` values for each scope.\n- `facet_key` must be a facet field (`is_facet: true`) of the requested `scope` with `show_type: list` and a non-array `value_type`; otherwise the call returns `InvalidParameter`.\n- Events where `facet_key` is `null` are not counted. Pass `facet_value` to count only events equal to that value; its JSON type must match the field's `value_type`.\n- Pass `dql` to filter events before counting. Pass `sql` as a bare `WHERE` condition; the word `SELECT` anywhere in it (case-insensitive) is rejected.\n- `limit` defaults to 100; maximum is 100.\n- `start_time` / `end_time` are required Unix epoch **milliseconds**, at most 31 days apart.\n- For `scope: sourcemap`, `type` and `kind` choose which symbol store is counted.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **100 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Use `POST /rum/field/list` with `is_facet: true` to discover `facet_key` values for each scope.\n- `facet_key` must be a facet field (`is_facet: true`) of the requested `scope` with `show_type: list` and a non-array `value_type`; otherwise the call returns `InvalidParameter`.\n- Events where `facet_key` is `null` are not counted. Pass `facet_value` to count only events equal to that value; its JSON type must match the field's `value_type`.\n- Pass `dql` to filter events before counting. Pass `sql` as a bare `WHERE` condition; the word `SELECT` anywhere in it (case-insensitive) is rejected.\n- Events of private applications the caller cannot access are not counted, as in `POST /rum/data/query`.\n- `limit` defaults to 100; maximum is 100.\n- `start_time` / `end_time` are required Unix epoch **milliseconds**, at most 31 days apart.\n- For `scope: sourcemap`, `type` and `kind` choose which symbol store is counted.", "href": "/en/api-reference/rum/facets/rum-read-facet-count", "metadata": { "sidebarTitle": "Count facet value distribution" @@ -6720,7 +6720,7 @@ "RUM/Issues" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- `team_id` is the owning application's **current** team; `POST /rum/issue/list` and `POST /rum/issue/export` report the team recorded when the issue was first seen, which differs once the application moves to another team.\n- An unknown or deleted `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\"), not `ResourceNotFound`.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- `team_id` is the owning application's **current** team; `POST /rum/issue/list` and `POST /rum/issue/export` report the team recorded when the issue was first seen, which differs once the application moves to another team.\n- An unknown or deleted `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\"), not `ResourceNotFound`.\n- An issue of a private application the caller cannot access returns `AccessDenied` (\"You do not have permission to access this application\").", "href": "/en/api-reference/rum/issues/rum-issue-read-info", "metadata": { "sidebarTitle": "Get issue detail" @@ -7815,7 +7815,7 @@ "RUM/Issues" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only the fields you send are applied; sending a `status` equal to the current one changes nothing.\n- Setting `status` to `resolved` on an unresolved issue stamps `resolved_at` and `resolved_by` and clears `regression`; moving a resolved issue to another status clears `resolved_at` and `resolved_by`.\n- `resolve_mode` is applied only together with `status: resolved`, and defaults to `any` when omitted there; send it with `status: resolved` on an already resolved issue to change only the mode.\n- When the application's alerting is enabled, resolving an issue sends its recovery alert right away.\n- Setting `suspected_cause` marks the cause as user-set (`suspected_cause.source` = `user`, `person_id` = caller), and automatic analysis no longer overwrites it.\n- An unknown `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\").\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Only the fields you send are applied; sending a `status` equal to the current one changes nothing.\n- Setting `status` to `resolved` on an unresolved issue stamps `resolved_at` and `resolved_by` and clears `regression`; moving a resolved issue to another status clears `resolved_at` and `resolved_by`.\n- `resolve_mode` is applied only together with `status: resolved`, and defaults to `any` when omitted there; send it with `status: resolved` on an already resolved issue to change only the mode.\n- When the application's alerting is enabled, resolving an issue sends its recovery alert right away.\n- Setting `suspected_cause` marks the cause as user-set (`suspected_cause.source` = `user`, `person_id` = caller), and automatic analysis no longer overwrites it.\n- An unknown `issue_id` returns `InvalidParameter` (\"The specified issue does not exist\").\n- An issue of a private application the caller cannot access returns `AccessDenied` (\"You do not have permission to access this application\").\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", "href": "/en/api-reference/rum/issues/rum-issue-write-update", "metadata": { "sidebarTitle": "Update issue" @@ -8015,7 +8015,7 @@ "RUM/Session replay" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `InvalidParameter` if the session does not exist, or if it has no replay data recorded (`session_has_replay` is false).\n- Returns `InvalidParameter` if no view with replay data is found between the session start and 4 hours after its recorded end.\n- `ts` must equal the session's start time exactly (Unix milliseconds); any other value makes the session lookup miss and returns `InvalidParameter`.\n- All timestamps are client times; no clock-skew correction is applied (`server_time_delta` is always `0`).", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Returns `InvalidParameter` if the session does not exist, or if it has no replay data recorded (`session_has_replay` is false).\n- Returns `InvalidParameter` if no view with replay data is found between the session start and 4 hours after its recorded end.\n- `ts` must equal the session's start time exactly (Unix milliseconds); any other value makes the session lookup miss and returns `InvalidParameter`.\n- If the session belongs to a private application the caller cannot access, the call returns `AccessDenied` (\"You do not have permission to access this application\").\n- All timestamps are client times; no clock-skew correction is applied (`server_time_delta` is always `0`).", "href": "/en/api-reference/rum/session-replay/rum-session-replay-read-metadata", "metadata": { "sidebarTitle": "Get session replay metadata" @@ -8110,7 +8110,7 @@ "RUM/Session replay" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- When `url_mode` is `false` (default), the response streams `application/x-ndjson` — one decompressed replay segment JSON object per line — and is **not** wrapped in the standard envelope. The pagination cursor for the next call is returned in the `X-Search-After-Ctx` response header instead of a body field. A segment that cannot be read is skipped silently.\n- When `url_mode` is `true`, the response is a normal JSON envelope containing presigned download URLs (valid 1 hour) for the zlib-compressed segment objects.\n- Pass `ts` (without `search_after_ctx`) to start from the last full-snapshot segment at or before that time, searching up to 4 hours back; if none is found, paging starts from the beginning.\n- A cursor is returned whenever a page is full (`limit` segments), so the last page can be empty.\n- `limit` accepts 1-99; values of 100 or more are rejected.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- When `url_mode` is `false` (default), the response streams `application/x-ndjson` — one decompressed replay segment JSON object per line — and is **not** wrapped in the standard envelope. The pagination cursor for the next call is returned in the `X-Search-After-Ctx` response header instead of a body field. A segment that cannot be read is skipped silently.\n- When `url_mode` is `true`, the response is a normal JSON envelope containing presigned download URLs (valid 1 hour) for the zlib-compressed segment objects.\n- Pass `ts` (without `search_after_ctx`) to start from the last full-snapshot segment at or before that time, searching up to 4 hours back; if none is found, paging starts from the beginning.\n- A cursor is returned whenever a page is full (`limit` segments), so the last page can be empty.\n- `limit` accepts 1-99; values of 100 or more are rejected.\n- If the session belongs to a private application the caller cannot access, the call returns `AccessDenied` (\"You do not have permission to access this application\").\n- A page with no segments returns an empty result. Segments uploaded moments ago may not be indexed yet; the call then returns `ResourceNotFound` (\"Replay segments are not available yet. Please retry shortly\"), so retry after a short wait.", "href": "/en/api-reference/rum/session-replay/rum-session-replay-read-segments", "metadata": { "sidebarTitle": "List session replay segments" diff --git a/api-reference/rum.openapi.zh.json b/api-reference/rum.openapi.zh.json index 2e238474..19308a25 100644 --- a/api-reference/rum.openapi.zh.json +++ b/api-reference/rum.openapi.zh.json @@ -1014,7 +1014,7 @@ "type": "boolean" }, "is_my_team": { - "description": "为 `true` 时只返回调用者所在团队拥有的应用;调用者不属于任何团队时不生效。", + "description": "为 `true` 时只返回调用者所在团队拥有的应用;调用者不属于任何团队时返回空列表。", "type": "boolean" }, "limit": { @@ -4649,7 +4649,7 @@ "RUM/应用管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 重复的 ID 会被去重;不存在或已删除的 ID 会被直接跳过而不报错,因此 `items` 可能比 `application_ids` 短。\n- `items` 的顺序不保证与 `application_ids` 一致。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 重复的 ID 会被去重;不存在或已删除的 ID,以及调用者无权访问的私有应用,会被直接跳过而不报错,因此 `items` 可能比 `application_ids` 短。\n- `items` 的顺序不保证与 `application_ids` 一致。", "href": "/zh/api-reference/rum/applications/rum-application-read-infos", "metadata": { "sidebarTitle": "批量查询应用详情" @@ -4812,7 +4812,7 @@ "RUM/应用管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 调用者无权访问的私有应用不会出现在结果中;账户所有者和账户管理员可以看到全部应用。\n- `is_my_team: true` 只保留调用者所在团队拥有的应用;调用者不属于任何团队时,该过滤不生效。\n- `team_id`、`query`、`is_my_team` 之间是“与”关系。\n- 默认按 `updated_at` 倒序排列,可用 `orderby`/`asc` 调整。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 调用者无权访问的私有应用不会出现在结果中;账户所有者和账户管理员可以看到全部应用。\n- `is_my_team: true` 只保留调用者所在团队拥有的应用;调用者所在团队没有任何应用,或调用者不属于任何团队时,返回空列表。\n- `team_id`、`query`、`is_my_team` 之间是“与”关系。\n- 默认按 `updated_at` 倒序排列,可用 `orderby`/`asc` 调整。", "href": "/zh/api-reference/rum/applications/rum-application-read-list", "metadata": { "sidebarTitle": "查询应用列表" @@ -5510,7 +5510,7 @@ "RUM/应用管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- URL 必须使用 `http` 或 `https`;在 Flashduty 云端,解析到私有、回环、链路本地或保留地址的主机会被拒绝并返回 `InvalidParameter`。\n- 样例请求体与真实告警事件结构相同:`account_id`、`data_source_type`(`rum.alert`)、`title`、`event_severity`、`event_status`、`description`、`alert_key`、`labels` 以及 `event_time`(Unix 秒)。\n- 每次尝试 10 秒超时;传输错误、5xx 和 429 响应最多重试 2 次。\n- 投递失败时仍返回 HTTP 200,`ok` 为 `false`,原因在 `message` 中。\n- 调用者须对该应用有编辑权:账户所有者、账户管理员、应用创建者或所属团队成员,否则返回 `AccessDenied`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | **应用管理**(`rum`) |\n\n## 使用说明\n\n- URL 必须使用 `http` 或 `https`;在 Flashduty 云端,解析到私有、回环、链路本地或保留地址的主机会被拒绝并返回 `InvalidParameter`。\n- 样例请求体与真实告警事件结构相同:`account_id`、`data_source_type`(`rum.alert`)、`title`、`event_severity`、`event_status`、`description`、`alert_key`、`labels` 以及 `event_time`(Unix 秒)。\n- 每次尝试 10 秒超时;传输错误、5xx 和 429 响应最多重试 2 次。\n- 投递失败时仍返回 HTTP 200,`ok` 为 `false`,原因在 `message` 中。\n- 调用者须对该应用有编辑权:账户所有者、账户管理员、应用创建者或所属团队成员,否则返回 `AccessDenied`。", "href": "/zh/api-reference/rum/applications/rum-application-webhook-test", "metadata": { "sidebarTitle": "测试应用 Webhook" @@ -6417,7 +6417,7 @@ "RUM/RUM 自定义字段" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**100 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 使用 `POST /rum/field/list`(传 `is_facet: true`)发现每个 scope 下可用的 `facet_key`。\n- `facet_key` 必须是所请求 `scope` 下的分面字段(`is_facet: true`),且 `show_type` 为 `list`、`value_type` 不是数组类型,否则返回 `InvalidParameter`。\n- `facet_key` 为 `null` 的事件不参与统计。传入 `facet_value` 时只统计取值等于它的事件,其 JSON 类型须与字段的 `value_type` 一致。\n- 传入 `dql` 可在统计前过滤事件。`sql` 只填 `WHERE` 条件本身;其中任意位置出现 `SELECT`(不区分大小写)都会被拒绝。\n- `limit` 默认 100,最大 100。\n- `start_time` / `end_time` 必填,为 Unix **毫秒**时间戳,跨度不超过 31 天。\n- `scope` 为 `sourcemap` 时,用 `type` 和 `kind` 选择统计哪个符号文件库。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**100 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 使用 `POST /rum/field/list`(传 `is_facet: true`)发现每个 scope 下可用的 `facet_key`。\n- `facet_key` 必须是所请求 `scope` 下的分面字段(`is_facet: true`),且 `show_type` 为 `list`、`value_type` 不是数组类型,否则返回 `InvalidParameter`。\n- `facet_key` 为 `null` 的事件不参与统计。传入 `facet_value` 时只统计取值等于它的事件,其 JSON 类型须与字段的 `value_type` 一致。\n- 传入 `dql` 可在统计前过滤事件。`sql` 只填 `WHERE` 条件本身;其中任意位置出现 `SELECT`(不区分大小写)都会被拒绝。\n- 调用者无权访问的私有应用的事件不参与统计,与 `POST /rum/data/query` 一致。\n- `limit` 默认 100,最大 100。\n- `start_time` / `end_time` 必填,为 Unix **毫秒**时间戳,跨度不超过 31 天。\n- `scope` 为 `sourcemap` 时,用 `type` 和 `kind` 选择统计哪个符号文件库。", "href": "/zh/api-reference/rum/facets/rum-read-facet-count", "metadata": { "sidebarTitle": "查询分值分布" @@ -6720,7 +6720,7 @@ "RUM/RUM 问题跟踪" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `team_id` 为所属应用**当前**的团队;`POST /rum/issue/list` 与 `POST /rum/issue/export` 返回 Issue 首次出现时记录的团队,应用转移到其他团队后两者不同。\n- `issue_id` 不存在或已删除时返回 `InvalidParameter`(\"The specified issue does not exist\"),而不是 `ResourceNotFound`。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- `team_id` 为所属应用**当前**的团队;`POST /rum/issue/list` 与 `POST /rum/issue/export` 返回 Issue 首次出现时记录的团队,应用转移到其他团队后两者不同。\n- `issue_id` 不存在或已删除时返回 `InvalidParameter`(\"The specified issue does not exist\"),而不是 `ResourceNotFound`。\n- Issue 所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。", "href": "/zh/api-reference/rum/issues/rum-issue-read-info", "metadata": { "sidebarTitle": "查看 Issue 详情" @@ -7815,7 +7815,7 @@ "RUM/RUM 问题跟踪" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 只应用请求中携带的字段;`status` 与当前状态相同时不会产生任何变化。\n- 将未解决的 Issue 的 `status` 设为 `resolved` 会记录 `resolved_at` 和 `resolved_by` 并清除 `regression`;把已解决的 Issue 改为其他状态会清空 `resolved_at` 和 `resolved_by`。\n- `resolve_mode` 只在同时传 `status: resolved` 时生效,此时不传默认为 `any`;对已解决的 Issue 传 `status: resolved` 加新的 `resolve_mode` 可以只修改解决方式。\n- 应用开启告警时,将 Issue 设为已解决会立即发送其恢复告警。\n- 设置 `suspected_cause` 会把根因标记为用户指定(`suspected_cause.source` 为 `user`,`person_id` 为调用者),之后自动分析不会再覆盖它。\n- `issue_id` 不存在时返回 `InvalidParameter`(\"The specified issue does not exist\")。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **300 次/分钟**;**20 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 只应用请求中携带的字段;`status` 与当前状态相同时不会产生任何变化。\n- 将未解决的 Issue 的 `status` 设为 `resolved` 会记录 `resolved_at` 和 `resolved_by` 并清除 `regression`;把已解决的 Issue 改为其他状态会清空 `resolved_at` 和 `resolved_by`。\n- `resolve_mode` 只在同时传 `status: resolved` 时生效,此时不传默认为 `any`;对已解决的 Issue 传 `status: resolved` 加新的 `resolve_mode` 可以只修改解决方式。\n- 应用开启告警时,将 Issue 设为已解决会立即发送其恢复告警。\n- 设置 `suspected_cause` 会把根因标记为用户指定(`suspected_cause.source` 为 `user`,`person_id` 为调用者),之后自动分析不会再覆盖它。\n- `issue_id` 不存在时返回 `InvalidParameter`(\"The specified issue does not exist\")。\n- Issue 所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。\n- 每次调用都会记录到账户审计日志,请不要把敏感信息放在请求字段中。", "href": "/zh/api-reference/rum/issues/rum-issue-write-update", "metadata": { "sidebarTitle": "更新 Issue" @@ -8015,7 +8015,7 @@ "RUM/RUM 会话回放" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 若会话不存在,或该会话没有录制回放数据(`session_has_replay` 为 false),返回 `InvalidParameter`。\n- 若在会话开始至其记录结束时间后 4 小时内找不到带回放数据的视图,返回 `InvalidParameter`。\n- `ts` 必须与会话开始时间(Unix 毫秒)完全相等;其他取值会导致查不到会话并返回 `InvalidParameter`。\n- 所有时间戳均为客户端时间,不做时钟偏差校正(`server_time_delta` 恒为 `0`)。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 若会话不存在,或该会话没有录制回放数据(`session_has_replay` 为 false),返回 `InvalidParameter`。\n- 若在会话开始至其记录结束时间后 4 小时内找不到带回放数据的视图,返回 `InvalidParameter`。\n- `ts` 必须与会话开始时间(Unix 毫秒)完全相等;其他取值会导致查不到会话并返回 `InvalidParameter`。\n- 会话所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。\n- 所有时间戳均为客户端时间,不做时钟偏差校正(`server_time_delta` 恒为 `0`)。", "href": "/zh/api-reference/rum/session-replay/rum-session-replay-read-metadata", "metadata": { "sidebarTitle": "查看会话回放元数据" @@ -8110,7 +8110,7 @@ "RUM/RUM 会话回放" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 当 `url_mode` 为 `false`(默认)时,响应以 `application/x-ndjson` 流式返回——每行是一条解压后的回放分段 JSON 记录——且**不会**包裹在标准信封中;下一页的分页游标改由响应头 `X-Search-After-Ctx` 返回,而非响应体字段。读取失败的分段会被直接跳过。\n- 当 `url_mode` 为 `true` 时,响应为标准 JSON 信封,内含分段对象(zlib 压缩)的预签名下载地址,1 小时内有效。\n- 传入 `ts`(且不传 `search_after_ctx`)时,从该时间点及之前最近的全量快照分段开始,最多向前查找 4 小时;找不到时从头开始分页。\n- 只要本页取满 `limit` 个分段就会返回游标,因此最后一页可能为空。\n- `limit` 取值范围 1-99;传入 100 及以上将被拒绝。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | 无 —— 持有有效的 `app_key` 即可调用 |\n\n## 使用说明\n\n- 当 `url_mode` 为 `false`(默认)时,响应以 `application/x-ndjson` 流式返回——每行是一条解压后的回放分段 JSON 记录——且**不会**包裹在标准信封中;下一页的分页游标改由响应头 `X-Search-After-Ctx` 返回,而非响应体字段。读取失败的分段会被直接跳过。\n- 当 `url_mode` 为 `true` 时,响应为标准 JSON 信封,内含分段对象(zlib 压缩)的预签名下载地址,1 小时内有效。\n- 传入 `ts`(且不传 `search_after_ctx`)时,从该时间点及之前最近的全量快照分段开始,最多向前查找 4 小时;找不到时从头开始分页。\n- 只要本页取满 `limit` 个分段就会返回游标,因此最后一页可能为空。\n- `limit` 取值范围 1-99;传入 100 及以上将被拒绝。\n- 会话所属的私有应用调用者无权访问时,返回 `AccessDenied`(\"You do not have permission to access this application\")。\n- 本页没有分段时返回空结果。刚上传的分段可能尚未完成索引,此时返回 `ResourceNotFound`(\"Replay segments are not available yet. Please retry shortly\"),稍后重试即可。", "href": "/zh/api-reference/rum/session-replay/rum-session-replay-read-segments", "metadata": { "sidebarTitle": "查询会话回放分段" diff --git a/en/openapi/pagination.mdx b/en/openapi/pagination.mdx index e68d291a..fe5e55c8 100644 --- a/en/openapi/pagination.mdx +++ b/en/openapi/pagination.mdx @@ -124,10 +124,6 @@ A few operations use other styles, documented on their pages: [List work items]( - When 1,000 or more match, `total` is 1,000, meaning "1,000 or more". - -On [List incidents](/en/api-reference/on-call/incidents/incident-list) and [List alerts](/en/api-reference/on-call/alerts/alert-read-list) in page-number mode, `has_next_page` is derived from the capped `total`: once you have paged through 1,000 items it is `false` even if more items match. To read past 1,000 items, use cursor mode, where `has_next_page` is always accurate. - - -Use `has_next_page`, not `total`, to decide whether to fetch another page, and use a cursor for anything that may exceed 1,000 items. +Use `has_next_page`, not `total`, to decide whether to fetch another page: `has_next_page` does not depend on `total` and stays accurate past 1,000 items. diff --git a/zh/openapi/pagination.mdx b/zh/openapi/pagination.mdx index 80c3e324..da9ac7a7 100644 --- a/zh/openapi/pagination.mdx +++ b/zh/openapi/pagination.mdx @@ -125,10 +125,6 @@ On-call 的列表接口要求 `p × limit` 不超过 10,000,更深的页返回 - 匹配数据达到或超过 1,000 条时,`total` 固定为 1,000,表示"1,000 条及以上"。 - -[查询故障列表](/zh/api-reference/on-call/incidents/incident-list)和[查询告警列表](/zh/api-reference/on-call/alerts/alert-read-list)在页码模式下,`has_next_page` 是根据封顶后的 `total` 计算的:翻过 1,000 条之后,即使还有匹配数据,它也会返回 `false`。需要读取 1,000 条以上时请使用游标模式,游标模式下的 `has_next_page` 始终准确。 - - -请用 `has_next_page` 而不是 `total` 判断是否还有下一页;可能超过 1,000 条的数据请使用游标分页。 +请用 `has_next_page` 而不是 `total` 判断是否还有下一页:`has_next_page` 不依赖 `total`,超过 1,000 条后仍然准确。