From 4c3e72b72bb549a356292f49aa91090e616ea446 Mon Sep 17 00:00:00 2001 From: Ulric Qin Date: Wed, 9 Sep 2026 19:36:26 +0800 Subject: [PATCH] refactor(monit): drop retired v1 rule clients, add public v2 rule APIs Synced openapi/ from flashduty-docs main and regenerated: - Remove WriteCreate/WriteUpdate/ReadInfo/ReadCounterNode/ReadDstypes (endpoints retired upstream in monit-webapi / removed from the public registry in fc-pgy). - Add ReadInfoV2/WriteCreateV2/WriteUpdateV2 for the new public /monit/rule/v2/* contract. - The applications.go and schedules.go additions come from the spec sync pulling in other already-public endpoints (RUM remote-config and schedule APIs), not from manual edits. Note: this is a breaking change for SDK consumers still calling the removed v1 methods. --- alert_rules.go | 66 +- alert_rules_test.go | 54 + applications.go | 70 + internal/cmd/gen/main.go | 5 + models_gen.go | 448 +- openapi/openapi.en.json | 105466 ++++++++++++++++++------------------ openapi/openapi.zh.json | 105460 +++++++++++++++++------------------ roundtrip_gen_test.go | 268 +- schedules.go | 14 + 9 files changed, 107628 insertions(+), 104223 deletions(-) create mode 100644 alert_rules_test.go diff --git a/alert_rules.go b/alert_rules.go index ac264c8..5ac4e6a 100644 --- a/alert_rules.go +++ b/alert_rules.go @@ -49,20 +49,6 @@ func (s *AlertRulesService) ReadCounterChannel(ctx context.Context) (*RuleCounte return out, resp, nil } -// Get rule counts by folder node. -// -// Return an object mapping top-level folder name to the total number of rules under that folder and all its descendants. -// -// API: POST /monit/rule/counter/node (monit-rule-read-counter-node). -func (s *AlertRulesService) ReadCounterNode(ctx context.Context) (*RuleCounterNodeResponse, *Response, error) { - out := new(RuleCounterNodeResponse) - resp, err := s.client.do(ctx, "/monit/rule/counter/node", nil, out) - if err != nil { - return nil, resp, err - } - return out, resp, nil -} - // Get rule counter time series. // // Return the stored time series of the total rule count across the account — one sample per `clock` timestamp. @@ -77,20 +63,6 @@ func (s *AlertRulesService) ReadCounterTotal(ctx context.Context) (*RuleCounterT return out, resp, nil } -// List available datasource types. -// -// Return the list of datasource types (`DSType` records) that the current account can use when authoring alert rules — combines global types and account-scoped types. -// -// API: POST /monit/rule/dstypes (monit-rule-read-dstypes). -func (s *AlertRulesService) ReadDstypes(ctx context.Context) (*RuleDsTypesResponse, *Response, error) { - out := new(RuleDsTypesResponse) - resp, err := s.client.do(ctx, "/monit/rule/dstypes", nil, out) - if err != nil { - return nil, resp, err - } - return out, resp, nil -} - // Export alert rules. // // Export the configuration of selected alert rules as a portable JSON array, compatible with `POST /monit/rule/import`. @@ -105,14 +77,14 @@ func (s *AlertRulesService) ReadExport(ctx context.Context, req *RuleIDsRequest) return out, resp, nil } -// Get alert rule detail. +// Get alert rule detail (V2). // -// Return the full configuration of an alert rule by its ID, including rule queries, thresholds, and notification settings. +// Return the full V2 configuration of an alert rule by ID, including lifecycle v2 recovery and ending modes. // -// API: POST /monit/rule/info (monit-rule-read-info). -func (s *AlertRulesService) ReadInfo(ctx context.Context, req *RuleIDRequest) (*AlertRuleInfoResponse, *Response, error) { - out := new(AlertRuleInfoResponse) - resp, err := s.client.do(ctx, "/monit/rule/info", req, out) +// API: POST /monit/rule/v2/info (monit-rule-read-info-v2). +func (s *AlertRulesService) ReadInfoV2(ctx context.Context, req *RuleIDRequest) (*AlertRuleV2, *Response, error) { + out := new(AlertRuleV2) + resp, err := s.client.do(ctx, "/monit/rule/v2/info", req, out) if err != nil { return nil, resp, err } @@ -121,7 +93,7 @@ func (s *AlertRulesService) ReadInfo(ctx context.Context, req *RuleIDRequest) (* // List alert rules. // -// Return the basic information of all alert rules in a folder. For full rule details, call `POST /monit/rule/info`. +// Return the basic information of all alert rules in a folder. For full rule details, call `POST /monit/rule/v2/info`. // // API: POST /monit/rule/list/basic (monit-rule-read-list). func (s *AlertRulesService) ReadList(ctx context.Context, req *RuleListRequest) (*RuleBasicListResponse, *Response, error) { @@ -133,14 +105,14 @@ func (s *AlertRulesService) ReadList(ctx context.Context, req *RuleListRequest) return out, resp, nil } -// Create alert rule. +// Create alert rule (V2). // -// Create a new alert rule. Returns the created rule with its assigned ID. +// Create a new V2 alert rule. Returns the created rule with its assigned ID. // -// API: POST /monit/rule/create (monit-rule-write-create). -func (s *AlertRulesService) WriteCreate(ctx context.Context, req *AlertRule) (*AlertRule, *Response, error) { - out := new(AlertRule) - resp, err := s.client.do(ctx, "/monit/rule/create", req, out) +// API: POST /monit/rule/v2/create (monit-rule-write-create-v2). +func (s *AlertRulesService) WriteCreateV2(ctx context.Context, req *AlertRuleV2) (*AlertRuleV2, *Response, error) { + out := new(AlertRuleV2) + resp, err := s.client.do(ctx, "/monit/rule/v2/create", req, out) if err != nil { return nil, resp, err } @@ -207,14 +179,14 @@ func (s *AlertRulesService) WriteMove(ctx context.Context, req *RuleMoveRequest) return out, resp, nil } -// Update alert rule. +// Update alert rule (V2). // -// Replace the full configuration of an existing alert rule. All fields are overwritten. +// Replace an alert rule's V2 configuration in full by ID. Returns the updated rule. // -// API: POST /monit/rule/update (monit-rule-write-update). -func (s *AlertRulesService) WriteUpdate(ctx context.Context, req *AlertRule) (*AlertRule, *Response, error) { - out := new(AlertRule) - resp, err := s.client.do(ctx, "/monit/rule/update", req, out) +// API: POST /monit/rule/v2/update (monit-rule-write-update-v2). +func (s *AlertRulesService) WriteUpdateV2(ctx context.Context, req *AlertRuleV2) (*AlertRuleV2, *Response, error) { + out := new(AlertRuleV2) + resp, err := s.client.do(ctx, "/monit/rule/v2/update", req, out) if err != nil { return nil, resp, err } diff --git a/alert_rules_test.go b/alert_rules_test.go new file mode 100644 index 0000000..d6d5e08 --- /dev/null +++ b/alert_rules_test.go @@ -0,0 +1,54 @@ +package flashduty + +import ( + "context" + "encoding/json" + "net/http" + "testing" +) + +func TestAlertRuleUpdateV2PreservesInvestigationTargetsPresence(t *testing.T) { + tests := []struct { + name string + targets []InvestigationTarget + want string + }{ + {name: "omit keeps existing targets"}, + {name: "empty clears targets", targets: []InvestigationTarget{}, want: `[]`}, + { + name: "replace targets", + targets: []InvestigationTarget{{ + Kind: "dashboard", + Dashboard: DashboardInvestigationTarget{ + DashboardID: "01900000-0000-7000-8000-000000000001", + }, + }}, + want: `[{"dashboard":{"dashboard_id":"01900000-0000-7000-8000-000000000001"},"kind":"dashboard"}]`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client := newTestClient(t, func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost || r.URL.Path != "/monit/rule/v2/update" { + t.Errorf("unexpected request: %s %s", r.Method, r.URL.Path) + } + var body map[string]json.RawMessage + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + t.Errorf("decode request: %v", err) + } + if got := string(body["investigation_targets"]); got != tt.want { + t.Errorf("investigation_targets = %q, want %q", got, tt.want) + } + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(map[string]any{"data": body}) + }) + _, _, err := client.AlertRules.WriteUpdateV2(context.Background(), &AlertRuleV2{ + ID: 123, + InvestigationTargets: tt.targets, + }) + if err != nil { + t.Fatal(err) + } + }) + } +} diff --git a/applications.go b/applications.go index bf1ca8d..8169441 100644 --- a/applications.go +++ b/applications.go @@ -49,6 +49,76 @@ func (s *ApplicationsService) ReadList(ctx context.Context, req *RUMApplicationL return out, resp, nil } +// Get remote config detail. +// +// Retrieve the live remote configuration of a RUM application and the version it is stored under. +// +// API: POST /rum/application/remote-config/get (rum-application-remote-config-read-get). +func (s *ApplicationsService) RemoteConfigReadGet(ctx context.Context, req *GetRemoteConfigRequest) (*GetRemoteConfigResponse, *Response, error) { + out := new(GetRemoteConfigResponse) + resp, err := s.client.do(ctx, "/rum/application/remote-config/get", req, out) + if err != nil { + return nil, resp, err + } + return out, resp, nil +} + +// List remote config history. +// +// List published remote configuration versions of a RUM application. +// +// API: POST /rum/application/remote-config/history/list (rum-application-remote-config-read-history-list). +func (s *ApplicationsService) RemoteConfigReadHistoryList(ctx context.Context, req *ListRemoteConfigHistoryRequest) (*ListRemoteConfigHistoryResponse, *Response, error) { + out := new(ListRemoteConfigHistoryResponse) + resp, err := s.client.do(ctx, "/rum/application/remote-config/history/list", req, out) + if err != nil { + return nil, resp, err + } + return out, resp, nil +} + +// Preview remote config. +// +// Evaluate a draft remote configuration against a client context without publishing it. +// +// API: POST /rum/application/remote-config/preview (rum-application-remote-config-read-preview). +func (s *ApplicationsService) RemoteConfigReadPreview(ctx context.Context, req *PreviewRemoteConfigRequest) (*PreviewRemoteConfigResponse, *Response, error) { + out := new(PreviewRemoteConfigResponse) + resp, err := s.client.do(ctx, "/rum/application/remote-config/preview", req, out) + if err != nil { + return nil, resp, err + } + return out, resp, nil +} + +// Revert remote config. +// +// Republish an earlier remote configuration version's content as a new version. +// +// API: POST /rum/application/remote-config/history/revert (rum-application-remote-config-write-history-revert). +func (s *ApplicationsService) RemoteConfigWriteHistoryRevert(ctx context.Context, req *RevertRemoteConfigRequest) (*RevertRemoteConfigResponse, *Response, error) { + out := new(RevertRemoteConfigResponse) + resp, err := s.client.do(ctx, "/rum/application/remote-config/history/revert", req, out) + if err != nil { + return nil, resp, err + } + return out, resp, nil +} + +// Update remote config. +// +// Publish a complete new remote configuration version for a RUM application. +// +// API: POST /rum/application/remote-config/update (rum-application-remote-config-write-update). +func (s *ApplicationsService) RemoteConfigWriteUpdate(ctx context.Context, req *UpdateRemoteConfigRequest) (*UpdateRemoteConfigResponse, *Response, error) { + out := new(UpdateRemoteConfigResponse) + resp, err := s.client.do(ctx, "/rum/application/remote-config/update", req, out) + if err != nil { + return nil, resp, err + } + return out, resp, nil +} + // Test application webhook. // // Send a sample RUM alert event to verify an application's webhook URL. diff --git a/internal/cmd/gen/main.go b/internal/cmd/gen/main.go index 6f5e699..de606aa 100644 --- a/internal/cmd/gen/main.go +++ b/internal/cmd/gen/main.go @@ -853,6 +853,11 @@ func (g *Gen) emitStruct(name string, s map[string]any) string { case inReq && needsPointer && (isNullable(pv) || preserveAbsence): jsonTag = k + ",omitempty" toonTag = k + ",omitempty" + case inReq && !required[k] && preserveAbsence && strings.HasPrefix(gt, "[]"): + // Preserve nil (omitted) versus an explicit empty slice (clear). + // omitempty would drop both and silently keep the stored value. + jsonTag = k + ",omitzero" + toonTag = k + ",omitempty" case inReq && !required[k]: toonTag = k + ",omitempty" if isStructField { diff --git a/models_gen.go b/models_gen.go index 0f4e992..82ab044 100644 --- a/models_gen.go +++ b/models_gen.go @@ -138,15 +138,9 @@ type RuleBasicListResponse []AlertRuleBasic // RuleCounterChannelResponse is a map response payload. type RuleCounterChannelResponse map[string]int64 -// RuleCounterNodeResponse is a map response payload. -type RuleCounterNodeResponse map[string]int64 - // RuleCounterTotalResponse is a list response payload. type RuleCounterTotalResponse []AlertRuleCounter -// RuleDsTypesResponse is a list response payload. -type RuleDsTypesResponse []DsType - // RuleImportRequest is a list response payload. type RuleImportRequest []AlertRule @@ -839,7 +833,7 @@ type AlertRule struct { DsIDs []uint64 `json:"ds_ids,omitempty" toon:"ds_ids,omitempty"` // Data source name patterns (supports wildcards). At least one of `ds_list` / `ds_ids` must be non-empty; the two are merged to decide which datasources the rule monitors. DsList []string `json:"ds_list,omitempty" toon:"ds_list,omitempty"` - // Datasource type identifier; allowed values are listed by `POST /monit/rule/dstypes` (e.g. `prometheus`, `elasticsearch`). + // Datasource type identifier (e.g. `prometheus`, `elasticsearch`). DsType string `json:"ds_type" toon:"ds_type"` // Whether the rule is enabled. Updating to `false` makes the server clean up the rule's active alerts. Enabled bool `json:"enabled,omitempty" toon:"enabled,omitempty"` @@ -869,6 +863,24 @@ type AlertRule struct { UpdaterName string `json:"updater_name,omitempty" toon:"updater_name,omitempty"` } +// AlertRuleAnyDataV2 is generated from the Flashduty OpenAPI schema. +type AlertRuleAnyDataV2 struct { + // Fire after the alert condition is met this many times; when enabled, minimum 1 and maximum 10000. Combined with `alerting_window_size` it means at least N hits within the last M evaluations. + AlertingCheckTimes int64 `json:"alerting_check_times,omitempty" toon:"alerting_check_times,omitempty"` + // Optional sliding window size M: fire only when the condition is met at least `alerting_check_times` times within the last M evaluations. Omit for consecutive mode. Must satisfy `alerting_check_times` <= M <= 10000. + AlertingWindowSize int64 `json:"alerting_window_size,omitempty" toon:"alerting_window_size,omitempty"` + // Whether the any-data check is enabled: any returned data row triggers an alert. + Enabled bool `json:"enabled,omitempty" toon:"enabled,omitempty"` + // Recovery evaluation config. Required (with non-empty `recovery.expr`) only when `recovery_mode` is `recovery_query_match`; must be omitted for the other modes. + Recovery AlertRuleRecoveryQueryV2 `json:"recovery,omitzero" toon:"recovery,omitempty"` + // Recover after the recovery condition is met this many times; minimum 1 when enabled. + RecoveryCheckTimes int64 `json:"recovery_check_times,omitempty" toon:"recovery_check_times,omitempty"` + // How recovery is decided (lifecycle v2); required when enabled. `data_absent` = recover when the query returns no data; `recovery` is not allowed. `recovery_query_match` = recover when the `recovery.expr` query expression evaluates true; only a single query (`name=A`) is allowed. `manual` = never recover automatically; alerts need manual handling, no recovery event is pushed, and `recovery` is not allowed. + RecoveryMode string `json:"recovery_mode,omitempty" toon:"recovery_mode,omitempty"` + // Severity of any-data alerts, case-sensitive; required when enabled. + Severity string `json:"severity,omitempty" toon:"severity,omitempty"` +} + // AlertRuleAudit is generated from the Flashduty OpenAPI schema. type AlertRuleAudit struct { // ID of the account that owns the rule. @@ -944,6 +956,20 @@ type AlertRuleBasic struct { UpdaterName string `json:"updater_name" toon:"updater_name"` } +// AlertRuleConfigsV2 is generated from the Flashduty OpenAPI schema. +type AlertRuleConfigsV2 struct { + // Any-data check configuration: fires when a query returns any data row. See `AlertRuleAnyDataV2`. + CheckAnydata AlertRuleAnyDataV2 `json:"check_anydata,omitzero" toon:"check_anydata,omitempty"` + // No-data check configuration. See `AlertRuleNoDataV2`. + CheckNodata AlertRuleNoDataV2 `json:"check_nodata,omitzero" toon:"check_nodata,omitempty"` + // Threshold check configuration. See `AlertRuleThresholdV2`. + CheckThreshold AlertRuleThresholdV2 `json:"check_threshold,omitzero" toon:"check_threshold,omitempty"` + // Query list with at least one entry; each needs a unique `name` (`R` and `__all__` are reserved) and a non-empty, non-duplicated `expr`. + Queries []AlertRuleConfigsV2QueriesItem `json:"queries" toon:"queries"` + // Optional auxiliary queries whose results attach to alert events as context. Each entry needs a unique `name` (not colliding with any query name) and a non-empty `expr`. + RelateQueries []AlertRuleConfigsV2RelateQueriesItem `json:"relate_queries,omitempty" toon:"relate_queries,omitempty"` +} + // AlertRuleCounter is generated from the Flashduty OpenAPI schema. type AlertRuleCounter struct { // ID of the account this snapshot belongs to. @@ -993,62 +1019,118 @@ type AlertRuleExport struct { Timezone string `json:"timezone" toon:"timezone"` } -// AlertRuleInfoResponse is generated from the Flashduty OpenAPI schema. -type AlertRuleInfoResponse struct { - // Account ID. Filled by the server from the authenticated identity; do not provide. - AccountID uint64 `json:"account_id" toon:"account_id"` - // Annotation key-value pairs delivered with alert events; keys must not start with `$` (reserved for query fields). - Annotations map[string]string `json:"annotations" toon:"annotations"` - // Channel IDs to send alerts to. - ChannelIDs []uint64 `json:"channel_ids" toon:"channel_ids"` - // Creation time as a Unix timestamp in seconds. Generated by the server; do not provide. - CreatedAt Timestamp `json:"created_at" toon:"created_at"` - // Creator user ID. Filled by the server from the current user; do not provide. - CreatorID uint64 `json:"creator_id" toon:"creator_id"` - // Creator name. Filled by the server; do not provide. - CreatorName string `json:"creator_name" toon:"creator_name"` - // Schedule expression: a 6-field cron (with seconds) or an `@every 30s` interval descriptor. Must not start with `CRON_TZ=` or `TZ=`; use the `timezone` field instead. +// AlertRuleNoDataV2 is generated from the Flashduty OpenAPI schema. +type AlertRuleNoDataV2 struct { + // Whether to alert when all queries return empty results (global empty-result check). + AlertOnEmptyResult bool `json:"alert_on_empty_result,omitempty" toon:"alert_on_empty_result,omitempty"` + // Severity of empty-result alerts, case-sensitive; only takes effect and is required when `alert_on_empty_result` is on. + AlertOnEmptyResultSeverity string `json:"alert_on_empty_result_severity,omitempty" toon:"alert_on_empty_result_severity,omitempty"` + // Fire after the alert condition is met this many times; when enabled, minimum 1 and maximum 10000. Combined with `alerting_window_size` it means at least N hits within the last M evaluations. + AlertingCheckTimes int64 `json:"alerting_check_times,omitempty" toon:"alerting_check_times,omitempty"` + // Optional sliding window size M: fire only when the condition is met at least `alerting_check_times` times within the last M evaluations. Omit for consecutive mode. Must satisfy `alerting_check_times` <= M <= 10000. + AlertingWindowSize int64 `json:"alerting_window_size,omitempty" toon:"alerting_window_size,omitempty"` + // Seconds to wait before auto-closing. Allowed and required to be positive only when `end_mode` is `data_reappears_or_timeout`; must be 0 for the other modes. + AutoCloseAfterSeconds int64 `json:"auto_close_after_seconds,omitempty" toon:"auto_close_after_seconds,omitempty"` + // Whether the per-series no-data check is enabled: series that previously reported data trigger an alert when data disappears. + Enabled bool `json:"enabled,omitempty" toon:"enabled,omitempty"` + // How a no-data alert ends (lifecycle v2); required when enabled. `data_reappears` = recover when data reappears. `data_reappears_or_timeout` = end when data reappears or after `auto_close_after_seconds` seconds, whichever comes first; requires the per-series no-data check and a positive `auto_close_after_seconds`. `manual` = never end automatically; alerts need manual handling and no recovery event is pushed. For `data_reappears` and `manual`, `auto_close_after_seconds` must be 0. + EndMode string `json:"end_mode,omitempty" toon:"end_mode,omitempty"` + // Recover after the recovery condition is met this many times; minimum 1 when enabled. + RecoveryCheckTimes int64 `json:"recovery_check_times,omitempty" toon:"recovery_check_times,omitempty"` + // Severity of no-data alerts, case-sensitive; required when the per-series check is enabled. + Severity string `json:"severity,omitempty" toon:"severity,omitempty"` +} + +// AlertRuleRecoveryQueryV2 is generated from the Flashduty OpenAPI schema. +type AlertRuleRecoveryQueryV2 struct { + // Datasource-specific parameters for the recovery query; keys follow the same `.` convention as a query's `args`. Not returned when empty. + Args map[string]string `json:"args,omitempty" toon:"args,omitempty"` + // Recovery condition expression: a threshold expression (e.g. `$A < 90`) in `expression_match` mode, a query expression in `recovery_query_match` mode. Required and non-empty when the corresponding mode is enabled. + Expr string `json:"expr,omitempty" toon:"expr,omitempty"` + // Numeric result fields the recovery expression references as `$A.`; same semantics as a query's `value_fields`. Not returned when empty. + ValueFields []string `json:"value_fields,omitempty" toon:"value_fields,omitempty"` +} + +// AlertRuleThresholdV2 is generated from the Flashduty OpenAPI schema. +type AlertRuleThresholdV2 struct { + // Fire after the alert condition is met this many times; when enabled, minimum 1 and maximum 10000. Combined with `alerting_window_size` it means at least N hits within the last M evaluations. + AlertingCheckTimes int64 `json:"alerting_check_times,omitempty" toon:"alerting_check_times,omitempty"` + // Optional sliding window size M: fire only when the condition is met at least `alerting_check_times` times within the last M evaluations. Omit for consecutive mode (N consecutive hits). Must satisfy `alerting_check_times` <= M <= 10000. + AlertingWindowSize int64 `json:"alerting_window_size,omitempty" toon:"alerting_window_size,omitempty"` + // Critical threshold expression referencing query results as `$` or `$.`, e.g. `$A > 90`; when enabled at least one of the three severities must be set. + Critical string `json:"critical,omitempty" toon:"critical,omitempty"` + // Whether the threshold check is enabled. + Enabled bool `json:"enabled,omitempty" toon:"enabled,omitempty"` + // Info threshold expression; same syntax as `critical`. + Info string `json:"info,omitempty" toon:"info,omitempty"` + // Recovery evaluation config. Required (with non-empty `recovery.expr`) only when `recovery_mode` is `expression_match` or `recovery_query_match`; must be omitted for the other modes. + Recovery AlertRuleRecoveryQueryV2 `json:"recovery,omitzero" toon:"recovery,omitempty"` + // Recover after the recovery condition is met this many times; minimum 1 when enabled. + RecoveryCheckTimes int64 `json:"recovery_check_times,omitempty" toon:"recovery_check_times,omitempty"` + // How recovery is decided (lifecycle v2); required when enabled. `condition_clear` = recover once the alert expression no longer holds; `recovery` is not allowed. `expression_match` = recover when the `recovery.expr` threshold expression holds. `recovery_query_match` = recover when the `recovery.expr` query expression evaluates true. `manual` = never recover automatically; alerts need manual handling, no recovery event is pushed, and `recovery` is not allowed. + RecoveryMode string `json:"recovery_mode,omitempty" toon:"recovery_mode,omitempty"` + // Warning threshold expression; same syntax as `critical`. + Warning string `json:"warning,omitempty" toon:"warning,omitempty"` +} + +// AlertRuleV2 is generated from the Flashduty OpenAPI schema. +type AlertRuleV2 struct { + // Account ID, filled by the server from the authentication context; any client-supplied value is ignored. + AccountID uint64 `json:"account_id,omitempty" toon:"account_id,omitempty"` + // Extra annotation key-value pairs delivered with alert events; keys must not start with `$` (reserved for query fields). + Annotations map[string]string `json:"annotations,omitempty" toon:"annotations,omitempty"` + // Collaboration space IDs alerts are sent to. May be empty; alerts then route through the global integration. + ChannelIDs []uint64 `json:"channel_ids,omitempty" toon:"channel_ids,omitempty"` + // Creation time as a Unix timestamp in seconds, generated by the server; any client-supplied value is ignored. + CreatedAt int64 `json:"created_at,omitempty" toon:"created_at,omitempty"` + // Creator member ID, filled by the server from the current user; any client-supplied value is ignored. + CreatorID uint64 `json:"creator_id,omitempty" toon:"creator_id,omitempty"` + // Creator name, filled by the server; any client-supplied value is ignored. + CreatorName string `json:"creator_name,omitempty" toon:"creator_name,omitempty"` + // Schedule expression: a 6-field cron (with seconds) or an `@every 30s` interval. Must not start with `CRON_TZ=` or `TZ=`; set the timezone in the `timezone` field instead. CronPattern string `json:"cron_pattern" toon:"cron_pattern"` - // Whether to enable debug logging; the edge emits detailed evaluation logs, useful for troubleshooting rules that do not trigger as expected. - DebugLogEnabled bool `json:"debug_log_enabled" toon:"debug_log_enabled"` - // Seconds to shift the evaluation query window backward, compensating for data ingestion latency. - DelaySeconds int64 `json:"delay_seconds" toon:"delay_seconds"` - // Rule description, in Markdown. - Description string `json:"description" toon:"description"` - // Format for the description. Defaults to `text` when omitted or empty. `text` = plain text; `markdown` = Markdown, rendered as Markdown in alert details. - DescriptionType string `json:"description_type" toon:"description_type"` - // Datasource IDs, merged with `ds_list` to decide which datasources the rule monitors; IDs survive datasource renames. At least one of `ds_list` and `ds_ids` must be provided. - DsIDs []uint64 `json:"ds_ids" toon:"ds_ids"` - // Data source name patterns (supports wildcards). At least one of `ds_list` / `ds_ids` must be non-empty; the two are merged to decide which datasources the rule monitors. - DsList []string `json:"ds_list" toon:"ds_list"` - // Datasource type identifier; allowed values are listed by `POST /monit/rule/dstypes` (e.g. `prometheus`, `elasticsearch`). + // Enable debug logging; the edge then emits detailed evaluation logs for this rule, useful when the rule does not trigger as expected. + DebugLogEnabled bool `json:"debug_log_enabled,omitempty" toon:"debug_log_enabled,omitempty"` + // Seconds the evaluation query window is shifted back, compensating for data ingestion latency. + DelaySeconds int64 `json:"delay_seconds,omitempty" toon:"delay_seconds,omitempty"` + // Rule description, Markdown format. + Description string `json:"description,omitempty" toon:"description,omitempty"` + // Format of the description content. Empty or omitted defaults to `text`. `text` = plain text; `markdown` = Markdown, rendered as such in alert details. + DescriptionType string `json:"description_type,omitempty" toon:"description_type,omitempty"` + // Datasource ID list, merged with `ds_list` to decide the monitored datasources; IDs survive datasource renames. At least one of `ds_list` / `ds_ids` must be provided. + DsIDs []uint64 `json:"ds_ids,omitempty" toon:"ds_ids,omitempty"` + // Datasource name match patterns (wildcards supported). At least one of `ds_list` / `ds_ids` must be non-empty; both are merged to decide which datasources the rule monitors. + DsList []string `json:"ds_list,omitempty" toon:"ds_list,omitempty"` + // Datasource type identifier (e.g. `prometheus`, `elasticsearch`). DsType string `json:"ds_type" toon:"ds_type"` - // Whether the rule is enabled. Updating to `false` makes the server clean up the rule's active alerts. + // Whether the rule is enabled. Required — the server enforces an explicit value (including `false`) while decoding. Setting it to `false` on update clears the rule's active alerts. Enabled bool `json:"enabled" toon:"enabled"` - // Time windows when the rule is active. Defaults to all days from 00:00 to 23:59 when omitted or empty. - EnabledTimes []AlertRuleInfoResponseEnabledTimesItem `json:"enabled_times" toon:"enabled_times"` - // ID of the folder the rule belongs to. Obtainable via `POST /monit/folder/list`. + // Time windows during which the rule is in effect. When omitted or empty, the rule is active 00:00–23:59 every day. + EnabledTimes []AlertRuleV2EnabledTimesItem `json:"enabled_times,omitempty" toon:"enabled_times,omitempty"` + // ID of the folder the rule belongs to; list folders via `POST /monit/folder/list`. Cannot be changed through the update API — use `/monit/rule/move` instead. FolderID uint64 `json:"folder_id" toon:"folder_id"` - // Rule ID. Required for update; omit for create (assigned by the server). - ID uint64 `json:"id" toon:"id"` + // Rule ID. Required on update; omit on create (assigned by the server). + ID uint64 `json:"id,omitempty" toon:"id,omitempty"` + // Drill-down entries linked from the alert event detail page; at most 20 items, duplicates rejected. On update the field is presence-based: omit it to keep the current value, pass `[]` to clear. + InvestigationTargets []InvestigationTarget `json:"investigation_targets,omitzero" toon:"investigation_targets,omitempty"` // Custom labels. - Labels map[string]string `json:"labels" toon:"labels"` - // Rule name. Must be unique within the same folder. + Labels map[string]string `json:"labels,omitempty" toon:"labels,omitempty"` + // Rule name. Must be unique within the folder and at most 128 characters. Name string `json:"name" toon:"name"` - // Notification repeat interval in seconds. - RepeatInterval int64 `json:"repeat_interval" toon:"repeat_interval"` - // Max number of repeat notifications. - RepeatTotal int64 `json:"repeat_total" toon:"repeat_total"` - // Check configuration: query list plus trigger/recovery conditions. Structure see `RuleConfigs`. - RuleConfigs RuleConfigs `json:"rule_configs" toon:"rule_configs"` - // Timezone in which the rule executes. Determines how the cron schedule and effective time windows are interpreted. Only IANA timezone names are accepted (e.g. `Asia/Shanghai`, `UTC`, `Europe/London`); shortcuts and offsets such as `Local`, `UTC+8`, or `CST` are rejected. Treated as `Asia/Shanghai` if empty. - Timezone string `json:"timezone" toon:"timezone"` - // Last update time as a Unix timestamp in seconds. Generated by the server; do not provide. - UpdatedAt Timestamp `json:"updated_at" toon:"updated_at"` - // Last updater user ID. Filled by the server; do not provide. - UpdaterID uint64 `json:"updater_id" toon:"updater_id"` - // Last updater name. Filled by the server; do not provide. - UpdaterName string `json:"updater_name" toon:"updater_name"` + // Notification repeat interval in seconds. Values below 1 fall back to the default 3600. + RepeatInterval int64 `json:"repeat_interval,omitempty" toon:"repeat_interval,omitempty"` + // Maximum number of repeat notifications. Values below 1 fall back to the default 3. + RepeatTotal int64 `json:"repeat_total,omitempty" toon:"repeat_total,omitempty"` + // Detection configuration: query list plus trigger/recovery conditions. See `AlertRuleConfigsV2`. + RuleConfigs AlertRuleConfigsV2 `json:"rule_configs" toon:"rule_configs"` + // Timezone the rule runs in; it decides how the cron schedule and enabled time windows are interpreted. Only IANA names are accepted (e.g. `Asia/Shanghai`, `UTC`, `Europe/London`); abbreviations or offsets like `Local`, `UTC+8`, `CST` are rejected. Empty falls back to `Asia/Shanghai`. + Timezone string `json:"timezone,omitempty" toon:"timezone,omitempty"` + // Last update time as a Unix timestamp in seconds, generated by the server; any client-supplied value is ignored. + UpdatedAt int64 `json:"updated_at,omitempty" toon:"updated_at,omitempty"` + // ID of the member who last updated the rule, filled by the server; any client-supplied value is ignored. + UpdaterID uint64 `json:"updater_id,omitempty" toon:"updater_id,omitempty"` + // Name of the member who last updated the rule, filled by the server; any client-supplied value is ignored. + UpdaterName string `json:"updater_name,omitempty" toon:"updater_name,omitempty"` } // AlertShort is generated from the Flashduty OpenAPI schema. @@ -2615,20 +2697,6 @@ type DsTencentClsConfig struct { SecretKey string `json:"secret_key,omitempty" toon:"secret_key,omitempty"` } -// DsType is generated from the Flashduty OpenAPI schema. -type DsType struct { - // Owning account ID. `0` for global types. - AccountID uint64 `json:"account_id" toon:"account_id"` - // ID of the datasource type record. - ID uint64 `json:"id" toon:"id"` - // Identifier used as the `ds_type` of rules, e.g. `prometheus`. - Ident string `json:"ident" toon:"ident"` - // Display name, e.g. `Prometheus`. - Name string `json:"name" toon:"name"` - // Display order weight; higher appears first. - Weight int64 `json:"weight" toon:"weight"` -} - // DsVictoriaLogsConfig is generated from the Flashduty OpenAPI schema. type DsVictoriaLogsConfig struct { // Whether HTTP Basic Auth is enabled; when `false`, `basic_auth_username`/`basic_auth_password` are ignored. @@ -2657,6 +2725,16 @@ type DsVictoriaLogsConfig struct { TlsSkipVerify bool `json:"tls_skip_verify,omitempty" toon:"tls_skip_verify,omitempty"` } +// DashboardInvestigationTarget is generated from the Flashduty OpenAPI schema. +type DashboardInvestigationTarget struct { + // Target dashboard ID; must be a canonical UUIDv7. + DashboardID string `json:"dashboard_id" toon:"dashboard_id"` + // Panel ID inside the dashboard; must be a canonical UUIDv7. Optional. + TargetID string `json:"target_id,omitempty" toon:"target_id,omitempty"` + // Dashboard variable bindings, keyed by dashboard variable name. + VariableBindings map[string]InvestigationVariableBinding `json:"variable_bindings,omitempty" toon:"variable_bindings,omitempty"` +} + // DataSourceItem is generated from the Flashduty OpenAPI schema. type DataSourceItem struct { // Account ID. @@ -3750,6 +3828,21 @@ type Flapping struct { MuteMins int64 `json:"mute_mins,omitempty" toon:"mute_mins,omitempty"` } +// GetRemoteConfigRequest is generated from the Flashduty OpenAPI schema. +type GetRemoteConfigRequest struct { + // RUM application ID. + ApplicationID string `json:"application_id" toon:"application_id"` +} + +// GetRemoteConfigResponse is generated from the Flashduty OpenAPI schema. +type GetRemoteConfigResponse struct { + Config RemoteConfig `json:"config" toon:"config"` + // Unix timestamp in milliseconds - when the current version was published. 0 when never configured. + UpdatedAt TimestampMilli `json:"updated_at" toon:"updated_at"` + // Version the live configuration is stored under. 0 means the application has never been configured. + Version int64 `json:"version" toon:"version"` +} + // GetWarRoomDefaultObserversRequest is generated from the Flashduty OpenAPI schema. type GetWarRoomDefaultObserversRequest struct { // Incident ID, a MongoDB ObjectID hex string. @@ -4418,6 +4511,22 @@ type InsightTopkAlertByLabelRequest struct { TimeZone string `json:"time_zone,omitempty" toon:"time_zone,omitempty"` } +// InvestigationTarget is generated from the Flashduty OpenAPI schema. +type InvestigationTarget struct { + // Configuration for the `dashboard` kind; required when `kind` is `dashboard`. + Dashboard DashboardInvestigationTarget `json:"dashboard,omitzero" toon:"dashboard,omitempty"` + // Entry type; currently only `dashboard` is supported. + Kind string `json:"kind" toon:"kind"` +} + +// InvestigationVariableBinding is generated from the Flashduty OpenAPI schema. +type InvestigationVariableBinding struct { + // Alert event label name; must follow Prometheus label naming rules and must not be a reserved label. + Key string `json:"key" toon:"key"` + // Where the bound value comes from; currently only `event_label` (the alert event's label value) is supported. + Source string `json:"source" toon:"source"` +} + // InviteMemberItem is generated from the Flashduty OpenAPI schema. type InviteMemberItem struct { // ISO 3166-1 alpha-2 region code for `phone` (e.g. "CN"). Validated and normalized to upper case before storage; invalid values are rejected with a 400. Also the parsing hint when `phone` has no "+" prefix (defaults to "CN"). @@ -4912,6 +5021,27 @@ type ListPostMortemsResponse struct { Total int64 `json:"total" toon:"total"` } +// ListRemoteConfigHistoryRequest is generated from the Flashduty OpenAPI schema. +type ListRemoteConfigHistoryRequest struct { + ListOptions + // RUM application ID. + ApplicationID string `json:"application_id" toon:"application_id"` + // Ascending order. Default: false (descending). + Asc bool `json:"asc,omitempty" toon:"asc,omitempty"` + // Sort field. Default: `updated_at`. + Orderby string `json:"orderby,omitempty" toon:"orderby,omitempty"` +} + +// ListRemoteConfigHistoryResponse is generated from the Flashduty OpenAPI schema. +type ListRemoteConfigHistoryResponse struct { + // Whether more pages remain. + HasNextPage bool `json:"has_next_page" toon:"has_next_page"` + // Version items, newest first by default. + Items []RemoteConfigHistoryItem `json:"items" toon:"items"` + // Total number of versions. + Total int64 `json:"total" toon:"total"` +} + // ListRoutesRequest is generated from the Flashduty OpenAPI schema. type ListRoutesRequest struct { // Integration IDs to fetch routing rules for. @@ -5563,6 +5693,8 @@ type MemberListRequest struct { ListOptions // Ascending order. Default: false (descending) Asc bool `json:"asc,omitempty" toon:"asc,omitempty"` + // Filter by member ID. Return only the member with this ID. + MemberID uint64 `json:"member_id,omitempty" toon:"member_id,omitempty"` // Sort field. Default: `updated_at` Orderby string `json:"orderby,omitempty" toon:"orderby,omitempty"` // Substring match on member name or email; if the keyword parses as a phone number, an exact phone match is also applied @@ -5580,6 +5712,18 @@ type MemberListResponse struct { Total int64 `json:"total" toon:"total"` } +// MemberOncallInterval is generated from the Flashduty OpenAPI schema. +type MemberOncallInterval struct { + // Unix timestamp in seconds - when the shift ends. Absent while the shift is ongoing. + EndAt Timestamp `json:"end_at" toon:"end_at"` + // Owning schedule ID. + ScheduleID int64 `json:"schedule_id" toon:"schedule_id"` + // Owning schedule name. + ScheduleName string `json:"schedule_name" toon:"schedule_name"` + // Unix timestamp in seconds - when the shift starts. + StartAt Timestamp `json:"start_at" toon:"start_at"` +} + // MemberResetInfoRequest is generated from the Flashduty OpenAPI schema. type MemberResetInfoRequest struct { // Region hint for parsing `phone` when it has no "+" prefix — an ISO 3166-1 alpha-2 code such as "CN" (the default when omitted). Legacy digit calling codes like "86" are still accepted in this parsing context. @@ -5646,6 +5790,14 @@ type MemberRoleUpdateRequest struct { RoleIDs []uint64 `json:"role_ids,omitempty" toon:"role_ids,omitempty"` } +// MemberScheduleItem is generated from the Flashduty OpenAPI schema. +type MemberScheduleItem struct { + // Schedule ID. + ScheduleID int64 `json:"schedule_id" toon:"schedule_id"` + // Schedule name. + ScheduleName string `json:"schedule_name" toon:"schedule_name"` +} + // MergeIncidentsRequest is generated from the Flashduty OpenAPI schema. type MergeIncidentsRequest struct { // Optional comment recorded on the merge timeline entry. @@ -6118,6 +6270,26 @@ type PreviewIncidentCardFixedField struct { Value string `json:"value" toon:"value"` } +// PreviewRemoteConfigRequest is generated from the Flashduty OpenAPI schema. +type PreviewRemoteConfigRequest struct { + // App version the simulated client reports. + AppVersion string `json:"app_version,omitempty" toon:"app_version,omitempty"` + // RUM application ID. + ApplicationID string `json:"application_id" toon:"application_id"` + Config RemoteConfig `json:"config,omitzero" toon:"config,omitempty"` + // Environment the simulated client reports. + Env string `json:"env,omitempty" toon:"env,omitempty"` + // SDK name and version the simulated client reports, e.g. `web@2.4.1`. + Sdk string `json:"sdk,omitempty" toon:"sdk,omitempty"` +} + +// PreviewRemoteConfigResponse is generated from the Flashduty OpenAPI schema. +type PreviewRemoteConfigResponse struct { + // 0-based index of the rule that decided the result, or -1 when only the default applied. + HitRuleIndex int64 `json:"hit_rule_index" toon:"hit_rule_index"` + Values RemoteConfigValues `json:"values" toon:"values"` +} + // PreviewTemplateRequest is generated from the Flashduty OpenAPI schema. type PreviewTemplateRequest struct { // Template content to render. @@ -6291,6 +6463,59 @@ type QuerySamplesResult struct { Samples []QuerySample `json:"samples" toon:"samples"` } +// RemoteConfig is generated from the Flashduty OpenAPI schema. +type RemoteConfig struct { + // How a change lands on a client that is already running: `next_session` (the default, and what an empty value means) leaves running sessions untouched and applies the change to new sessions; `immediate` ends the running session as soon as the change arrives so a new session starts under the new configuration. + Activation string `json:"activation,omitempty" toon:"activation,omitempty"` + // Application-defined pass-through values handed to the host app verbatim. At most 5 keys, each key up to 64 bytes, each value up to 4 KB of JSON nested at most 3 levels, 16 KB in total. Anyone holding the public client token can read it. + Custom map[string]any `json:"custom,omitempty" toon:"custom,omitempty"` + Default RemoteConfigValues `json:"default,omitzero" toon:"default,omitempty"` + // Kill switch. When false the engine reports no values at all and SDKs fall back to their init values. + Enabled bool `json:"enabled,omitempty" toon:"enabled,omitempty"` + // Let clients re-check the configuration when they return to the foreground instead of waiting for the next poll. + RefreshOnForeground bool `json:"refresh_on_foreground,omitempty" toon:"refresh_on_foreground,omitempty"` + // Targeting rules, evaluated in order; at most 20 per application. + Rules []RemoteConfigRule `json:"rules,omitempty" toon:"rules,omitempty"` +} + +// RemoteConfigHistoryItem is generated from the Flashduty OpenAPI schema. +type RemoteConfigHistoryItem struct { + Config RemoteConfig `json:"config" toon:"config"` + // Hash of the configuration content; lets the console identify versions with identical content. + ContentHash string `json:"content_hash" toon:"content_hash"` + // Earliest version carrying the same content, when that is not this version itself. + EquivalentTo int64 `json:"equivalent_to" toon:"equivalent_to"` + // Operator's note left when the version was published. Empty when none was given. + Reason string `json:"reason" toon:"reason"` + // Unix timestamp in milliseconds - when the version was published. + UpdatedAt TimestampMilli `json:"updated_at" toon:"updated_at"` + // ID of the member who published the version. + UpdatedBy int64 `json:"updated_by" toon:"updated_by"` + // Name of the member who published the version. + UpdatedByName string `json:"updated_by_name" toon:"updated_by_name"` + // Version number, unique within the application. + Version int64 `json:"version" toon:"version"` +} + +// RemoteConfigRule is generated from the Flashduty OpenAPI schema. +type RemoteConfigRule struct { + // Key/value conditions the SDK's config request must equal. Keys are limited to `env`, `app_version` and `sdk`; values are at most 256 bytes. + Match map[string]string `json:"match" toon:"match"` + Set RemoteConfigValues `json:"set" toon:"set"` +} + +// RemoteConfigValues is generated from the Flashduty OpenAPI schema. +type RemoteConfigValues struct { + // How Session Replay masks a page by default. + DefaultPrivacyLevel *string `json:"defaultPrivacyLevel,omitempty" toon:"defaultPrivacyLevel,omitempty"` + // Session Replay sampling rate (0-100). + SessionReplaySampleRate *int64 `json:"sessionReplaySampleRate,omitempty" toon:"sessionReplaySampleRate,omitempty"` + // Session sampling rate (0-100). + SessionSampleRate *int64 `json:"sessionSampleRate,omitempty" toon:"sessionSampleRate,omitempty"` + // Trace sampling rate (0-100): which sessions inject trace headers into their requests. + TraceSampleRate *int64 `json:"traceSampleRate,omitempty" toon:"traceSampleRate,omitempty"` +} + // RemoveIncidentRequest is generated from the Flashduty OpenAPI schema. type RemoveIncidentRequest struct { // Incident IDs to remove. At most 100 per call. The caller must have access to every channel the incidents belong to. @@ -6476,6 +6701,22 @@ type ResponseEnvelope struct { RequestID string `json:"request_id" toon:"request_id"` } +// RevertRemoteConfigRequest is generated from the Flashduty OpenAPI schema. +type RevertRemoteConfigRequest struct { + // RUM application ID. + ApplicationID string `json:"application_id" toon:"application_id"` + // Operator's note. The console fills in `rolled back to vN` when left empty. + Reason string `json:"reason,omitempty" toon:"reason,omitempty"` + // History version to republish. + Version int64 `json:"version" toon:"version"` +} + +// RevertRemoteConfigResponse is generated from the Flashduty OpenAPI schema. +type RevertRemoteConfigResponse struct { + // New version number created by the revert. + Version int64 `json:"version" toon:"version"` +} + // RoleDeleteRequest is generated from the Flashduty OpenAPI schema. type RoleDeleteRequest struct { // When false (default), deletion fails with a `ReferenceExist` error listing the members that still hold the role in `data.refs`. When true, the role is first revoked from all holders and then deleted. @@ -6693,7 +6934,7 @@ type RuleFieldsUpdateRequest struct { DsIDs []uint64 `json:"ds_ids,omitempty" toon:"ds_ids,omitempty"` // Datasource name match patterns; wildcards supported. Effective only when `fields` includes `ds_list`. DsList []string `json:"ds_list,omitempty" toon:"ds_list,omitempty"` - // Datasource type identifier; allowed values are listed by `POST /monit/rule/dstypes`. Effective only when `fields` includes `ds_type`. + // Datasource type identifier. Effective only when `fields` includes `ds_type`. DsType string `json:"ds_type,omitempty" toon:"ds_type,omitempty"` // Whether the rule is enabled. Setting it to `false` makes the server clean up the rule's active alerts. Effective only when `fields` includes `enabled`. Enabled bool `json:"enabled,omitempty" toon:"enabled,omitempty"` @@ -8032,6 +8273,20 @@ type SLSProjectsResponse struct { Total int64 `json:"total" toon:"total"` } +// ScheduleByPersonRequest is generated from the Flashduty OpenAPI schema. +type ScheduleByPersonRequest struct { + // Member ID whose on-call status is returned. + PersonID int64 `json:"person_id" toon:"person_id"` +} + +// ScheduleByPersonResponse is generated from the Flashduty OpenAPI schema. +type ScheduleByPersonResponse struct { + Current MemberOncallInterval `json:"current" toon:"current"` + Next MemberOncallInterval `json:"next" toon:"next"` + // All enabled schedules the member participates in. + Schedules []MemberScheduleItem `json:"schedules" toon:"schedules"` +} + // ScheduleCalculatedLayer is generated from the Flashduty OpenAPI schema. type ScheduleCalculatedLayer struct { // Layer display name. @@ -9825,6 +10080,21 @@ type UpdateInhibitRuleRequest struct { TargetFilters FilterGroup `json:"target_filters,omitempty" toon:"target_filters,omitempty"` } +// UpdateRemoteConfigRequest is generated from the Flashduty OpenAPI schema. +type UpdateRemoteConfigRequest struct { + // RUM application ID. + ApplicationID string `json:"application_id" toon:"application_id"` + Config RemoteConfig `json:"config" toon:"config"` + // Operator's note on why this version was published. Stored verbatim. + Reason string `json:"reason,omitempty" toon:"reason,omitempty"` +} + +// UpdateRemoteConfigResponse is generated from the Flashduty OpenAPI schema. +type UpdateRemoteConfigResponse struct { + // New published version number. + Version int64 `json:"version" toon:"version"` +} + // UpdateSilenceRuleRequest is generated from the Flashduty OpenAPI schema. type UpdateSilenceRuleRequest struct { // Owning channel ID; obtain it from `POST /channel/list`. @@ -10291,14 +10561,38 @@ type AlertRuleEnabledTimesItem struct { Stime string `json:"stime,omitempty" toon:"stime,omitempty"` } -// AlertRuleInfoResponseEnabledTimesItem is generated from the Flashduty OpenAPI schema. -type AlertRuleInfoResponseEnabledTimesItem struct { +// AlertRuleConfigsV2QueriesItem is generated from the Flashduty OpenAPI schema. +type AlertRuleConfigsV2QueriesItem struct { + // Datasource-specific query parameters; keys follow the `.` convention (e.g. `es.type`, `tencent_cls.limit`). Most datasources need none. + Args map[string]string `json:"args,omitempty" toon:"args,omitempty"` + // Query expression. + Expr string `json:"expr,omitempty" toon:"expr,omitempty"` + // Result fields used as alert event labels; rows with the same label set form one alert. Must not overlap `value_fields`; applies to tabular results (SQL/ES-like datasources). + LabelFields []string `json:"label_fields,omitempty" toon:"label_fields,omitempty"` + // Query identifier (e.g. `A`), must match `[A-Za-z][A-Za-z0-9_]*`; `R` and `__all__` are reserved and cannot be used. + Name string `json:"name,omitempty" toon:"name,omitempty"` + // Numeric result fields evaluated by threshold expressions (referenced as `$A.`); required for threshold checks when the datasource is not `prometheus`/`loki`/`victorialogs`. Field names must not contain `.`. + ValueFields []string `json:"value_fields,omitempty" toon:"value_fields,omitempty"` +} + +// AlertRuleConfigsV2RelateQueriesItem is generated from the Flashduty OpenAPI schema. +type AlertRuleConfigsV2RelateQueriesItem struct { + // Datasource-specific parameters for the auxiliary query; same convention as `queries[].args`. + Args map[string]string `json:"args,omitempty" toon:"args,omitempty"` + // Query expression. + Expr string `json:"expr,omitempty" toon:"expr,omitempty"` + // Auxiliary query identifier. + Name string `json:"name,omitempty" toon:"name,omitempty"` +} + +// AlertRuleV2EnabledTimesItem is generated from the Flashduty OpenAPI schema. +type AlertRuleV2EnabledTimesItem struct { // Days of week (0=Sunday). - Days []int64 `json:"days" toon:"days"` + Days []int64 `json:"days,omitempty" toon:"days,omitempty"` // End time, e.g. `18:00`. - Etime string `json:"etime" toon:"etime"` + Etime string `json:"etime,omitempty" toon:"etime,omitempty"` // Start time, e.g. `09:00`. - Stime string `json:"stime" toon:"stime"` + Stime string `json:"stime,omitempty" toon:"stime,omitempty"` } // AssignedToNotify is generated from the Flashduty OpenAPI schema. diff --git a/openapi/openapi.en.json b/openapi/openapi.en.json index dd12d27..f49bc25 100644 --- a/openapi/openapi.en.json +++ b/openapi/openapi.en.json @@ -1,57774 +1,59270 @@ { - "openapi": "3.1.0", - "info": { - "title": "Flashduty Open API", - "description": "Public HTTP API for the Flashduty incident management platform — incidents, notification templates, channels, schedules, monitors, RUM, and platform administration. Every operation is authenticated with an `app_key` query parameter issued from the Flashduty console under Account → APP Keys. Responses follow a uniform envelope: `{ request_id, data }` on success, `{ request_id, error }` on failure.", - "version": "1.0.0" - }, - "servers": [ - { - "url": "https://api.flashcat.cloud", - "description": "Flashduty Open API" - } - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "tags": [ - { - "name": "On-call/Incidents", - "description": "" - }, - { - "name": "On-call/Channels", - "description": "" - }, - { - "name": "On-call/Alerts", - "description": "Search, inspect, and act on alerts. Manage card views and alert processing pipelines." - }, - { - "name": "On-call/Integrations", - "description": "" - }, - { - "name": "On-call/IM integrations", - "description": "IM integration queries, such as which integrations have war room enabled." - }, - { - "name": "On-call/Schedules", - "description": "" - }, - { - "name": "On-call/Licenses", - "description": "" - }, - { - "name": "On-call/Calendars", - "description": "" - }, - { - "name": "On-call/Notification templates", - "description": "" - }, - { - "name": "On-call/Alert enrichment", - "description": "Custom fields, enrichment rules, and data mapping (schema, data, API)." - }, - { - "name": "On-call/Analytics", - "description": "" - }, - { - "name": "On-call/Status pages", - "description": "" - }, - { - "name": "Monitors/Alert rules", - "description": "Create, manage, and export monitor alert rules. Query rule counters and audit history." - }, - { - "name": "Monitors/Data sources", - "description": "Manage monitoring data sources used by alert rules to query metrics." - }, - { - "name": "Platform/Members", - "description": "" - }, - { - "name": "Platform/Teams", - "description": "" - }, - { - "name": "Platform/Roles & permissions", - "description": "" - }, - { - "name": "Platform/Audit logs", - "description": "Search and retrieve account operation audit logs." - }, - { - "name": "Monitors/Diagnostics", - "description": "Diagnostic and query endpoints used by Flashduty AI SRE — ad-hoc data source queries, log/metric diagnostics, and target-side tool invocation." - }, - { - "name": "Platform/Account", - "description": "Account profile and settings" - }, - { - "name": "AI SRE/MCP servers", - "description": "MCP (Model Context Protocol) server management." - }, - { - "name": "AI SRE/A2A agents", - "description": "A2A (agent-to-agent) remote agent management." - }, - { - "name": "On-call/Changes", - "description": "" - }, - { - "name": "AI SRE/Skills", - "description": "AI SRE agent skill management." - }, - { - "name": "AI SRE/Sessions", - "description": "AI SRE agent session history — list, inspect, and export transcripts." - }, - { - "name": "Monitors/Monitor utilities", - "description": "Monitors service activation and data preview utilities." - }, - { - "name": "AI SRE/Automations" - }, - { - "name": "RUM/Applications", - "description": "Manage Real User Monitoring (RUM) applications." - }, - { - "name": "RUM/Data query", - "description": "Run RUM analytics queries over event data." - }, - { - "name": "RUM/Issues", - "description": "Query and manage RUM error tracking issues and preset severity rules." - }, - { - "name": "RUM/Facets", - "description": "Query RUM facet fields and their value distributions for building analytics filters." - }, - { - "name": "RUM/Sourcemaps", - "description": "Manage and query RUM sourcemap files for browser, Android, and iOS error symbolication." - }, - { - "name": "RUM/Session replay", - "description": "Retrieve session replay metadata and recorded segments for RUM sessions." - }, - { - "name": "RUM/Error ingestion rules", - "description": "Configure and inspect the rules that decide which RUM errors get ingested and stored for an application, including their edit history." - }, - { - "name": "RUM/Issue preset severity rules", - "description": "Manage per-application rules that assign a severity to matching front-end errors, plus their evaluation order and change history." - }, - { - "name": "RUM/Resources", - "description": "Query the RUM resource record and current usage for the account." - }, - { - "name": "AI SRE/Knowledge" - }, - { - "name": "AI SRE/Artifacts", - "description": "AI SRE artifact gallery — publish, browse, and publicly share agent-produced files." - } - ], - "paths": { - "/incident/list": { - "post": { - "operationId": "incidentList", - "summary": "List incidents", - "description": "Query a paginated list of incidents with filters by channel, severity, status, responder, and time range.", - "tags": [ - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-list", - "metadata": { - "sidebarTitle": "List incidents" + "components": { + "responses": { + "BadRequest": { + "content": { + "application/json": { + "examples": { + "missingParameter": { + "value": { + "error": { + "code": "InvalidParameter", + "message": "The specified parameter is not valid." + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" + } + } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/IncidentListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 88, - "has_next_page": true, - "search_after_ctx": "69da451ef77b1b51f40e83eb", - "items": [ - { - "incident_id": "69da451ef77b1b51f40e83ee", - "account_id": 2451002751131, - "channel_id": 2551105804131, - "team_id": 2477033058131, - "integration_id": 2490562293131, - "integration_ids": [ - 2490562293131 - ], - "integration_types": [ - "monit.alert" - ], - "dedup_key": "100128:prom-203.0.113.107:A:1579244238440766834:anydata", - "equals_md5": "", - "start_time": 1775912219, - "end_time": 0, - "last_time": 1775969819, - "ack_time": 0, - "close_time": 0, - "creator_id": 0, - "closer_id": 0, - "owner_id": 0, - "incident_status": "Critical", - "incident_severity": "Critical", - "progress": "Triggered", - "title": "CPU usage high - web-server-01", - "description": "", - "ai_summary": "", - "impact": "", - "root_cause": "", - "resolution": "", - "num": "0E83EE", - "frequency": "frequent", - "created_at": 1775912222, - "updated_at": 1775972145, - "snoozed_before": 0, - "group_method": "n", - "ever_muted": false, - "labels": { - "check": "cpu_usage_high", - "resource": "web-server-01", - "env": "production" - }, - "fields": {}, - "assigned_to": { - "person_ids": [ - 2476444212131 - ], - "escalate_rule_id": "000000000000000000000000", - "layer_idx": 0, - "type": "assign", - "assigned_at": 1775972128, - "id": "MvQfH9Dc8eNS8k79jmrWn6", - "escalate_rule_name": "" - }, - "alert_cnt": 1, - "active_alert_cnt": 1, - "alert_event_cnt": 17, - "responders": [ - { - "person_id": 2476444212131, - "assigned_at": 1775972128, - "acknowledged_at": 0 - } - ], - "account_name": "", - "account_locale": "", - "account_time_zone": "", - "channel_name": "Ops Channel", - "channel_status": "enabled", - "detail_url": "https://app.flashcat.cloud/incident/detail/69da451ef77b1b51f40e83ee", - "silence_url": "https://app.flashcat.cloud/channel/detail/2551105804131?tab=alertSuppression&fromIncidentId=69da451ef77b1b51f40e83ee", - "integration_type": "monit.alert", - "post_mortem_id": "", - "images": null, - "manual_overrides": [ - "title" - ] - } - ] - } + "description": "Invalid request — usually a missing or malformed parameter." + }, + "Forbidden": { + "content": { + "application/json": { + "examples": { + "noEditPermission": { + "value": { + "error": { + "code": "AccessDenied", + "message": "Access Denied." + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" } } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListIncidentsRequest" - }, - "example": { - "start_time": 1711900800, - "end_time": 1712000000, - "progress": "Triggered,Processing", - "incident_severity": "Critical,Warning", - "channel_ids": [ - 2551105804131 - ], - "limit": 20, - "p": 1 + "description": "The app_key is valid but lacks permission for this operation." + }, + "NotFound": { + "content": { + "application/json": { + "examples": { + "resourceMissing": { + "value": { + "error": { + "code": "ResourceNotFound", + "message": "The resource you request is not found" + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" + } } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } - } - } - }, - "/incident/sdp/request/list": { - "post": { - "operationId": "incident-service-desk-plus-request-read-list", - "summary": "Get ServiceDeskPlus linked incidents", - "description": "List synchronization mappings between ServiceDeskPlus requests and Flashduty incidents.", - "tags": [ - "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** (`on-call`) |\n\n## Usage\n\n- Use this endpoint to inspect synchronization mappings between ServiceDeskPlus requests and Flashduty incidents, including the external request link and sync status.\n- When `incident_id` is not provided, `start_time` and `end_time` are required Unix-second timestamps; the time window cannot exceed 30 days.\n- `status` accepts only `success` and `failed`, representing successful and failed synchronization records.\n- Results are sorted by the internal record ID. Set `asc` to `true` for ascending order; otherwise records are returned descending. Pass the returned `search_after_ctx` to continue pagination.", - "href": "/en/api-reference/on-call/incidents/incident-service-desk-plus-request-read-list", - "metadata": { - "sidebarTitle": "Get ServiceDeskPlus linked incidents" + }, + "description": "The referenced resource does not exist or has been deleted. Note: Flashduty historically returns HTTP 400 with code `ResourceNotFound` for missing domain entities; a true 404 is reserved for unknown routes." + }, + "ServerError": { + "content": { + "application/json": { + "examples": { + "internal": { + "value": { + "error": { + "code": "InternalError", + "message": "We encountered an internal error, and it has been reported. Please try again later." + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" + } + } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ServiceDeskPlusRequestListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "created_at": 1779514631, - "status": "success", - "request_id": "100000000001", - "request_link": "https://servicedesk.example.com/app/itdesk/ui/requests/100000000001/details", - "integration_id": 98765, - "incident_id": "685d7f4e51b9a9a6d4d0c123", - "incident_title": "Checkout API 5xx rate increased", - "channel_id": 12345, - "channel_name": "Payments" - } - ], - "total": 1, - "has_next_page": false, - "search_after_ctx": "" - } + "description": "Unexpected server-side error. Include the request_id when reporting." + }, + "ServiceUnavailable": { + "content": { + "application/json": { + "examples": { + "serviceUnavailable": { + "value": { + "error": { + "code": "ServiceUnavailable", + "message": "service temporarily unavailable" + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" } } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ServiceDeskPlusRequestListRequest" - }, - "example": { - "start_time": 1779513600, - "end_time": 1779600000, - "status": "success", - "channel_ids": [ - 12345 - ], - "limit": 20 + "description": "The service is temporarily unavailable. Include the request_id when reporting." + }, + "TooManyRequests": { + "content": { + "application/json": { + "examples": { + "rateLimited": { + "value": { + "error": { + "code": "RequestTooFrequently", + "message": "Request too frequently." + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" + } + } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Rate limit hit. Either the global API limit, a per-account limit, or a per-integration limit." + }, + "Unauthorized": { + "content": { + "application/json": { + "examples": { + "missingAppKey": { + "value": { + "error": { + "code": "Unauthorized", + "message": "You are unauthorized." + }, + "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4" + } } + }, + "schema": { + "$ref": "#/components/schemas/ErrorResponse" } } - } + }, + "description": "Missing or invalid app_key." } }, - "/incident/info": { - "post": { - "operationId": "incidentInfo", - "summary": "Get incident detail", - "description": "Retrieve detailed information for a single incident including timeline, alerts, responders and custom fields.", - "tags": [ - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-info", - "metadata": { - "sidebarTitle": "Get incident detail" + "schemas": { + "A2AAgentCreateRequest": { + "description": "Registration parameters for a new A2A agent.", + "properties": { + "agent_name": { + "description": "Agent display name.", + "maxLength": 128, + "type": "string" + }, + "allow_insecure_oauth_http": { + "description": "Allow non-loopback HTTP OAuth discovery/metadata endpoints for this agent instead of requiring HTTPS. Defaults to false.", + "type": "boolean" + }, + "allow_insecure_tls_skip_verify": { + "description": "Skip TLS certificate verification when connecting to this agent's endpoint (self-signed/private certs). Defaults to false.", + "type": "boolean" + }, + "auth_config": { + "additionalProperties": { + "type": "string" + }, + "description": "Authentication config key-values, e.g. the API key or bearer token. Values under credential-looking keys (name containing KEY, SECRET, TOKEN, PASSWORD, etc.) are masked back in responses.", + "type": "object" + }, + "auth_mode": { + "description": "Authentication mode: `shared` (default) shares one credential across all users; `per_user_secret` requires `secret_schema.header_name`; `per_user_oauth` runs per-user OAuth.", + "type": "string" + }, + "auth_type": { + "description": "Authentication type for reaching the remote agent: `none` (default when omitted), `api_key`, or `bearer`.", + "enum": [ + "none", + "api_key", + "bearer" + ], + "type": "string" + }, + "card_url": { + "description": "URL of the remote agent card. Must be an absolute `http` or `https` URL with a non-empty host; reachability is enforced by the execution environment, not at creation time.", + "type": "string" + }, + "environments": { + "description": "Execution environments this agent is callable from: `cloud` and/or BYOC runner environment IDs. Omitted or empty means all environments.", + "items": { + "type": "string" + }, + "type": "array" + }, + "instructions": { + "description": "Natural-language instructions for the remote agent: a Markdown document with optional `summary` frontmatter and a non-empty body, at most 50 KiB (51200 bytes). Required — a deprecated `description` field is still accepted for legacy clients and, if both are sent, must exactly match `instructions`.", + "maxLength": 51200, + "type": "string" + }, + "oauth_metadata": { + "description": "JSON-encoded OAuth metadata; populated by the OAuth discovery flow for `per_user_oauth` mode.", + "type": "string" + }, + "secret_schema": { + "description": "JSON-encoded secret schema, e.g. `{\"header_name\":\"X-Api-Key\"}`; required when `auth_mode=per_user_secret`.", + "type": "string" + }, + "streaming": { + "description": "Whether the remote agent supports streaming.", + "type": "boolean" + }, + "team_id": { + "description": "Team scope: 0 = account-wide; >0 = team. Creating at account scope requires the owner/admin role; creating into a team requires actual membership in that team.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/IncidentInfo" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "incident_id": "69da451ef77b1b51f40e83ee", - "account_id": 2451002751131, - "channel_id": 2551105804131, - "team_id": 2477033058131, - "integration_id": 2490562293131, - "integration_ids": [ - 2490562293131 - ], - "integration_types": [ - "monit.alert" - ], - "dedup_key": "100128:prom-203.0.113.107:A:1579244238440766834:anydata", - "equals_md5": "", - "start_time": 1775912219, - "end_time": 0, - "last_time": 1775969819, - "ack_time": 0, - "close_time": 0, - "creator_id": 0, - "closer_id": 0, - "owner_id": 0, - "incident_status": "Critical", - "incident_severity": "Critical", - "progress": "Triggered", - "title": "CPU usage high - web-server-01", - "description": "", - "ai_summary": "", - "impact": "", - "root_cause": "", - "resolution": "", - "num": "0E83EE", - "frequency": "frequent", - "created_at": 1775912222, - "updated_at": 1775972145, - "snoozed_before": 0, - "group_method": "n", - "ever_muted": false, - "labels": { - "check": "cpu_usage_high", - "resource": "web-server-01", - "env": "production" - }, - "fields": {}, - "assigned_to": { - "person_ids": [ - 2476444212131 - ], - "escalate_rule_id": "000000000000000000000000", - "layer_idx": 0, - "type": "assign", - "assigned_at": 1775972128, - "id": "MvQfH9Dc8eNS8k79jmrWn6", - "escalate_rule_name": "" - }, - "alert_cnt": 1, - "active_alert_cnt": 1, - "alert_event_cnt": 17, - "responders": [ - { - "person_id": 2476444212131, - "assigned_at": 1775972128, - "acknowledged_at": 0 - } - ], - "account_name": "", - "account_locale": "", - "account_time_zone": "", - "channel_name": "Ops Channel", - "channel_status": "enabled", - "detail_url": "https://app.flashcat.cloud/incident/detail/69da451ef77b1b51f40e83ee", - "silence_url": "https://app.flashcat.cloud/channel/detail/2551105804131?tab=alertSuppression&fromIncidentId=69da451ef77b1b51f40e83ee", - "integration_type": "monit.alert", - "post_mortem_id": "", - "images": null, - "manual_overrides": [ - "title" - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" + "required": [ + "agent_name", + "instructions", + "card_url" + ], + "type": "object" + }, + "A2AAgentCreateResponse": { + "description": "Result of registering an A2A agent.", + "properties": { + "agent_id": { + "description": "ID of the newly created agent.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/IncidentInfoRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee" - } - } - } - } - } - }, - "/incident/list-by-ids": { - "post": { - "operationId": "incidentListByIds", - "summary": "List incidents by IDs", - "description": "Retrieve multiple incidents by their IDs in a single request.", - "tags": [ - "On-call/Incidents" + "required": [ + "agent_id" ], - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-list-by-ids", - "metadata": { - "sidebarTitle": "List incidents by IDs" + "type": "object" + }, + "A2AAgentIDRequest": { + "description": "A2A agent lookup by ID.", + "properties": { + "agent_id": { + "description": "Target agent ID, from the list returned by `POST /safari/a2a-agent/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/IncidentListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 2, - "has_next_page": false, - "items": [ - { - "incident_id": "69da451ef77b1b51f40e83ee", - "account_id": 2451002751131, - "channel_id": 2551105804131, - "team_id": 2477033058131, - "integration_id": 2490562293131, - "integration_ids": [ - 2490562293131 - ], - "integration_types": [ - "monit.alert" - ], - "dedup_key": "100128:prom-203.0.113.107:A:1579244238440766834:anydata", - "equals_md5": "", - "start_time": 1775912219, - "end_time": 0, - "last_time": 1775969819, - "ack_time": 0, - "close_time": 0, - "creator_id": 0, - "closer_id": 0, - "owner_id": 0, - "incident_status": "Critical", - "incident_severity": "Critical", - "progress": "Triggered", - "title": "CPU usage high - web-server-01", - "description": "", - "ai_summary": "", - "impact": "", - "root_cause": "", - "resolution": "", - "num": "0E83EE", - "frequency": "frequent", - "created_at": 1775912222, - "updated_at": 1775972145, - "snoozed_before": 0, - "group_method": "n", - "ever_muted": false, - "labels": {}, - "fields": {}, - "assigned_to": { - "escalate_rule_id": "000000000000000000000000", - "layer_idx": 0, - "type": "", - "assigned_at": 0, - "id": "", - "escalate_rule_name": "" - }, - "alert_cnt": 1, - "active_alert_cnt": 1, - "alert_event_cnt": 17, - "responders": [], - "account_name": "", - "account_locale": "", - "account_time_zone": "", - "channel_name": "Ops Channel", - "channel_status": "enabled", - "detail_url": "https://app.flashcat.cloud/incident/detail/69da451ef77b1b51f40e83ee", - "silence_url": "https://app.flashcat.cloud/channel/detail/2551105804131?tab=alertSuppression&fromIncidentId=69da451ef77b1b51f40e83ee", - "integration_type": "monit.alert", - "post_mortem_id": "", - "images": null, - "manual_overrides": null - } - ] - } - } - } - } + "required": [ + "agent_id" + ], + "type": "object" + }, + "A2AAgentItem": { + "description": "A registered A2A (agent-to-agent) remote agent.", + "properties": { + "account_id": { + "description": "Owning account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "agent_card_name": { + "description": "Agent name resolved from the remote card. Omitted until the card has been fetched.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "agent_card_skills": { + "description": "Skills advertised by the remote card. Omitted until the card has been fetched.", + "items": { + "type": "string" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "agent_id": { + "description": "Unique A2A agent ID (prefix `a2a_`).", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListIncidentsByIdsRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee", - "69da451ef77b1b51f40e83ef" - ] - } - } - } - } - } - }, - "/incident/alert/list": { - "post": { - "operationId": "incidentAlertList", - "summary": "List alerts of incident", - "description": "List all alerts merged into a specific incident.", - "tags": [ - "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** (`on-call`) |\n\n## Usage\n\n- Set `include_events=true` only when you need a preview of each alert's raw events.\n- Event previews are capped at the 20 newest events per alert. Use `POST /alert/event/list` for a full paginated event history.\n- `event_cnt` still reports the total number of raw events merged into each alert.", - "href": "/en/api-reference/on-call/incidents/incident-alert-list", - "metadata": { - "sidebarTitle": "List alerts of incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListIncidentAlertsResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "items": [ - { - "alert_id": "69da451df77b1b51f40e83de", - "integration_id": 2490562293131, - "data_source_id": 2490562293131, - "channel_id": 2551105804131, - "account_id": 2451002751131, - "description": "", - "title": "CPU usage high - web-server-01", - "title_rule": "", - "alert_key": "100128:prom-203.0.113.107:A:1579244238440766834:anydata", - "alert_severity": "Critical", - "alert_status": "Critical", - "start_time": 1775912219, - "last_time": 1775969819, - "end_time": 0, - "labels": { - "check": "cpu_usage_high", - "resource": "web-server-01" - }, - "ever_muted": false, - "created_at": 1775912221, - "updated_at": 1775969821, - "integration_name": "FlashMonit", - "integration_type": "monit.alert", - "integration_ref_id": "a_2451002751131", - "channel_name": "Ops Channel", - "channel_status": "enabled", - "responder_name": "", - "responder_email": "", - "incident": { - "incident_id": "69da451ef77b1b51f40e83ee", - "title": "CPU usage high - web-server-01", - "progress": "Triggered" - }, - "event_cnt": 17, - "images": null, - "data_source_name": "FlashMonit", - "data_source_type": "monit.alert", - "data_source_ref_id": "a_2451002751131", - "events": [ - { - "event_id": "69da451df77b1b51f40e83df", - "alert_id": "69da451df77b1b51f40e83de", - "title": "CPU usage > 90%", - "event_severity": "Critical", - "event_status": "Critical", - "event_time": 1712650000, - "labels": { - "host": "web-01" - } - } - ] - } - ] - } - } - } - } + "agent_name": { + "description": "Agent display name.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "allow_insecure_oauth_http": { + "description": "Allow non-loopback HTTP OAuth discovery/metadata endpoints for this agent instead of requiring HTTPS.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "allow_insecure_tls_skip_verify": { + "description": "Skip TLS certificate verification when connecting to this agent's endpoint.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "auth_config": { + "additionalProperties": { + "type": "string" + }, + "description": "Authentication config key-values. Values under credential-looking keys (name containing KEY, SECRET, TOKEN, PASSWORD, etc.) are masked. Omitted when empty.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListIncidentAlertsRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "is_active": true, - "limit": 100, - "p": 1, - "include_events": true - } - } - } - } - } - }, - "/incident/feed": { - "post": { - "operationId": "incidentFeed", - "summary": "Get incident timeline", - "description": "Retrieve the timeline feed for a specific incident, including state changes, comments and system events.", - "tags": [ - "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** (`on-call`) |\n\n## Usage\n\n- For `i_comm` entries, `detail.comment_type` is resolved from the current account-level comment type definition at read time, so it reflects the type's latest name and color.", - "href": "/en/api-reference/on-call/incidents/incident-feed", - "metadata": { - "sidebarTitle": "Get incident timeline" + "auth_mode": { + "description": "Authentication mode. One of: `shared` (a single static credential saved on the resource and shared by all callers in the account; the default — an empty value behaves the same), `per_user_secret` (each user stores their own secret per `secret_schema`, injected per user at runtime), `per_user_oauth` (each user completes their own OAuth grant; discovery and registration run lazily on first use).", + "enum": [ + "shared", + "per_user_secret", + "per_user_oauth" + ], + "type": "string" + }, + "auth_type": { + "description": "Authentication type for reaching the remote agent: `none`, `api_key`, or `bearer`. Rows created before validation was tightened may return an empty string, equivalent to `none`.", + "enum": [ + "", + "none", + "api_key", + "bearer" + ], + "type": "string" + }, + "can_edit": { + "description": "Whether the caller may edit this agent.", + "type": "boolean" + }, + "card_resolve_timeout": { + "description": "Card-resolution timeout in seconds. Always 0 today — the API does not yet expose a way to set it.", + "type": "integer" + }, + "card_url": { + "description": "URL of the remote agent card.", + "type": "string" + }, + "created_at": { + "description": "Creation time. Unix timestamp in milliseconds.", + "format": "int64", + "type": "integer" + }, + "created_by": { + "description": "Member ID that created the agent.", + "format": "int64", + "type": "integer" + }, + "environments": { + "description": "Execution environments this agent is callable from (`cloud` and/or BYOC runner environment IDs). Always present; `[]` means all environments (also the value on legacy rows created before this field).", + "items": { + "type": "string" + }, + "type": "array" + }, + "instructions": { + "description": "Natural-language instructions for the remote agent (formerly named `description`).", + "maxLength": 51200, + "type": "string" + }, + "oauth_metadata": { + "description": "JSON-encoded OAuth metadata (per_user_oauth mode).", + "type": "string" + }, + "secret_schema": { + "description": "JSON-encoded secret schema (per_user_secret mode).", + "type": "string" + }, + "status": { + "description": "Agent status.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "streaming": { + "description": "Whether the remote agent supports streaming responses.", + "type": "boolean" + }, + "task_timeout": { + "description": "Single-task execution timeout in seconds. Always 0 today — the API does not yet expose a way to set it.", + "type": "integer" + }, + "team_id": { + "description": "Team scope: 0 = account-wide; >0 = the owning team.", + "format": "int64", + "type": "integer" + }, + "updated_at": { + "description": "Last update time. Unix timestamp in milliseconds.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListIncidentFeedResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "has_next_page": true, - "items": [ - { - "ref_id": "6a5f1e28807515413b384bce", - "type": "i_wi_created", - "detail": { - "work_item_id": "wi_68MHnkWBiyjrh6uhkxUyiZ", - "item_type": "follow_up", - "title": "Follow-up: schedule database failover drill", - "status": "open", - "assignee_ids": [ - 3790925372131, - 4756301322131 - ], - "post_mortem_id": "51d65cd9525c369379ba471b5512df63" - }, - "account_id": 2451002751131, - "creator_id": 5329873302131, - "created_at": 1785495329402, - "updated_at": 1785495329402 - }, - { - "ref_id": "6a5f1e28807515413b384bce", - "type": "i_comm", - "detail": { - "comment": "Root cause identified: connection pool exhaustion on the primary database.", - "comment_type_id": "6a5895d672a064bc2d3ddfc2", - "comment_type": { - "id": "6a5895d672a064bc2d3ddfc2", - "name": "Key finding", - "color": "#30A46C" - } - }, - "account_id": 2451002751131, - "creator_id": 3790925372131, - "created_at": 1785496333926, - "updated_at": 1785496333926 - }, - { - "ref_id": "6a5f1e28807515413b384bce", - "type": "i_wi_completed", - "detail": { - "work_item_id": "wi_68MHnkWBiyjrh6uhkxUyiZ", - "item_type": "follow_up", - "title": "Follow-up: schedule database failover drill", - "from_status": "open", - "to_status": "done", - "post_mortem_id": "51d65cd9525c369379ba471b5512df63" - }, - "account_id": 2451002751131, - "creator_id": 3790925372131, - "created_at": 1785496384806, - "updated_at": 1785496384806 - } - ] - } - } - } - } + "required": [ + "agent_id", + "account_id", + "team_id", + "can_edit", + "agent_name", + "instructions", + "card_url", + "auth_type", + "streaming", + "status", + "card_resolve_timeout", + "task_timeout", + "created_by", + "created_at", + "updated_at", + "environments" + ], + "type": "object" + }, + "A2AAgentListRequest": { + "description": "Pagination, scope, and search filter for listing A2A agents.", + "properties": { + "include_account": { + "description": "Include account-scoped (team_id=0) rows. Defaults to true.", + "type": [ + "boolean", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "default": 20, + "description": "Page size.", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "offset": { + "default": 0, + "description": "Pagination offset — number of rows to skip, starting from 0.", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "query": { + "description": "Case-insensitive substring search across agent name, instructions, card URL, agent ID, and the resolved card name.", + "maxLength": 128, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "scope": { + "default": "all", + "description": "Visibility scope: `all` (account-scope plus the caller's visible teams), `account` (account-scope only), or `team` (team-scoped rows across the caller's visible teams).", + "enum": [ + "all", + "account", + "team" + ], + "type": "string" + }, + "team_ids": { + "description": "Filter to these team IDs; empty = the caller's visible set.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListIncidentFeedRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "p": 1, - "limit": 20 - } - } - } - } - } - }, - "/incident/past/list": { - "post": { - "operationId": "incidentPastList", - "summary": "List past incidents", - "description": "List historical incidents related to the current incident for reference during triage.", - "tags": [ - "On-call/Incidents" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/minute**; **20 requests/second** per account |\n| Permissions | **Incidents Read** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-past-list", - "metadata": { - "sidebarTitle": "List past incidents" + "type": "object" + }, + "A2AAgentListResponse": { + "description": "Paginated A2A agent list.", + "properties": { + "items": { + "description": "A2A agents on this page.", + "items": { + "$ref": "#/components/schemas/A2AAgentItem" + }, + "type": "array" + }, + "total": { + "description": "Total number of matching agents.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListPastIncidentsResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [] - } - } - } - } + "required": [ + "items", + "total" + ], + "type": "object" + }, + "A2AAgentUpdateRequest": { + "description": "Partial update of an A2A agent. A null/omitted field is left unchanged.", + "properties": { + "agent_id": { + "description": "Target agent ID, from the list returned by `POST /safari/a2a-agent/list`.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "agent_name": { + "description": "New display name. Omit to leave unchanged.", + "maxLength": 128, + "type": [ + "string", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "allow_insecure_oauth_http": { + "description": "Toggle non-loopback HTTP OAuth discovery for this agent. Omit to leave unchanged.", + "type": [ + "boolean", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "allow_insecure_tls_skip_verify": { + "description": "Toggle TLS certificate verification skipping for this agent. Omit to leave unchanged.", + "type": [ + "boolean", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListPastIncidentsRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "limit": 5 - } - } - } - } - } - }, - "/incident/create": { - "post": { - "operationId": "incidentCreate", - "summary": "Create incident", - "description": "Manually create a new incident and assign responders.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- When an account create form applies, its visible custom fields and required system values must be supplied.\n- To attach images, send `multipart/form-data` with the JSON request in `data` and files in `images`; the complete request must not exceed 50 MiB.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/incidents/incident-create", - "metadata": { - "sidebarTitle": "Create incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CreateIncidentResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "incident_id": "69db2ef1a0fe7db6448b14f1", - "title": "API test incident for docs" - } - } - } - } + "auth_config": { + "additionalProperties": { + "type": "string" + }, + "description": "Replace the whole auth config; omit to leave unchanged. Keys missing from the map are dropped. For a sensitive key, sending back the masked value keeps the stored secret, while sending an empty string clears it.", + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "auth_mode": { + "description": "New auth mode: shared, per_user_secret, or per_user_oauth. Changing it always rewrites secret_schema together with it.", + "type": [ + "string", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "auth_type": { + "description": "New auth type: `none`, `api_key`, or `bearer`. Omit to leave unchanged.", + "enum": [ + "none", + "api_key", + "bearer" + ], + "type": [ + "string", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "card_url": { + "description": "New card URL. Omit to leave unchanged.", + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateIncidentRequest" - }, - "example": { - "incident_severity": "Critical", - "title": "Database connection timeout on prod-db-01", - "channel_id": 2551105804131, - "assigned_to": { - "person_ids": [ - 2476444212131 - ] - } - } + "environments": { + "description": "Execution environments this agent is callable from: `cloud` and/or BYOC runner environment IDs. Omit (null) to leave unchanged; send a list to set it — an empty list clears the restriction back to all environments.", + "items": { + "type": "string" }, - "multipart/form-data": { - "schema": { - "type": "object", - "required": [ - "data" - ], - "properties": { - "data": { - "type": "string", - "description": "JSON-encoded CreateIncidentRequest payload." - }, - "images": { - "type": "array", - "items": { - "type": "string", - "format": "binary" - }, - "description": "Image files attached to the new incident." - } - } - }, - "encoding": { - "data": { - "contentType": "application/json" - } - } - } - } - } - } - }, - "/incident/ack": { - "post": { - "operationId": "incidentAck", - "summary": "Acknowledge incident", - "description": "Acknowledge an incident to indicate you are actively working on it.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- When an acknowledgement form applies, `custom_fields`, `summary`, and `images` must match its visible elements and required rules.\n- For a batch, form values are accepted only when every selected incident resolves to the same form; otherwise acknowledge incidents individually.\n- The legacy `values` and `custom_values` properties are rejected; use `custom_fields`.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/incidents/incident-ack", - "metadata": { - "sidebarTitle": "Acknowledge incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": [ + "array", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "instructions": { + "description": "New instructions document (same contract as create: optional `summary` frontmatter, non-empty body, at most 50 KiB). Omit to leave unchanged. A deprecated `description` field is also accepted; if both are sent they must match.", + "maxLength": 51200, + "type": [ + "string", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "oauth_metadata": { + "description": "New JSON OAuth metadata. If omitted while auth_mode changes, it is cleared to empty.", + "type": [ + "string", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "secret_schema": { + "description": "New JSON secret schema.", + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "streaming": { + "description": "Toggle streaming support. Omit to leave unchanged.", + "type": [ + "boolean", + "null" + ] + }, + "team_id": { + "description": "Reassign team scope. Omit to leave unchanged. Reassigning requires rights on the destination team; if the team changes without also sending a new environment binding, the existing runner binding must remain selectable by the caller or the update is rejected.", + "format": "int64", + "type": [ + "integer", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AckIncidentRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ] - } - } - } - } - } - }, - "/incident/unack": { - "post": { - "operationId": "incidentUnack", - "summary": "Unacknowledge incident", - "description": "Remove the acknowledge status from an incident.", - "tags": [ - "On-call/Incidents" + "required": [ + "agent_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-unack", - "metadata": { - "sidebarTitle": "Unacknowledge incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AccountInfo": { + "properties": { + "account_id": { + "description": "Account identifier.", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "account_name": { + "description": "Account name.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "avatar": { + "description": "Account avatar URL.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "country_code": { + "description": "ISO 3166-1 alpha-2 region code of the contact phone (e.g. \"CN\", \"US\", \"HK\").", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnackIncidentRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ] - } - } - } - } - } - }, - "/incident/resolve": { - "post": { - "operationId": "incidentResolve", - "summary": "Resolve incident", - "description": "Mark an incident as resolved.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- When a resolution form applies, `custom_fields`, `summary`, and `images` must match its visible elements and required rules.\n- For a batch, form values are accepted only when every selected incident resolves to the same form; otherwise resolve incidents individually.\n- The legacy `values` and `custom_values` properties are rejected; use `custom_fields`.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/incidents/incident-resolve", - "metadata": { - "sidebarTitle": "Resolve incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "created_at": { + "description": "Account creation time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "domain": { + "description": "Primary account domain (login subdomain).", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "email": { + "description": "Account contact email.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "extra_domains": { + "description": "Additional account domains.", + "items": { + "type": "string" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResolveIncidentRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ], - "root_cause": "Memory leak in the connection pool caused by a missing cleanup call.", - "resolution": "Deployed hotfix v2.3.1 and restarted the affected service." - } - } - } - } - } - }, - "/incident/reopen": { - "post": { - "operationId": "incidentReopen", - "summary": "Reopen incident", - "description": "Reopen a previously resolved incident.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-reopen", - "metadata": { - "sidebarTitle": "Reopen incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "locale": { + "description": "Account language preference (e.g. zh-CN, en-US).", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "mp_account_id": { + "description": "Account identifier on the marketplace platform. Omitted together with `mp_plat`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "mp_plat": { + "description": "Cloud marketplace platform the account was provisioned from. Omitted when the account did not come from a marketplace.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "phone": { + "description": "Account contact phone, masked for privacy.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReopenIncidentRequest" + "restrictions": { + "description": "Account access restrictions. Omitted when none are configured.", + "properties": { + "allow_subdomain": { + "description": "Whether subdomains of the allowed email domains are also accepted.", + "type": "boolean" }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ], - "reason": "Monitoring detected the issue recurred after the initial fix." - } - } - } - } - } - }, - "/incident/snooze": { - "post": { - "operationId": "incidentSnooze", - "summary": "Snooze incident", - "description": "Temporarily snooze notifications for an incident until a specified time.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-snooze", - "metadata": { - "sidebarTitle": "Snooze incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] + "email_domains": { + "description": "Allowed login email domains.", + "items": { + "type": "string" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } + "type": "array" + }, + "ips": { + "description": "Allowed source IP/CIDR whitelist.", + "items": { + "type": "string" + }, + "type": "array" } - } + }, + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "time_zone": { + "description": "Account default timezone (IANA name, e.g. Asia/Shanghai).", + "type": "string" + } + }, + "required": [ + "account_id", + "account_name", + "domain", + "extra_domains", + "phone", + "country_code", + "email", + "avatar", + "locale", + "time_zone", + "created_at" + ], + "type": "object" + }, + "AckIncidentRequest": { + "description": "Parameters for acknowledging one or more incidents.", + "properties": { + "custom_fields": { + "$ref": "#/components/schemas/CustomFieldValues", + "description": "Custom field values for the acknowledgement form. Allowed keys and values depend on the incident's visible form." }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "images": { + "description": "Images attached to the acknowledgement timeline entry.", + "items": { + "$ref": "#/components/schemas/IncidentActionImage" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "incident_ids": { + "description": "Incident IDs to acknowledge. At most 100 per call.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "summary": { + "description": "Form summary recorded as a timeline comment. Accepted only when the acknowledgement form contains a summary element.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SnoozeIncidentRequest" + "required": [ + "incident_ids" + ], + "type": "object" + }, + "AddIncidentResponderRequest": { + "description": "Parameters for adding responders to an existing incident.", + "properties": { + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "notify": { + "description": "Optional notification override. Defaults to following each person's personal preference.", + "properties": { + "follow_preference": { + "description": "When false, use `personal_channels`; when true or omitted, use each responder's personal preference.", + "type": [ + "boolean", + "null" + ] }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ], - "minutes": 60 + "personal_channels": { + "description": "Channels to use (e.g. `voice`, `sms`, `email`).", + "items": { + "type": "string" + }, + "type": "array" + }, + "template_id": { + "description": "Notification template ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" } - } + }, + "type": "object" + }, + "person_ids": { + "description": "Member IDs to add as responders.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } - } - } - }, - "/incident/wake": { - "post": { - "operationId": "incidentWake", - "summary": "Wake incident", - "description": "Cancel the snooze on an incident and resume notifications.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "incident_id", + "person_ids" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-wake", - "metadata": { - "sidebarTitle": "Wake incident" + "type": "object" + }, + "AddWarRoomMemberRequest": { + "properties": { + "chat_id": { + "description": "Chat ID of the war room within the IM platform.", + "type": "string" + }, + "integration_id": { + "description": "ID of the IM integration hosting the war room; obtain it from `POST /datasource/im/war-room-enabled/list`.", + "format": "int64", + "type": "integer" + }, + "member_ids": { + "description": "Person IDs to add to the war room.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "integration_id", + "chat_id", + "member_ids" + ], + "type": "object" + }, + "AffectedStatusPageComponentItem": { + "description": "A status page component currently affected by an event, embedding component metadata plus its resulting status.", + "properties": { + "available_since_seconds": { + "description": "Time the component became available, as a Unix timestamp in seconds. Omitted when 0.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "component_id": { + "description": "Component ID. Omitted when empty.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Component description. Omitted when empty.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "hide_all": { + "description": "When true, the component is hidden entirely from summary endpoints. Omitted when false.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/WakeIncidentRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ] - } - } - } - } - } - }, - "/incident/merge": { - "post": { - "operationId": "incidentMerge", - "summary": "Merge incidents", - "description": "Merge one or more incidents into a target incident.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-merge", - "metadata": { - "sidebarTitle": "Merge incidents" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "hide_uptime": { + "description": "When true, uptime data is hidden from summary responses. Omitted when false.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "name": { + "description": "Component display name.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "order_id": { + "description": "Display order within its section. Omitted when 0.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "section_id": { + "description": "Parent section ID. Omitted when the component sits at the top level.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "status": { + "description": "Current status of the component affected by the change. Severity increases: `operational` < `degraded` = `under_maintenance` < `partial_outage` < `full_outage`; incident-type changes may use the first four, maintenance-type changes only `operational` and `under_maintenance`.\n| Value | Meaning |\n|---|---|\n| `operational` | Operating normally. |\n| `degraded` | Degraded performance. |\n| `partial_outage` | Partial outage. |\n| `full_outage` | Full outage. |\n| `under_maintenance` | Under maintenance. |", + "enum": [ + "operational", + "degraded", + "partial_outage", + "full_outage", + "under_maintenance" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MergeIncidentsRequest" - }, - "example": { - "source_incident_ids": [ - "69da451ef77b1b51f40e83ef", - "69da451ef77b1b51f40e83f0" - ], - "target_incident_id": "69da451ef77b1b51f40e83ee", - "comment": "Merging related database connectivity incidents into one." - } - } - } - } - } - }, - "/incident/disable-merge": { - "post": { - "operationId": "incidentDisableMerge", - "summary": "Disable incident merge", - "description": "Disable automatic merging for a specific incident.", - "tags": [ - "On-call/Incidents" + "required": [ + "name", + "status" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-disable-merge", - "metadata": { - "sidebarTitle": "Disable incident merge" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AlertEventGlobalListRequest": { + "description": "Filter and pagination criteria for the global raw event list.", + "properties": { + "asc": { + "description": "Sort ascending when `true`.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_ids": { + "description": "Filter by channel IDs. At most 100 entries.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 100, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "end_time": { + "description": "End of the search window, Unix epoch seconds. Must be greater than `start_time` when provided.", + "format": "int64", + "type": [ + "integer", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_ids": { + "description": "Filter by integration IDs.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DisableIncidentMergeRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ] - } - } - } - } - } - }, - "/incident/reset": { - "post": { - "operationId": "incidentReset", - "summary": "Update incident fields", - "description": "Update one or more editable fields of an incident in a single call, including title, description, impact, root cause, resolution, and severity. At least one field must be provided.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-reset", - "metadata": { - "sidebarTitle": "Update incident fields" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "integration_types": { + "description": "Filter by integration types (plugin keys).", + "items": { + "type": "string" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "description": "Page size, max 100, default 20.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "orderby": { + "description": "Sort field; only `event_time` is supported.", + "enum": [ + "event_time" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "p": { + "description": "Page number, starting at 1. Used when `search_after_ctx` is not provided.", + "format": "int64", + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentFieldsRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "title": "Database connection timeout - prod-db-01 primary", - "incident_severity": "Critical" - } - } - } - } - } - }, - "/incident/remove": { - "post": { - "operationId": "incidentRemove", - "summary": "Delete an incident", - "description": "Permanently delete an incident and all associated data.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-remove", - "metadata": { - "sidebarTitle": "Delete an incident" + "search_after_ctx": { + "description": "Pagination cursor: leave empty for the first page, then pass the `search_after_ctx` returned by the previous response.", + "type": [ + "string", + "null" + ] + }, + "severities": { + "description": "Comma-separated severity filter, e.g. `Critical,Warning`. Accepted values: `Critical`, `Warning`, `Info`, `Ok`.", + "type": "string" + }, + "start_time": { + "description": "Start of the search window, Unix epoch seconds. Must be greater than 0 when provided.", + "exclusiveMinimum": 0, + "format": "int64", + "type": [ + "integer", + "null" + ] } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "type": "object" + }, + "AlertEventGlobalListResponse": { + "properties": { + "has_next_page": { + "description": "Whether a next page exists (probed by fetching limit+1 rows).", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "items": { + "description": "Raw alert events on the current page.", + "items": { + "$ref": "#/components/schemas/AlertEventItem" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "search_after_ctx": { + "description": "Cursor for the next page — the ObjectID of the last event on this page; pass it back as `search_after_ctx`. Omitted when the page is empty; in cursor mode also omitted when there is no next page.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RemoveIncidentRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ] - } - } - } - } - } - }, - "/incident/comment": { - "post": { - "operationId": "incidentComment", - "summary": "Add comment to incident", - "description": "Add a text comment to the incident timeline.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- To mention a member, embed a markdown link in `comment` in the form `[@Display Name](flashduty://ref/member/)`. Mentioned members receive a dedicated personal notification, which is not affected by `mute_reply`.\n- Plain `@name` text without the link syntax does not create a mention.\n- The server rewrites each mention's display label to the member's canonical name.", - "href": "/en/api-reference/on-call/incidents/incident-comment", - "metadata": { - "sidebarTitle": "Add comment to incident" + "total": { + "description": "Total number of matching events, capped at 1000.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AlertEventItem": { + "description": "A raw alert event.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "alert_id": { + "description": "Parent alert ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "alert_key": { + "description": "Deduplication key used to merge events into an alert.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "channel_id": { + "description": "Channel ID the event is routed to.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CommentIncidentRequest" - }, - "example": { - "incident_ids": [ - "69da451ef77b1b51f40e83ee" - ], - "comment": "Root cause identified. [@Jane Doe](flashduty://ref/member/2476444212131) please verify the fix.", - "comment_type_id": "6a5895d672a064bc2d3ddfc2" - } - } - } - } - } - }, - "/incident/assign": { - "post": { - "operationId": "incidentAssign", - "summary": "Assign incident", - "description": "Dispatch an incident to a specific escalation level or responder.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-assign", - "metadata": { - "sidebarTitle": "Assign incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "created_at": { + "description": "Record creation time, Unix epoch seconds.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "data_source_id": { + "description": "Deprecated. Use `integration_id` instead.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "deleted_at": { + "description": "Soft-delete time, Unix epoch seconds. Omitted when the event is not deleted.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "description": { + "description": "Event description.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AssignIncidentRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "assigned_to": { - "person_ids": [ - 2476444212131 - ], - "type": "assign" - } - } - } - } - } - } - }, - "/incident/responder/add": { - "post": { - "operationId": "incidentResponderAdd", - "summary": "Add incident responder", - "description": "Add a responder to an existing incident.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-responder-add", - "metadata": { - "sidebarTitle": "Add incident responder" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddIncidentResponderRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "person_ids": [ - 2476444212131, - 2476444212132 - ] - } - } - } - } - } - }, - "/incident/field/reset": { - "post": { - "operationId": "incidentFieldReset", - "summary": "Update incident custom field", - "description": "Update a custom field value on an incident.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-field-reset", - "metadata": { - "sidebarTitle": "Update incident custom field" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResetIncidentFieldRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "field_name": "affected_service", - "field_value": "payment-service" - } - } - } - } - } - }, - "/incident/custom-action/do": { - "post": { - "operationId": "incidentCustomActionDo", - "summary": "Execute custom action", - "description": "Execute a custom action configured for an incident.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-custom-action-do", - "metadata": { - "sidebarTitle": "Execute custom action" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DoIncidentCustomActionResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "message": "" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DoIncidentCustomActionRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "integration_id": 2490562293131 - } - } - } - } - } - }, - "/incident/war-room/detail": { - "post": { - "operationId": "incidentWarRoomDetail", - "summary": "Get war room detail", - "description": "Retrieve the war room configuration and members for an incident.", - "tags": [ - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-war-room-detail", - "metadata": { - "sidebarTitle": "Get war room detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/WarRoom" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "chat_id": "oc_a0553eda9014c2de1b3a8f75b4e0c000", - "chat_name": "Incident #0E83EE war room", - "share_link": "" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetWarRoomDetailRequest" - }, - "example": { - "integration_id": 2490562293131, - "chat_id": "oc_a0553eda9014c2de1b3a8f75b4e0c000" - } - } - } - } - } - }, - "/incident/war-room/list": { - "post": { - "operationId": "incidentWarRoomList", - "summary": "List war rooms", - "description": "List all war rooms associated with an incident.", - "tags": [ - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-war-room-list", - "metadata": { - "sidebarTitle": "List war rooms" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListWarRoomsResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListWarRoomsRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee" - } - } - } - } - } - }, - "/incident/war-room/create": { - "post": { - "operationId": "incidentWarRoomCreate", - "summary": "Create war room", - "description": "Create a war room channel for collaborative incident response.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-war-room-create", - "metadata": { - "sidebarTitle": "Create war room" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/WarRoom" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "chat_id": "oc_a0553eda9014c2de1b3a8f75b4e0c000", - "chat_name": "Incident #0E83EE war room", - "share_link": "" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWarRoomRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "integration_id": 2490562293131, - "add_observers": true - } - } - } - } - } - }, - "/incident/war-room/delete": { - "post": { - "operationId": "incidentWarRoomDelete", - "summary": "Delete war room", - "description": "Delete an incident war room.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-war-room-delete", - "metadata": { - "sidebarTitle": "Delete war room" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteWarRoomRequest" - }, - "example": { - "incident_id": "69da451ef77b1b51f40e83ee", - "integration_id": 2490562293131 - } - } - } - } - } - }, - "/incident/post-mortem/info": { - "get": { - "operationId": "incidentPostMortemInfo", - "summary": "Get post-mortem", - "description": "Retrieve a post-mortem report by its `post_mortem_id`. List reports via `/incident/post-mortem/list` first — each row carries the incident it covers — then fetch the full report here by that id.", - "tags": [ - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-post-mortem-info", - "metadata": { - "sidebarTitle": "Get post-mortem" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PostMortemItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "meta": { - "account_id": 2451002751131, - "title": "Postmortem1", - "status": "published", - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "template_id": "post_mortem_default_tmpl_en-us", - "incident_ids": [ - "69bb9233331067560c718ecd" - ], - "media_count": 0, - "author_ids": [ - 2477273692131 - ], - "team_id": 2477033058131, - "channel_id": 3047621227131, - "is_private": false, - "channel_name": "Ops Channel", - "created_at_seconds": 1773900354, - "updated_at_seconds": 1773909012 - }, - "basics": { - "incidents_highest_severity": "Warning", - "incidents_earliest_start_seconds": 1761133512, - "incidents_latest_close_seconds": 1761133632, - "incidents_total_duration_seconds": 120, - "responders": [ - { - "person_id": 3790925372131, - "assigned_at": 1761133515, - "acknowledged_at": 0 - } - ] - }, - "content": { - "content": "{\"type\":\"doc\",\"content\":[]}" - }, - "follow_ups": "" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "parameters": [ - { - "name": "post_mortem_id", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "description": "Post-mortem ID. Deterministic hash derived from account ID and the set of linked incident IDs." - } - ] - } - }, - "/incident/post-mortem/list": { - "post": { - "operationId": "incidentPostMortemList", - "summary": "List post-mortems", - "description": "List post-mortem reports with optional filters.", - "tags": [ - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-post-mortem-list", - "metadata": { - "sidebarTitle": "List post-mortems" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListPostMortemsResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 3, - "has_next_page": false, - "items": [ - { - "account_id": 2451002751131, - "title": "Postmortem1", - "status": "published", - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "template_id": "post_mortem_default_tmpl_en-us", - "incident_ids": [ - "69bb9233331067560c718ecd" - ], - "media_count": 0, - "author_ids": [ - 2477273692131 - ], - "team_id": 2477033058131, - "channel_id": 3047621227131, - "is_private": false, - "channel_name": "Ops Channel", - "created_at_seconds": 1773900354, - "updated_at_seconds": 1773909012 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListPostMortemsRequest" - }, - "example": { - "status": "published", - "p": 1, - "limit": 20 - } - } - } - } - } - }, - "/incident/post-mortem/delete": { - "post": { - "operationId": "incidentPostMortemDelete", - "summary": "Delete post-mortem", - "description": "Delete a post-mortem report.", - "tags": [ - "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 Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/incident-post-mortem-delete", - "metadata": { - "sidebarTitle": "Delete post-mortem" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeletePostMortemRequest" - }, - "example": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e" - } - } - } - } - } - }, - "/channel/info": { - "post": { - "operationId": "channelInfo", - "summary": "Get channel detail", - "description": "Retrieve detailed information for a specific channel.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-info", - "metadata": { - "sidebarTitle": "Get channel detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ChannelItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "channel_id": 1001, - "channel_name": "Production Alerts", - "status": "enabled", - "team_id": 10 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelInfoRequest" - }, - "example": { - "channel_id": 1001 - } - } - } - } - } - }, - "/channel/list": { - "post": { - "operationId": "channelList", - "summary": "List channels", - "description": "List channels accessible to the current user with optional filters.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-list", - "metadata": { - "sidebarTitle": "List channels" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListChannelsResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 42, - "has_next_page": true, - "items": [ - { - "channel_id": 1001, - "channel_name": "Production Alerts", - "status": "enabled" - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListChannelsRequest" - }, - "example": { - "p": 1, - "limit": 20, - "orderby": "created_at", - "asc": false - } - } - } - } - } - }, - "/channel/infos": { - "post": { - "operationId": "channelInfos", - "summary": "Batch get channels", - "description": "Retrieve multiple channels by their IDs.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-infos", - "metadata": { - "sidebarTitle": "Batch get channels" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ChannelInfosResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "channel_id": 1001, - "channel_name": "Production Alerts", - "status": "enabled" - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelInfosRequest" - }, - "example": { - "channel_ids": [ - 1001, - 1002 - ] - } - } - } - } - } - }, - "/channel/create": { - "post": { - "operationId": "channelCreate", - "summary": "Create channel", - "description": "Create a new channel for incident management.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-create", - "metadata": { - "sidebarTitle": "Create channel" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ChannelCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "channel_id": 6294542005131, - "channel_name": "API Test Channel" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateChannelRequest" - }, - "example": { - "team_id": 3521074710131, - "channel_name": "Production Alerts", - "description": "Handles all production environment alerts", - "group": { - "method": "p", - "time_window": 10, - "window_type": "tumbling" - }, - "auto_resolve_timeout": 86400, - "auto_resolve_mode": "trigger" - } - } - } - } - } - }, - "/channel/update": { - "post": { - "operationId": "channelUpdate", - "summary": "Update channel", - "description": "Update an existing channel's configuration and settings.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-update", - "metadata": { - "sidebarTitle": "Update channel" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/UpdateChannelResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "external_report_token": "" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateChannelRequest" - }, - "example": { - "channel_id": 1001, - "channel_name": "Production Alerts (v2)", - "description": "Updated description" - } - } - } - } - } - }, - "/channel/delete": { - "post": { - "operationId": "channelDelete", - "summary": "Delete channel", - "description": "Delete a channel. Only a `disabled` channel can be deleted; all of its escalation, silence, drop and inhibit rules are deleted with it. The call fails when an integration route still references the channel.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-delete", - "metadata": { - "sidebarTitle": "Delete channel" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelIDRequest" - }, - "example": { - "channel_id": 3521074710131 - } - } - } - } - } - }, - "/channel/enable": { - "post": { - "operationId": "channelEnable", - "summary": "Enable channel", - "description": "Enable a channel to resume incident routing. Only a `disabled` channel can be enabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-enable", - "metadata": { - "sidebarTitle": "Enable channel" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelIDRequest" - }, - "example": { - "channel_id": 3521074710131 - } - } - } - } - } - }, - "/channel/disable": { - "post": { - "operationId": "channelDisable", - "summary": "Disable channel", - "description": "Disable a channel to stop incident routing without deleting it; a disabled channel discards incoming events. Only an `enabled` channel can be disabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-disable", - "metadata": { - "sidebarTitle": "Disable channel" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelIDRequest" - }, - "example": { - "channel_id": 3521074710131 - } - } - } - } - } - }, - "/channel/silence/rule/list": { - "post": { - "operationId": "channelSilenceRuleList", - "summary": "List silence rules", - "description": "List all silence rules configured for a channel.", - "tags": [ - "On-call/Channels" - ], - "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`) |", - "href": "/en/api-reference/on-call/channels/channel-silence-rule-list", - "metadata": { - "sidebarTitle": "List silence rules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListSilenceRulesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "channel_id": 5967964835131, - "rule_name": "Silence Info alerts", - "description": "", - "from_incident_id": "000000000000000000000000", - "time_filters": [], - "time_filter": { - "start_time": 1773388800, - "end_time": 1773414000 - }, - "filters": [ - [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Info" - ] - } - ] - ], - "is_directly_discard": true, - "status": "enabled", - "rule_id": "69b3c426b4a6f5abf1f54873", - "updated_by": 3790925372131, - "created_at": 1773388838, - "updated_at": 1773388838, - "is_effective": false - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelScopedListRequest" - }, - "example": { - "channel_id": 1001 - } - } - } - } - } - }, - "/channel/silence/rule/create": { - "post": { - "operationId": "channelSilenceRuleCreate", - "summary": "Create silence rule", - "description": "Create a silence rule to suppress notifications matching specified conditions.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-silence-rule-create", - "metadata": { - "sidebarTitle": "Create silence rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "69db2f66a0fe7db6448b1503", - "rule_name": "Test silence rule" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSilenceRuleRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_name": "Maintenance window silence", - "description": "Silence all Info alerts during planned maintenance", - "time_filter": { - "start_time": 1773388800, - "end_time": 1773414000 - }, - "filters": [ - [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Info" - ] - } - ] - ], - "is_directly_discard": false - } - } - } - } - } - }, - "/channel/silence/rule/update": { - "post": { - "operationId": "channelSilenceRuleUpdate", - "summary": "Update silence rule", - "description": "Update an existing silence rule configuration.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-silence-rule-update", - "metadata": { - "sidebarTitle": "Update silence rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateSilenceRuleRequest" - }, - "example": { - "channel_id": 1001, - "rule_id": "6621b23f4a2c5e0012ab34cd", - "rule_name": "Mute during maintenance", - "time_filter": { - "start_time": 1710000000, - "end_time": 1710086400 - }, - "filters": [ - [ - { - "key": "labels.service", - "oper": "IN", - "vals": [ - "billing" - ] - } - ] - ] - } - } - } - } - } - }, - "/channel/silence/rule/delete": { - "post": { - "operationId": "channelSilenceRuleDelete", - "summary": "Delete silence rule", - "description": "Delete a silence rule. Only a `disabled` rule can be deleted.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-silence-rule-delete", - "metadata": { - "sidebarTitle": "Delete silence rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/silence/rule/enable": { - "post": { - "operationId": "channelSilenceRuleEnable", - "summary": "Enable silence rule", - "description": "Enable a disabled silence rule. Only a `disabled` rule can be enabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-silence-rule-enable", - "metadata": { - "sidebarTitle": "Enable silence rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/silence/rule/disable": { - "post": { - "operationId": "channelSilenceRuleDisable", - "summary": "Disable silence rule", - "description": "Disable a silence rule without deleting it. Only an `enabled` rule can be disabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-silence-rule-disable", - "metadata": { - "sidebarTitle": "Disable silence rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/inhibit/rule/list": { - "post": { - "operationId": "channelInhibitRuleList", - "summary": "List inhibit rules", - "description": "List all inhibit rules configured for a channel.", - "tags": [ - "On-call/Channels" - ], - "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`) |", - "href": "/en/api-reference/on-call/channels/channel-inhibit-rule-list", - "metadata": { - "sidebarTitle": "List inhibit rules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListInhibitRulesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "channel_id": 5967964835131, - "rule_name": "Suppress downstream alerts", - "description": "", - "source_filters": [ - [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Info" - ] - } - ] - ], - "target_filters": [ - [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Info" - ] - } - ] - ], - "equals": [ - "data_source_id", - "labels._account_id" - ], - "is_directly_discard": false, - "status": "enabled", - "rule_id": "69bcc630b9e63df36603e425", - "updated_by": 3790925372131, - "created_at": 1773979184, - "updated_at": 1773979184 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelScopedListRequest" - }, - "example": { - "channel_id": 1001 - } - } - } - } - } - }, - "/channel/inhibit/rule/create": { - "post": { - "operationId": "channelInhibitRuleCreate", - "summary": "Create inhibit rule", - "description": "Create an inhibit rule to suppress lower-priority alerts when higher-priority ones are firing.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-inhibit-rule-create", - "metadata": { - "sidebarTitle": "Create inhibit rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "69db2f69a0fe7db6448b1504", - "rule_name": "Test inhibit rule" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateInhibitRuleRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_name": "Suppress Info when Critical fires", - "description": "When a Critical alert fires, suppress matching Info alerts", - "equals": [ - "labels.cluster", - "labels.service" - ], - "source_filters": [ - [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Critical" - ] - } - ] - ], - "target_filters": [ - [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Info" - ] - } - ] - ], - "is_directly_discard": false - } - } - } - } - } - }, - "/channel/inhibit/rule/update": { - "post": { - "operationId": "channelInhibitRuleUpdate", - "summary": "Update inhibit rule", - "description": "Update an existing inhibit rule configuration.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-inhibit-rule-update", - "metadata": { - "sidebarTitle": "Update inhibit rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateInhibitRuleRequest" - }, - "example": { - "channel_id": 1001, - "rule_id": "6621b23f4a2c5e0012ab34ce", - "rule_name": "Suppress downstream", - "equals": [ - "labels.cluster" - ] - } - } - } - } - } - }, - "/channel/inhibit/rule/delete": { - "post": { - "operationId": "channelInhibitRuleDelete", - "summary": "Delete inhibit rule", - "description": "Delete an inhibit rule. Only a `disabled` rule can be deleted.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-inhibit-rule-delete", - "metadata": { - "sidebarTitle": "Delete inhibit rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/inhibit/rule/enable": { - "post": { - "operationId": "channelInhibitRuleEnable", - "summary": "Enable inhibit rule", - "description": "Enable a disabled inhibit rule. Only a `disabled` rule can be enabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-inhibit-rule-enable", - "metadata": { - "sidebarTitle": "Enable inhibit rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/inhibit/rule/disable": { - "post": { - "operationId": "channelInhibitRuleDisable", - "summary": "Disable inhibit rule", - "description": "Disable an inhibit rule without deleting it. Only an `enabled` rule can be disabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-inhibit-rule-disable", - "metadata": { - "sidebarTitle": "Disable inhibit rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/unsubscribe/rule/list": { - "post": { - "operationId": "channelUnsubscribeRuleList", - "summary": "List drop rules", - "description": "List drop rules for a channel.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-list", - "metadata": { - "sidebarTitle": "List drop rules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListDropRulesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "channel_id": 5967964835131, - "rule_name": "Drop test alerts", - "description": "", - "filters": [ - [ - { - "key": "data_source_id", - "oper": "IN", - "vals": [ - "6113996590131" - ] - } - ] - ], - "status": "enabled", - "rule_id": "69bcc530b9e63df36603e421", - "updated_by": 3790925372131, - "created_at": 1773978928, - "updated_at": 1773978928 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelScopedListRequest" - }, - "example": { - "channel_id": 1001 - } - } - } - } - } - }, - "/channel/unsubscribe/rule/create": { - "post": { - "operationId": "channelUnsubscribeRuleCreate", - "summary": "Create drop rule", - "description": "Create a drop rule to filter out unwanted alerts before they become incidents.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-create", - "metadata": { - "sidebarTitle": "Create drop rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "69db2f6ba0fe7db6448b1505", - "rule_name": "Test drop rule" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateDropRuleRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_name": "Drop test environment alerts", - "description": "Discard all alerts from the test environment before they create incidents", - "filters": [ - [ - { - "key": "labels.env", - "oper": "IN", - "vals": [ - "test", - "dev" - ] - } - ] - ] - } - } - } - } - } - }, - "/channel/unsubscribe/rule/update": { - "post": { - "operationId": "channelUnsubscribeRuleUpdate", - "summary": "Update drop rule", - "description": "Update an existing drop rule configuration.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-update", - "metadata": { - "sidebarTitle": "Update drop rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateDropRuleRequest" - }, - "example": { - "channel_id": 1001, - "rule_id": "6621b23f4a2c5e0012ab34cf", - "rule_name": "Drop test alerts", - "filters": [ - [ - { - "key": "labels.env", - "oper": "IN", - "vals": [ - "test" - ] - } - ] - ] - } - } - } - } - } - }, - "/channel/unsubscribe/rule/delete": { - "post": { - "operationId": "channelUnsubscribeRuleDelete", - "summary": "Delete drop rule", - "description": "Delete a drop rule. Only a `disabled` rule can be deleted.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-delete", - "metadata": { - "sidebarTitle": "Delete drop rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/unsubscribe/rule/enable": { - "post": { - "operationId": "channelUnsubscribeRuleEnable", - "summary": "Enable drop rule", - "description": "Enable a disabled drop rule. Only a `disabled` rule can be enabled.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-enable", - "metadata": { - "sidebarTitle": "Enable drop rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/unsubscribe/rule/disable": { - "post": { - "operationId": "channelUnsubscribeRuleDisable", - "summary": "Disable drop rule", - "description": "Disable a drop rule without deleting it. Only an `enabled` rule can be disabled.", - "tags": [ - "On-call/Channels" - ], - "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 |", - "href": "/en/api-reference/on-call/channels/channel-unsubscribe-rule-disable", - "metadata": { - "sidebarTitle": "Disable drop rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/escalate/rule/info": { - "post": { - "operationId": "channelEscalateRuleInfo", - "summary": "Get escalation rule detail", - "description": "Retrieve detailed information for a specific escalation rule.", - "tags": [ - "On-call/Channels" - ], - "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`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-info", - "metadata": { - "sidebarTitle": "Get escalation rule detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EscalateRuleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 2451002751131, - "channel_id": 6193426913131, - "priority": 0, - "aggr_window": 0, - "rule_name": "Default", - "description": "", - "layers": [ - { - "max_times": 1, - "notify_step": 10, - "target": { - "person_ids": [ - 3790925372131 - ], - "by": { - "follow_preference": true - }, - "webhooks": null - }, - "escalate_window": 30, - "force_escalate": false - } - ], - "time_filters": [], - "filters": [], - "status": "enabled", - "template_id": "6321aad26c12104586a88916", - "rule_id": "69bd0ce95a238693176c1d66", - "updated_by": 3790925372131, - "created_at": 1773997289, - "updated_at": 1773997289 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 1001, - "rule_id": "6621b23f4a2c5e0012ab34d0" - } - } - } - } - } - }, - "/channel/escalate/rule/list": { - "post": { - "operationId": "channelEscalateRuleList", - "summary": "List escalation rules", - "description": "List all escalation rules for a channel.", - "tags": [ - "On-call/Channels" - ], - "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`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-list", - "metadata": { - "sidebarTitle": "List escalation rules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListEscalationRulesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "channel_id": 6193426913131, - "priority": 0, - "aggr_window": 0, - "rule_name": "Default", - "description": "", - "layers": [ - { - "max_times": 1, - "notify_step": 10, - "target": { - "person_ids": [ - 3790925372131 - ], - "by": { - "follow_preference": true - }, - "webhooks": null - }, - "escalate_window": 30, - "force_escalate": false - } - ], - "time_filters": [], - "filters": [], - "status": "enabled", - "template_id": "6321aad26c12104586a88916", - "rule_id": "69bd0ce95a238693176c1d66", - "updated_by": 3790925372131, - "created_at": 1773997289, - "updated_at": 1773997289 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelScopedListRequest" - }, - "example": { - "channel_id": 1001 - } - } - } - } - } - }, - "/channel/escalate/rule/create": { - "post": { - "operationId": "channelEscalateRuleCreate", - "summary": "Create escalation rule", - "description": "Create an escalation rule defining who gets notified and when during an incident.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-create", - "metadata": { - "sidebarTitle": "Create escalation rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "69db2f72a0fe7db6448b1506", - "rule_name": "Test escalation rule" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateEscalationRuleRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_name": "On-call escalation", - "template_id": "6321aad26c12104586a88916", - "description": "Notify primary on-call, then escalate to secondary after 30 minutes", - "layers": [ - { - "target": { - "person_ids": [ - 3790925372131 - ], - "by": { - "follow_preference": true - } - }, - "max_times": 3, - "notify_step": 10, - "escalate_window": 30, - "force_escalate": false - } - ] - } - } - } - } - } - }, - "/channel/escalate/rule/update": { - "post": { - "operationId": "channelEscalateRuleUpdate", - "summary": "Update escalation rule", - "description": "Update an existing escalation rule configuration.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-update", - "metadata": { - "sidebarTitle": "Update escalation rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateEscalationRuleRequest" - }, - "example": { - "channel_id": 1001, - "rule_id": "6621b23f4a2c5e0012ab34d0", - "template_id": "6621b23f4a2c5e0012ab34d1", - "rule_name": "Default escalation", - "layers": [ - { - "target": { - "person_ids": [ - 42 - ], - "by": { - "critical": [ - "voice" - ], - "warning": [ - "sms" - ] - } - } - } - ] - } - } - } - } - } - }, - "/channel/escalate/rule/delete": { - "post": { - "operationId": "channelEscalateRuleDelete", - "summary": "Delete escalation rule", - "description": "Delete an escalation rule. Only a `disabled` rule can be deleted.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-delete", - "metadata": { - "sidebarTitle": "Delete escalation rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/escalate/rule/enable": { - "post": { - "operationId": "channelEscalateRuleEnable", - "summary": "Enable escalation rule", - "description": "Enable a disabled escalation rule. Only a `disabled` rule can be enabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-enable", - "metadata": { - "sidebarTitle": "Enable escalation rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/channel/escalate/rule/disable": { - "post": { - "operationId": "channelEscalateRuleDisable", - "summary": "Disable escalation rule", - "description": "Disable an escalation rule without deleting it. Only an `enabled` rule can be disabled.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/channel-escalate-rule-disable", - "metadata": { - "sidebarTitle": "Disable escalation rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChannelRuleIDRequest" - }, - "example": { - "channel_id": 3521074710131, - "rule_id": "6621b23f4a2c5e0012ab34cd" - } - } - } - } - } - }, - "/route/info": { - "post": { - "operationId": "routeInfo", - "summary": "Get routing rule detail", - "description": "Retrieve the routing rule configuration for a specific integration. Returns null when the integration has no routing rule configured.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/route-info", - "metadata": { - "sidebarTitle": "Get routing rule detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RouteItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "integration_id": 6113996590131, - "cases": [ - { - "if": [ - { - "key": "labels.check", - "oper": "IN", - "vals": [ - "cpu.idle<20%" - ] - } - ], - "channel_ids": [ - 2533748993131 - ], - "fallthrough": false, - "routing_mode": "standard" - }, - { - "if": [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Warning" - ] - } - ], - "channel_ids": null, - "fallthrough": false, - "routing_mode": "name_mapping", - "name_mapping_label": "labels.service" - } - ], - "default": { - "channel_ids": [ - 3521074710131 - ] - }, - "status": "enabled", - "version": 6, - "updated_by": 3790925372131, - "creator_id": 3790925372131, - "created_at": 1774606136, - "updated_at": 1774606136 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RouteInfoRequest" - }, - "example": { - "integration_id": 6113996590131 - } - } - } - } - } - }, - "/route/list": { - "post": { - "operationId": "routeList", - "summary": "List routing rules", - "description": "Return routing rules for the specified integrations. Integrations without a configured rule are omitted from the response.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/route-list", - "metadata": { - "sidebarTitle": "List routing rules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListRoutesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "integration_id": 6113996590131, - "cases": [ - { - "if": [ - { - "key": "labels.check", - "oper": "IN", - "vals": [ - "cpu.idle<20%" - ] - } - ], - "channel_ids": [ - 2533748993131 - ], - "fallthrough": false, - "routing_mode": "standard" - } - ], - "default": { - "channel_ids": [ - 3521074710131 - ] - }, - "status": "enabled", - "version": 6, - "updated_by": 3790925372131, - "creator_id": 3790925372131, - "created_at": 1774606136, - "updated_at": 1774606136 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListRoutesRequest" - }, - "example": { - "integration_ids": [ - 6113996590131, - 6113996590132 - ] - } - } - } - } - } - }, - "/route/upsert": { - "post": { - "operationId": "routeUpsert", - "summary": "Upsert routing rule", - "description": "Create or update routing rules for an integration to direct alerts to specific channels. At least one of `cases` or `default` must be provided.", - "tags": [ - "On-call/Channels" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/channels/route-upsert", - "metadata": { - "sidebarTitle": "Upsert routing rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertRouteRequest" - }, - "example": { - "integration_id": 6113996590131, - "cases": [ - { - "if": [ - { - "key": "severity", - "oper": "IN", - "vals": [ - "Critical" - ] - } - ], - "channel_ids": [ - 3521074710131 - ], - "fallthrough": false, - "routing_mode": "standard" - } - ], - "default": { - "channel_ids": [ - 3521074710131 - ] - } - } - } - } - } - } - }, - "/alert/list": { - "post": { - "operationId": "alert-read-list", - "summary": "List alerts", - "description": "Return a cursor-paginated list of alerts matching the given filters.", - "tags": [ - "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`) |\n\n## Usage\n\n- Both `start_time` and `end_time` are required Unix epoch seconds. Maximum span is 31 days.\n- Use `search_after_ctx` from the previous response to fetch the next page.\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" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "has_next_page": false, - "items": [ - { - "alert_id": "663a1b2c3d4e5f6789abcdef", - "integration_id": 10001, - "channel_id": 20001, - "account_id": 10023, - "title": "CPU usage > 90%", - "alert_severity": "Critical", - "alert_status": "Critical", - "start_time": 1712650000, - "last_time": 1712655000, - "end_time": 0, - "labels": { - "host": "web-01" - }, - "ever_muted": false, - "created_at": 1712650000, - "updated_at": 1712655000, - "integration_name": "Prometheus", - "integration_type": "prometheus", - "channel_name": "Production", - "event_cnt": 3 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertListRequest" - }, - "example": { - "start_time": 1712620800, - "end_time": 1712707200, - "limit": 20, - "is_active": true - } - } - } - } - } - }, - "/alert/info": { - "post": { - "operationId": "alert-read-info", - "summary": "Get alert detail", - "description": "Return the full details of a single alert by its ID, including its associated incident and event count.", - "tags": [ - "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`) |\n\n## Usage\n\n- `alert_id` is an ObjectID hex string returned by `POST /alert/list` or `POST /alert-event/list`.", - "href": "/en/api-reference/on-call/alerts/alert-read-info", - "metadata": { - "sidebarTitle": "Get alert detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "alert_id": "663a1b2c3d4e5f6789abcdef", - "title": "CPU usage > 90%", - "alert_severity": "Critical", - "alert_status": "Critical", - "start_time": 1712650000, - "event_cnt": 3 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertInfoRequest" - }, - "example": { - "alert_id": "663a1b2c3d4e5f6789abcdef" - } - } - } - } - } - }, - "/alert/list-by-ids": { - "post": { - "operationId": "alert-read-list-by-ids", - "summary": "List alerts by IDs", - "description": "Return the details of multiple alerts by their IDs in a single request. Note: this endpoint does not paginate — `total` and `has_next_page` are always `0`/`false` and `search_after_ctx` is never set.", - "tags": [ - "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`) |\n\n## Usage\n\n- All provided `alert_ids` must belong to the caller's account; any invalid ID causes the entire request to fail.", - "href": "/en/api-reference/on-call/alerts/alert-read-list-by-ids", - "metadata": { - "sidebarTitle": "List alerts by IDs" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 0, - "has_next_page": false, - "items": [ - { - "alert_id": "663a1b2c3d4e5f6789abcdef", - "title": "CPU usage > 90%" - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertListByIDsRequest" - }, - "example": { - "alert_ids": [ - "663a1b2c3d4e5f6789abcdef" - ] - } - } - } - } - } - }, - "/alert/event/list": { - "post": { - "operationId": "alert-read-event-list", - "summary": "List events for an alert", - "description": "Return raw events for an alert with cursor or page-number pagination.", - "tags": [ - "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`) |\n\n## Usage\n\n- Results are newest-first by default. Set `asc=true` to read events oldest-first.\n- Use `limit` with `search_after_ctx` from the previous response to fetch the next page.\n- Classic page-number pagination is also supported with `p`, but `p * limit` must stay within 10,000 records.\n- Each alert can accumulate a large raw event history; prefer cursor pagination for hot alerts.", - "href": "/en/api-reference/on-call/alerts/alert-read-event-list", - "metadata": { - "sidebarTitle": "List events for an alert" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertEventListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 57, - "has_next_page": true, - "search_after_ctx": "663a1b2c3d4e5f6789abc001", - "items": [ - { - "event_id": "663a1b2c3d4e5f6789abc001", - "alert_id": "663a1b2c3d4e5f6789abcdef", - "title": "CPU usage > 90%", - "event_severity": "Critical", - "event_status": "Critical", - "event_time": 1712650000, - "labels": { - "host": "web-01" - } - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertEventListRequest" - }, - "example": { - "alert_id": "663a1b2c3d4e5f6789abcdef", - "limit": 20 - } - } - } - } - } - }, - "/alert/feed": { - "post": { - "operationId": "alert-read-feed", - "summary": "List alert activity feed", - "description": "Return the activity feed (comments, state changes, merges, silence events) for a single alert, with page-based pagination.", - "tags": [ - "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`) |\n\n## Usage\n\n- Use `p` (page number, starting at 1) and `limit` (max 100, default 20) for pagination.\n- Set `asc` to `true` for chronological order.\n- Use `types` to filter by specific feed types (e.g. `a_comm`, `a_merge`).", - "href": "/en/api-reference/on-call/alerts/alert-read-feed", - "metadata": { - "sidebarTitle": "List alert activity feed" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertFeedResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "has_next_page": false, - "items": [ - { - "ref_id": "663a1b2c3d4e5f6789abcdef", - "type": "a_comm", - "detail": { - "comment": "Investigating now." - }, - "creator_id": 80011, - "created_at": 1712651000 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertFeedRequest" - }, - "example": { - "alert_id": "663a1b2c3d4e5f6789abcdef", - "limit": 20, - "asc": false - } - } - } - } - } - }, - "/alert/merge": { - "post": { - "operationId": "alert-write-merge", - "summary": "Merge alerts into an incident", - "description": "Associate one or more alerts with an existing incident. If a source alert previously belonged to a different incident and that incident becomes empty after the merge, it will be automatically closed.", - "tags": [ - "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`) |\n\n## Usage\n\n- All `alert_ids` and the `incident_id` must belong to the caller's account.\n- Optionally set `title` and `owner_id` to update the target incident at the same time.", - "href": "/en/api-reference/on-call/alerts/alert-write-merge", - "metadata": { - "sidebarTitle": "Merge alerts into an incident" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertMergeRequest" - }, - "example": { - "alert_ids": [ - "663a1b2c3d4e5f6789abcdef" - ], - "incident_id": "663a000000000000deadbeef" - } - } - } - } - } - }, - "/alert/pipeline/info": { - "post": { - "operationId": "alert-read-pipeline-info", - "summary": "Get alert pipeline", - "description": "Return the alert processing pipeline configured for a specific integration.", - "tags": [ - "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 | **Integrations Read** (`on-call`) |\n\n## Usage\n\n- Returns `null` data if no pipeline has been configured for the given integration.\n- Requires the caller to have access to the integration.", - "href": "/en/api-reference/on-call/alerts/alert-read-pipeline-info", - "metadata": { - "sidebarTitle": "Get alert pipeline" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertPipelineItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "integration_id": 10001, - "rules": [ - { - "kind": "title_reset", - "if": [ - { - "key": "labels.env", - "oper": "IN", - "vals": [ - "prod" - ] - } - ], - "settings": { - "title": "[TPL]{{.Labels.service}} / {{.Labels.check}}" - } - }, - { - "kind": "severity_reset", - "if": null, - "settings": { - "severity": "Warning" - } - } - ], - "status": "enabled", - "creator_id": 80011, - "updated_by": 80011, - "created_at": 1710000000, - "updated_at": 1712000000 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertPipelineInfoRequest" - }, - "example": { - "integration_id": 10001 - } - } - } - } - } - }, - "/alert/pipeline/list": { - "post": { - "operationId": "alert-read-pipeline-list", - "summary": "List alert pipelines", - "description": "Return the alert processing pipelines configured for multiple integrations.", - "tags": [ - "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 | **Integrations Read** (`on-call`) |\n\n## Usage\n\n- All `integration_ids` must be accessible to the caller.", - "href": "/en/api-reference/on-call/alerts/alert-read-pipeline-list", - "metadata": { - "sidebarTitle": "List alert pipelines" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertPipelineListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "integration_id": 10001, - "rules": [ - { - "kind": "alert_inhibit", - "if": [ - { - "key": "labels.cluster", - "oper": "IN", - "vals": [ - "prod-cn" - ] - } - ], - "settings": { - "equals": [ - "service" - ], - "source_filters": [ - { - "key": "alert_severity", - "oper": "IN", - "vals": [ - "Critical" - ] - } - ] - } - } - ], - "status": "enabled", - "creator_id": 80011, - "updated_by": 80011, - "created_at": 1710000000, - "updated_at": 1712000000 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertPipelineListRequest" - }, - "example": { - "integration_ids": [ - 10001, - 10002 - ] - } - } - } - } - } - }, - "/alert/pipeline/upsert": { - "post": { - "operationId": "alert-write-pipeline-upsert", - "summary": "Create or update alert pipeline", - "description": "Set the alert processing pipeline for an integration. Replaces the existing configuration entirely.", - "tags": [ - "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 | **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- Maximum 50 rules per pipeline.\n- Each rule has a `kind` (one of `title_reset`, `description_reset`, `severity_reset`, `alert_drop`, `alert_inhibit`), an optional `if` filter, and `settings` specific to the kind.\n- The `alert_inhibit` kind requires the Standard license or higher.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alerts/alert-write-pipeline-upsert", - "metadata": { - "sidebarTitle": "Create or update alert pipeline" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertPipelineUpsertRequest" - }, - "example": { - "integration_id": 10001, - "rules": [ - { - "kind": "title_reset", - "if": [ - { - "key": "labels.env", - "oper": "IN", - "vals": [ - "prod" - ] - } - ], - "settings": { - "title": "[TPL]{{.Labels.service}} / {{.Labels.check}}" - } - }, - { - "kind": "severity_reset", - "if": null, - "settings": { - "severity": "Warning" - } - } - ] - } - } - } - } - } - }, - "/alert-event/list": { - "post": { - "operationId": "alert-event-read-list", - "summary": "List raw alert events", - "description": "Return a cursor-paginated list of raw alert events across all alerts, with filtering by integration, channel, time range, and severity.", - "tags": [ - "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`) |\n\n## Usage\n\n- Results are filtered by the caller's channel data-access permissions.\n- `severities` is a comma-separated string, e.g. `\"Critical,Warning\"`.", - "href": "/en/api-reference/on-call/alerts/alert-event-read-list", - "metadata": { - "sidebarTitle": "List raw alert events" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertEventGlobalListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "has_next_page": false, - "items": [ - { - "event_id": "663a1b2c3d4e5f6789abc001", - "alert_id": "663a1b2c3d4e5f6789abcdef", - "title": "CPU usage > 90%", - "event_severity": "Critical", - "event_time": 1712650000 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertEventGlobalListRequest" - }, - "example": { - "start_time": 1712620800, - "end_time": 1712707200, - "limit": 20, - "severities": "Critical" - } - } - } - } - } - }, - "/webhook/history/list": { - "post": { - "operationId": "webhookHistoryList", - "summary": "List webhook delivery history", - "description": "List the delivery history for outbound webhook notifications.", - "tags": [ - "On-call/Integrations" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) |", - "href": "/en/api-reference/on-call/integrations/webhook-history-list", - "metadata": { - "sidebarTitle": "List webhook delivery history" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListWebhookHistoryResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "integration_id": 5321026051131, - "event_id": "20260412Xatt9hrXsgmFkBR78WF655", - "webhook_type": "alert", - "event_type": "a_update", - "channel_id": 2551105804131, - "ref_id": "69da3f0ef77b1b51f40e83cc", - "endpoint": "https://example.com/webhook", - "attempt": 1, - "duration": 132, - "status": "success", - "status_code": 200, - "event_time": "2026-04-12 13:31:11.357472" - } - ], - "search_after_ctx": "eyJldmVudF90aW1lIjoiMjAyNi0wNC0xMlQxMzoxNToyNi4zODI1NDcrMDg6MDAiLCJldmVudF9pZCI6IjIwMjYwNDEybUdzeFAzZHJwRmZzNFpDUWQycFNEcCJ9", - "total": 346 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListWebhookHistoryRequest" - }, - "example": { - "limit": 20, - "start_time": 1775116800000, - "end_time": 1775203200000, - "integration_id": 6113996590131, - "status": "success" - } - } - } - } - } - }, - "/webhook/history/detail": { - "post": { - "operationId": "webhookHistoryDetail", - "summary": "Get webhook delivery detail", - "description": "Retrieve the detailed payload and response for a specific webhook delivery attempt.", - "tags": [ - "On-call/Integrations" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) |", - "href": "/en/api-reference/on-call/integrations/webhook-history-detail", - "metadata": { - "sidebarTitle": "Get webhook delivery detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/WebhookHistoryDetail" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "integration_id": 5321026051131, - "event_id": "20260412Xatt9hrXsgmFkBR78WF655", - "webhook_type": "alert", - "event_type": "a_update", - "channel_id": 2551105804131, - "ref_id": "69da3f0ef77b1b51f40e83cc", - "request_headers": "{\"Content-Type\":\"application/json\"}", - "request_body": "{\"event_type\":\"a_update\",\"event_id\":\"d789d65951c0532ea9b6a1d99b707054\"}", - "endpoint": "https://example.com/webhook", - "attempt": 1, - "duration": 132, - "status": "success", - "status_code": 200, - "response_headers": "{\"Content-Type\":\"application/json\"}", - "response_body": "{\"ok\":true}", - "event_time": "2026-04-12 13:31:11.357472", - "ref_title": "High CPU Usage on host-01", - "channel_name": "Production Alerts" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetWebhookHistoryDetailRequest" - }, - "example": { - "event_id": "20260412Xatt9hrXsgmFkBR78WF655", - "integration_id": 6113996590131 - } - } - } - } - } - }, - "/schedule/create": { - "post": { - "operationId": "scheduleCreate", - "summary": "Create schedule", - "description": "Create a new on-call schedule (escalation rule schedule).", - "tags": [ - "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 | **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-create", - "metadata": { - "sidebarTitle": "Create schedule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleIDResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "schedule_id": 6294534917601 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleUpsertRequest" - }, - "example": { - "schedule_name": "Production On-Call", - "description": "Primary on-call rotation for the production team", - "team_id": 4291079133131, - "layers": [ - { - "layer_name": "Layer 1", - "name": "Layer 1", - "mode": 0, - "weight": 0, - "hidden": 0, - "groups": [ - { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2451002751131 - ] - } - ], - "start": 0, - "end": 0 - }, - { - "group_name": "B", - "name": "B", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2476123212131 - ] - } - ], - "start": 0, - "end": 0 - } - ], - "rotation_unit": "day", - "rotation_value": 1, - "rotation_duration": 86400, - "handoff_time": 0, - "enable_time": 1712000000, - "expire_time": 0, - "restrict_mode": 0, - "restrict_start": 0, - "restrict_end": 0, - "restrict_periods": [], - "day_mask": { - "repeat": [ - 1, - 2, - 3, - 4, - 5 - ] - }, - "fair_rotation": false, - "mask_continuous_enabled": false - } - ], - "notify": { - "advance_in_time": 300, - "fixed_time": null, - "by": { - "follow_preference": true, - "personal_channels": null - }, - "webhooks": null - } - } - } - } - } - } - }, - "/schedule/update": { - "post": { - "operationId": "scheduleUpdate", - "summary": "Update schedule", - "description": "Update an existing on-call schedule. Provide schedule_id to identify the schedule.", - "tags": [ - "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 | **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-update", - "metadata": { - "sidebarTitle": "Update schedule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleUpsertRequest" - }, - "example": { - "schedule_id": 2001, - "schedule_name": "Production On-Call (Updated)", - "description": "Updated primary on-call rotation", - "team_id": 4291079133131 - } - } - } - } - } - }, - "/schedule/preview": { - "post": { - "operationId": "schedulePreview", - "summary": "Preview schedule", - "description": "Preview the coverage generated by a schedule configuration without persisting it. The request accepts the same body as create/update plus a required start/end window (max 45 days).", - "tags": [ - "On-call/Schedules" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **60 requests/minute**; **10 requests/second** per account |\n| Permissions | **Schedules Read** (`on-call`) or **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-preview", - "metadata": { - "sidebarTitle": "Preview schedule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": null, - "name": null, - "account_id": 0, - "group_id": null, - "disabled": null, - "create_at": 0, - "create_by": 0, - "update_at": 0, - "update_by": 0, - "layers": [ - { - "account_id": 0, - "name": "Layer 1", - "schedule_id": 0, - "hidden": 0, - "mode": 0, - "weight": 0, - "groups": [ - { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2451002751131 - ] - } - ], - "start": 0, - "end": 0 - }, - { - "group_name": "B", - "name": "B", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2476123212131 - ] - } - ], - "start": 0, - "end": 0 - } - ], - "rotation_duration": 86400, - "handoff_time": 0, - "enable_time": 1775980800, - "expire_time": 0, - "restrict_mode": 0, - "restrict_start": 0, - "restrict_end": 0, - "restrict_periods": [], - "day_mask": { - "repeat": [ - 1, - 2, - 3, - 4, - 5 - ] - }, - "create_at": 0, - "create_by": 0, - "update_at": 0, - "update_by": 0, - "layer_name": "Layer 1", - "fair_rotation": false, - "layer_start": 1775980800, - "layer_end": null, - "rotation_unit": "day", - "rotation_value": 1, - "mask_continuous_enabled": false - } - ], - "schedule_layers": [ - { - "layer_name": "Layer 1", - "name": "Layer 1", - "mode": 0, - "schedules": [ - { - "start": 1776009600, - "end": 1776096000, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2451002751131 - ] - } - ], - "start": 1776009600, - "end": 1776096000 - }, - "index": 0 - }, - { - "start": 1776096000, - "end": 1776182400, - "group": { - "group_name": "B", - "name": "B", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2476123212131 - ] - } - ], - "start": 1776096000, - "end": 1776182400 - }, - "index": 0 - } - ] - } - ], - "final_schedule": { - "layer_name": "", - "name": "", - "mode": 0, - "schedules": [ - { - "start": 1776009600, - "end": 1776096000, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2451002751131 - ] - } - ], - "start": 1776009600, - "end": 1776096000 - }, - "index": 0 - } - ] - }, - "start": 1775980800, - "end": 1776240000, - "notify": null, - "schedule_id": 0, - "schedule_name": null, - "team_id": null, - "description": null, - "layer_schedules": null, - "status": null, - "cur_oncall": null, - "next_oncall": null - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleUpsertRequest" - }, - "example": { - "schedule_name": "Preview Schedule", - "start": 1712000000, - "end": 1712086400, - "layers": [ - { - "layer_name": "Layer 1", - "name": "Layer 1", - "mode": 0, - "weight": 0, - "hidden": 0, - "groups": [ - { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2451002751131 - ] - } - ], - "start": 0, - "end": 0 - } - ], - "rotation_unit": "day", - "rotation_value": 1, - "rotation_duration": 86400, - "handoff_time": 0, - "enable_time": 1712000000, - "expire_time": 0, - "restrict_mode": 0, - "restrict_start": 0, - "restrict_end": 0, - "restrict_periods": [], - "day_mask": { - "repeat": [ - 1, - 2, - 3, - 4, - 5 - ] - }, - "fair_rotation": false, - "mask_continuous_enabled": false - } - ] - } - } - } - } - } - }, - "/schedule/delete": { - "post": { - "operationId": "scheduleDelete", - "summary": "Delete schedules", - "description": "Delete one or more on-call schedules by ID.", - "tags": [ - "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 | **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-delete", - "metadata": { - "sidebarTitle": "Delete schedules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleIDsBodyRequest" - }, - "example": { - "schedule_ids": [ - 2001 - ] - } - } - } - } - } - }, - "/schedule/info": { - "post": { - "operationId": "scheduleInfo", - "summary": "Get schedule info", - "description": "Return details of an on-call schedule including the computed schedule layers for the requested time window (max 45 days).", - "tags": [ - "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 | **Schedules Read** (`on-call`) or **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-info", - "metadata": { - "sidebarTitle": "Get schedule info" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 5789640530410, - "name": "test-000001", - "account_id": 2451002751131, - "group_id": 4291079133131, - "disabled": 0, - "create_at": 1766110836, - "create_by": 2476123212131, - "update_at": 1775205795, - "update_by": 2476123212131, - "layers": [ - { - "account_id": 2451002751131, - "name": "Layer 1", - "schedule_id": 5789640530410, - "hidden": 0, - "mode": 0, - "weight": 0, - "groups": [ - { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 3122470302131 - ] - } - ], - "start": 0, - "end": 0 - }, - { - "group_name": "B", - "name": "B", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2659460982131 - ] - } - ], - "start": 0, - "end": 0 - } - ], - "rotation_duration": 86400, - "handoff_time": 0, - "enable_time": 1767542400, - "expire_time": 0, - "restrict_mode": 0, - "restrict_start": 0, - "restrict_end": 0, - "restrict_periods": [], - "day_mask": { - "repeat": [ - 1, - 2, - 3, - 4, - 5 - ] - }, - "create_at": 1775205795, - "create_by": 2476123212131, - "update_at": 1775205795, - "update_by": 2476123212131, - "layer_name": "Layer 1", - "fair_rotation": false, - "layer_start": 1767542400, - "layer_end": null, - "rotation_unit": "day", - "rotation_value": 1, - "mask_continuous_enabled": false - } - ], - "schedule_layers": [ - { - "layer_name": "Layer 1", - "name": "Layer 1", - "mode": 0, - "schedules": [ - { - "start": 1776009600, - "end": 1776096000, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 3122470302131 - ] - } - ], - "start": 1776009600, - "end": 1776096000 - }, - "index": 0 - }, - { - "start": 1776096000, - "end": 1776182400, - "group": { - "group_name": "B", - "name": "B", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2659460982131 - ] - } - ], - "start": 1776096000, - "end": 1776182400 - }, - "index": 0 - } - ] - } - ], - "final_schedule": { - "layer_name": "", - "name": "", - "mode": 0, - "schedules": [ - { - "start": 1776009600, - "end": 1776096000, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 3122470302131 - ] - } - ], - "start": 1776009600, - "end": 1776096000 - }, - "index": 0 - } - ] - }, - "notify": { - "advance_in_time": 300, - "fixed_time": null, - "by": { - "follow_preference": false, - "personal_channels": [ - "email" - ] - }, - "webhooks": [ - { - "type": "feishu_app", - "settings": { - "token": "", - "alias": "", - "data_source_id": 5427276014131, - "chat_ids": [ - "oc_60a6dc4c6e4e5cbc4934ef08aa7ff76d" - ], - "verify_token": "", - "sign_secret": "" - } - } - ] - }, - "schedule_id": 5789640530410, - "schedule_name": "test-000001", - "team_id": 4291079133131, - "description": "abc", - "layer_schedules": [ - { - "layer_name": "Layer 1", - "name": "Layer 1", - "mode": 0, - "schedules": [ - { - "start": 1776009600, - "end": 1776096000, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 3122470302131 - ] - } - ], - "start": 1776009600, - "end": 1776096000 - }, - "index": 0 - } - ] - } - ], - "status": 0, - "cur_oncall": { - "start": 1775972040, - "end": 1776009600, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2451002751131 - ] - } - ], - "start": 1775972040, - "end": 1776009600 - }, - "update_at": 0, - "weight": 0, - "index": 0 - }, - "next_oncall": { - "start": 1776009600, - "end": 1776096000, - "group": { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 3122470302131 - ] - } - ], - "start": 1776009600, - "end": 1776096000 - }, - "update_at": 0, - "weight": 0, - "index": 0 - } - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "event_id": { + "description": "Event ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "event_severity": { + "description": "Severity of this event: `Critical`, `Warning`, or `Info`. An event never carries `Ok` as severity — `Ok` appears only as `event_status`.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "event_status": { + "description": "Status carried by this event: `Critical`/`Warning`/`Info` for a firing event, `Ok` for a recovery event.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleInfoRequest" - }, - "example": { - "schedule_id": 2001, - "start": 1712000000, - "end": 1712086400 - } - } - } - } - } - }, - "/schedule/list": { - "post": { - "operationId": "scheduleList", - "summary": "List schedules", - "description": "Return a paginated list of on-call schedules. When both start and end are provided (max 45 days apart), computed layer schedules are included.", - "tags": [ - "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 |", - "href": "/en/api-reference/on-call/schedules/schedule-list", - "metadata": { - "sidebarTitle": "List schedules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "id": 5789640530410, - "name": "test-000001", - "account_id": 2451002751131, - "group_id": 4291079133131, - "disabled": 0, - "create_at": 1766110836, - "create_by": 2476123212131, - "update_at": 1775205795, - "update_by": 2476123212131, - "layers": null, - "schedule_layers": null, - "final_schedule": { - "layer_name": "", - "name": "", - "mode": 0, - "schedules": null - }, - "notify": { - "advance_in_time": 300, - "fixed_time": null, - "by": { - "follow_preference": false, - "personal_channels": [ - "email" - ] - }, - "webhooks": [ - { - "type": "feishu_app", - "settings": { - "token": "", - "alias": "", - "data_source_id": 5427276014131, - "chat_ids": [ - "oc_60a6dc4c6e4e5cbc4934ef08aa7ff76d" - ], - "verify_token": "", - "sign_secret": "" - } - } - ] - }, - "schedule_id": 5789640530410, - "schedule_name": "test-000001", - "team_id": 4291079133131, - "description": "abc", - "layer_schedules": null, - "status": 0, - "cur_oncall": null, - "next_oncall": null - }, - { - "id": 5432326025106, - "name": "test-2509300001", - "account_id": 2451002751131, - "group_id": 2477033058131, - "disabled": 0, - "create_at": 1759132037, - "create_by": 2476123212131, - "update_at": 1775207501, - "update_by": 2476123212131, - "layers": null, - "schedule_layers": null, - "final_schedule": { - "layer_name": "", - "name": "", - "mode": 0, - "schedules": null - }, - "notify": { - "advance_in_time": 300, - "fixed_time": null, - "by": { - "follow_preference": true, - "personal_channels": null - }, - "webhooks": null - }, - "schedule_id": 5432326025106, - "schedule_name": "test-2509300001", - "team_id": 2477033058131, - "description": "", - "layer_schedules": null, - "status": 0, - "cur_oncall": null, - "next_oncall": null - } - ], - "total": 41 - } - } - } - } + "event_time": { + "description": "Event timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "images": { + "description": "Images attached to the event.", + "items": { + "$ref": "#/components/schemas/AlertImage" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "integration_id": { + "description": "Integration that produced this event.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_type": { + "description": "Type/plugin key of the integration that produced this event.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Label key-value pairs.", + "type": "object" + }, + "title": { + "description": "Event title.", + "type": "string" + }, + "title_rule": { + "description": "Title template used to derive `title` from labels.", + "type": "string" + }, + "updated_at": { + "description": "Record update time, Unix epoch seconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleListRequest" - }, - "example": { - "p": 1, - "limit": 20, - "query": "production", - "is_my_team": true - } - } + "type": "object" + }, + "AlertEventListRequest": { + "properties": { + "alert_id": { + "description": "Alert ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "asc": { + "default": false, + "description": "When true, return events oldest-first. Defaults to newest-first.", + "type": "boolean" + }, + "limit": { + "default": 20, + "description": "Page size. Defaults to 20 and cannot exceed 100.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "p": { + "default": 1, + "description": "Page number starting at 1. Used when `search_after_ctx` is omitted.", + "format": "int64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "search_after_ctx": { + "description": "Cursor returned by the previous page. When supplied, cursor pagination is used instead of page-number pagination.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": [ + "string", + "null" + ] } - } - } - }, - "/schedule/self": { - "post": { - "operationId": "scheduleSelf", - "summary": "List my schedules", - "description": "Return on-call schedules where the current user is assigned.", - "tags": [ - "On-call/Schedules" + }, + "required": [ + "alert_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Schedules Read** (`on-call`) or **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-self", - "metadata": { - "sidebarTitle": "List my schedules" + "type": "object" + }, + "AlertEventListResponse": { + "properties": { + "has_next_page": { + "description": "Whether another page is available.", + "type": "boolean" + }, + "items": { + "description": "Raw alert events in the requested order.", + "items": { + "$ref": "#/components/schemas/AlertEventItem" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor to pass as `search_after_ctx` for the next page. Omitted when the page is empty; in cursor mode also omitted when there is no next page.", + "type": "string" + }, + "total": { + "description": "Total matching event count, capped at 1000.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleSelfResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "id": 2539108069860, - "name": "Open Source Q&A", - "account_id": 2451002751131, - "group_id": 2477033058131, - "disabled": 0, - "create_at": 1702623874, - "create_by": 2451002751131, - "update_at": 1710468081, - "update_by": 2476444212131, - "layers": [ - { - "account_id": 2451002751131, - "name": "Rule 1", - "schedule_id": 2539108069860, - "hidden": 0, - "mode": 0, - "weight": 0, - "groups": [ - { - "group_name": "A", - "name": "A", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2476444212131 - ] - } - ], - "start": 0, - "end": 0 - }, - { - "group_name": "B", - "name": "B", - "members": [ - { - "role_id": 0, - "person_ids": [ - 2469167612131 - ] - } - ], - "start": 0, - "end": 0 - } - ], - "rotation_duration": 86400, - "handoff_time": 0, - "enable_time": 1702623874, - "expire_time": 0, - "restrict_mode": 0, - "restrict_start": 0, - "restrict_end": 0, - "restrict_periods": [], - "day_mask": { - "repeat": [ - 1, - 2, - 3, - 4, - 5 - ] - }, - "create_at": 1702623874, - "create_by": 2451002751131, - "update_at": 1710468081, - "update_by": 2476444212131, - "layer_name": "Rule 1", - "fair_rotation": false, - "layer_start": 1702623874, - "layer_end": null, - "rotation_unit": "day", - "rotation_value": 1, - "mask_continuous_enabled": false - } - ], - "schedule_layers": null, - "final_schedule": { - "layer_name": "", - "name": "", - "mode": 0, - "schedules": null - }, - "notify": { - "fixed_time": null, - "by": null, - "webhooks": null - }, - "schedule_id": 2539108069860, - "schedule_name": "Open Source Q&A", - "team_id": 2477033058131, - "description": "", - "layer_schedules": null, - "status": 0, - "cur_oncall": null, - "next_oncall": null - } - ] - } - } - } - } + "required": [ + "items", + "total", + "has_next_page" + ], + "type": "object" + }, + "AlertFeedRequest": { + "properties": { + "alert_id": { + "description": "Alert ID (ObjectID hex string); obtain it from `POST /alert/list`.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "asc": { + "description": "Sort ascending.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "limit": { + "description": "Page size, max 100, default 20.", + "format": "int64", + "maximum": 100, + "minimum": 1, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "p": { + "default": 1, + "description": "Page number, starting at 1.", + "format": "int64", + "minimum": 1, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "types": { + "description": "Filter by feed type codes — see the `type` field of the response items for the full list (e.g. `a_new`, `a_comm`, `a_merge`).", + "items": { + "type": "string" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleSelfRequest" - }, - "example": { - "start": 1712000000, - "end": 1712086400 - } - } + "required": [ + "alert_id" + ], + "type": "object" + }, + "AlertFeedResponse": { + "properties": { + "has_next_page": { + "description": "Whether a next page exists.", + "type": "boolean" + }, + "items": { + "description": "Alert feed records on the current page.", + "items": { + "$ref": "#/components/schemas/FeedItem" + }, + "type": "array" } - } - } - }, - "/schedule/infos": { - "post": { - "operationId": "scheduleInfos", - "summary": "Batch get schedules", - "description": "Return details of multiple on-call schedules by their IDs.", - "tags": [ - "On-call/Schedules" + }, + "type": "object" + }, + "AlertFeedType": { + "description": "Alert activity feed entry type. Each value identifies one alert lifecycle event; the matching `detail` payload shape is determined by this field.\n\n| Type | Meaning |\n|---|---|\n| `a_new` | Alert triggered by an incoming event. |\n| `a_update` | Alert severity or status changed on an incoming event. |\n| `a_comm` | Comment added on the alert. |\n| `a_merge` | Alert merged into an incident. |\n| `a_m_silence` | Alert muted by a silence rule. |\n| `a_m_inhibit` | Alert muted by an inhibit rule. |\n| `a_m_flapping` | Alert muted by flapping detection (historical data only; no longer produced). |\n| `a_ack` | Alert acknowledged (historical data only; alert-level acknowledgement has been removed). |\n| `a_unack` | Alert acknowledgement revoked (historical data only). |\n| `a_close` | Alert closed (historical data only; no longer produced). |", + "enum": [ + "a_new", + "a_update", + "a_comm", + "a_merge", + "a_m_silence", + "a_m_inhibit", + "a_m_flapping", + "a_ack", + "a_unack", + "a_close" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Schedules Read** (`on-call`) or **Schedules Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/schedules/schedule-infos", - "metadata": { - "sidebarTitle": "Batch get schedules" + "type": "string" + }, + "AlertImage": { + "description": "An image attachment on an alert or event.", + "properties": { + "alt": { + "description": "Alt text.", + "type": "string" + }, + "href": { + "description": "Optional link URL when the image is clicked.", + "type": "string" + }, + "src": { + "description": "Image source URL or internal image reference (starts with `img_` or `http`).", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ScheduleSelfResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "id": 5789640530410, - "name": "test-000001", - "account_id": 2451002751131, - "group_id": 4291079133131, - "disabled": 0, - "create_at": 1766110836, - "create_by": 2476123212131, - "update_at": 1775205795, - "update_by": 2476123212131, - "layers": null, - "schedule_layers": null, - "final_schedule": { - "layer_name": "", - "name": "", - "mode": 0, - "schedules": null - }, - "notify": { - "advance_in_time": 300, - "fixed_time": null, - "by": { - "follow_preference": false, - "personal_channels": [ - "email" - ] - }, - "webhooks": [ - { - "type": "feishu_app", - "settings": { - "token": "", - "alias": "", - "data_source_id": 5427276014131, - "chat_ids": [ - "oc_60a6dc4c6e4e5cbc4934ef08aa7ff76d" - ], - "verify_token": "", - "sign_secret": "" - } - } - ] - }, - "schedule_id": 5789640530410, - "schedule_name": "test-000001", - "team_id": 4291079133131, - "description": "abc", - "layer_schedules": null, - "status": 0, - "cur_oncall": null, - "next_oncall": null - } - ] - } - } - } - } + "required": [ + "src" + ], + "type": "object" + }, + "AlertInfo": { + "description": "Detailed alert item.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" + }, + "alert_id": { + "description": "Alert ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "alert_key": { + "description": "Deduplication key used to merge events into the alert.", + "type": "string" + }, + "alert_severity": { + "description": "Current severity.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" + }, + "alert_status": { + "description": "Current status.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" + }, + "channel_id": { + "description": "Channel ID.", + "format": "int64", + "type": "integer" + }, + "channel_name": { + "description": "Channel display name.", + "type": "string" + }, + "channel_status": { + "description": "Channel status.", + "type": "string" + }, + "created_at": { + "description": "Creation timestamp (seconds).", + "format": "int64", + "type": "integer" + }, + "data_source_id": { + "description": "Deprecated. Use `integration_id` instead.", + "format": "int64", + "type": "integer" + }, + "data_source_name": { + "description": "Deprecated. Use `integration_name`.", + "type": "string" + }, + "data_source_ref_id": { + "description": "Deprecated. Use `integration_ref_id`.", + "type": "string" + }, + "data_source_type": { + "description": "Deprecated. Use `integration_type`.", + "type": "string" + }, + "deleted_at": { + "description": "Soft-delete timestamp (seconds). Zero if not deleted.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Alert description.", + "type": "string" + }, + "end_time": { + "description": "Unix timestamp (seconds) when the alert recovered. 0 if still active.", + "format": "int64", + "type": "integer" + }, + "event_cnt": { + "description": "Total number of raw events merged into this alert.", + "format": "int64", + "type": "integer" + }, + "events": { + "description": "Raw alert event preview, populated only when requested. Capped at the 20 newest events per alert.", + "items": { + "$ref": "#/components/schemas/AlertEventItem" + }, + "type": "array" + }, + "ever_muted": { + "description": "Whether this alert has ever been silenced.", + "type": "boolean" + }, + "images": { + "description": "Attached images.", + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" + }, + "incident": { + "$ref": "#/components/schemas/IncidentShort", + "description": "Parent incident reference, if the alert has been merged into one." }, - "400": { - "$ref": "#/components/responses/BadRequest" + "integration_id": { + "description": "Integration ID that produced the alert.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "integration_name": { + "description": "Integration display name.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_ref_id": { + "description": "Integration reference ID.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "integration_type": { + "description": "Integration type string.", + "type": "string" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Alert labels.", + "type": "object" + }, + "last_time": { + "description": "Unix timestamp (seconds) of the most recent event.", + "format": "int64", + "type": "integer" + }, + "responder_email": { + "description": "Primary responder email, if any.", + "type": "string" + }, + "responder_name": { + "description": "Primary responder name, if any.", + "type": "string" + }, + "start_time": { + "description": "Unix timestamp (seconds) when the alert first fired.", + "format": "int64", + "type": "integer" + }, + "title": { + "description": "Alert title.", + "type": "string" + }, + "title_rule": { + "description": "Title rendering rule.", + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp (seconds).", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ScheduleIDsRequest" - }, - "example": { - "schedule_ids": [ - 2001, - 2002, - 2003 - ] - } - } - } - } - } - }, - "/calendar/create": { - "post": { - "operationId": "calendarCreate", - "summary": "Create calendar", - "description": "Create a personal service calendar. Each account is limited to 5 calendars unless the Flashcat-Break-Cal-Limit header is set.", - "tags": [ - "On-call/Calendars" + "required": [ + "alert_id", + "integration_id", + "data_source_id", + "channel_id", + "account_id", + "description", + "title", + "title_rule", + "alert_key", + "alert_severity", + "alert_status", + "start_time", + "last_time", + "end_time", + "labels", + "ever_muted", + "created_at", + "updated_at", + "integration_name", + "integration_type", + "integration_ref_id", + "channel_name", + "channel_status", + "responder_name", + "responder_email", + "event_cnt", + "images", + "data_source_name", + "data_source_ref_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/calendars/calendar-create", - "metadata": { - "sidebarTitle": "Create calendar" + "type": "object" + }, + "AlertInfoRequest": { + "properties": { + "alert_id": { + "description": "Alert ID (ObjectID hex string).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalendarCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "cal_name": "API Test Calendar" - } - } - } - } + "required": [ + "alert_id" + ], + "type": "object" + }, + "AlertItem": { + "description": "A single alert with full detail.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "alert_id": { + "description": "Unique alert ID (ObjectID hex string).", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "alert_key": { + "description": "Deduplication key.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "alert_severity": { + "description": "Current severity — the highest severity ever seen on this alert: `Critical`, `Warning`, or `Info`.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "alert_status": { + "description": "Current status: `Critical`/`Warning`/`Info` while firing, `Ok` once recovered.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" + }, + "channel_id": { + "description": "ID of the channel the alert belongs to.", + "format": "int64", + "type": "integer" + }, + "channel_name": { + "description": "Display name of the channel.", + "type": "string" + }, + "channel_status": { + "description": "Status of the channel: `enabled` or `disabled`.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "created_at": { + "description": "Creation timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" + }, + "data_source_id": { + "deprecated": true, + "description": "Deprecated: use `integration_id` instead.", + "format": "int64", + "type": "integer" + }, + "data_source_name": { + "deprecated": true, + "description": "Deprecated: use `integration_name` instead.", + "type": "string" + }, + "data_source_ref_id": { + "deprecated": true, + "description": "Deprecated: use `integration_ref_id` instead.", + "type": "string" + }, + "data_source_type": { + "deprecated": true, + "description": "Deprecated: use `integration_type` instead. Omitted when empty.", + "type": "string" + }, + "deleted_at": { + "description": "Soft-delete time, Unix epoch seconds. Omitted when the alert is not deleted.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Alert description.", + "type": "string" + }, + "end_time": { + "description": "Resolution time, Unix epoch seconds. 0 if still active.", + "format": "int64", + "type": "integer" + }, + "event_cnt": { + "description": "Total number of raw events received by this alert.", + "format": "int64", + "type": "integer" + }, + "events": { + "description": "Raw events of this alert. Omitted here; populated only by `POST /incident/alert/list`.", + "items": { + "$ref": "#/components/schemas/AlertEventItem" + }, + "type": "array" + }, + "ever_muted": { + "description": "True if this alert has ever been silenced.", + "type": "boolean" + }, + "images": { + "description": "Images attached to the alert.", + "items": { + "$ref": "#/components/schemas/AlertImage" + }, + "type": "array" + }, + "incident": { + "$ref": "#/components/schemas/IncidentShort", + "description": "Associated incident, if any." + }, + "integration_id": { + "description": "ID of the integration that produced this alert.", + "format": "int64", + "type": "integer" + }, + "integration_name": { + "description": "Display name of the integration.", + "type": "string" + }, + "integration_ref_id": { + "description": "External reference ID of the integration.", + "type": "string" + }, + "integration_type": { + "description": "Type/plugin key of the integration.", + "type": "string" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Label key-value pairs.", + "type": "object" + }, + "last_time": { + "description": "Last-event time, Unix epoch seconds.", + "format": "int64", + "type": "integer" + }, + "responder_email": { + "description": "Responder email. Always empty in this response — responder tracking lives on the associated incident.", + "type": "string" + }, + "responder_name": { + "description": "Responder display name. Always empty in this response — responder tracking lives on the associated incident.", + "type": "string" + }, + "start_time": { + "description": "First-seen time, Unix epoch seconds.", + "format": "int64", + "type": "integer" + }, + "title": { + "description": "Alert title.", + "type": "string" + }, + "title_rule": { + "description": "Title template used to derive `title` from the event labels (e.g. `$service::$cluster`).", + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalendarCreateRequest" - }, - "example": { - "cal_name": "Production On-Call Calendar", - "description": "Calendar for production on-call team", - "timezone": "Asia/Shanghai", - "workdays": [ - 1, - 2, - 3, - 4, - 5 - ] - } - } - } - } - } - }, - "/calendar/update": { - "post": { - "operationId": "calendarUpdate", - "summary": "Update calendar", - "description": "Update a personal service calendar. Only non-null fields are updated.", - "tags": [ - "On-call/Calendars" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/calendars/calendar-update", - "metadata": { - "sidebarTitle": "Update calendar" + "type": "object" + }, + "AlertListByIDsRequest": { + "properties": { + "alert_ids": { + "description": "Alert IDs (ObjectID hex strings) to fetch.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalendarEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "alert_ids" + ], + "type": "object" + }, + "AlertListRequest": { + "description": "Filter and pagination criteria for alert list queries. Time range is required.", + "properties": { + "alert_ids": { + "description": "Filter to specific alert IDs (ObjectID hex strings). Invalid IDs are ignored; if none are valid, the result is empty.", + "items": { + "type": "string" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "alert_keys": { + "description": "Filter by alert deduplication keys.", + "items": { + "type": "string" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "alert_severity": { + "description": "Comma-separated severity filter, e.g. `Critical,Warning`. Allowed values: `Critical`, `Warning`, `Info`, `Ok`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "asc": { + "description": "Sort ascending by `start_time` when `true`; default is descending.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" + "by_updated_at": { + "description": "When `true`, the time range filter is applied on `updated_at` rather than `start_time`.", + "type": "boolean" + }, + "channel_ids": { + "description": "Filter by channel IDs.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "end_time": { + "description": "End of the search window, Unix epoch seconds. Must be greater than `start_time`; the span must not exceed 31 days and must lie within the account's data retention period.", + "format": "int64", + "type": "integer" + }, + "ever_muted": { + "description": "Filter by whether the alert has ever been silenced.", + "type": [ + "boolean", + "null" + ] + }, + "integration_ids": { + "description": "Filter by integration IDs.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "is_active": { + "description": "Filter by lifecycle: `true` returns only firing alerts (status `Critical`/`Warning`/`Info`), `false` returns only recovered alerts (status `Ok`). Omit or pass `null` to return both.", + "type": [ + "boolean", + "null" + ] + }, + "limit": { + "description": "Page size. Max 100, default 20.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "p": { + "description": "Page number, starting at 1. Used when `search_after_ctx` is not provided; `p * limit` must stay within 10,000 records.", + "format": "int64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "search_after_ctx": { + "description": "Opaque cursor from the previous response for the next page.", + "type": [ + "string", + "null" + ] + }, + "start_time": { + "description": "Start of the search window, Unix epoch seconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalendarUpdateRequest" - }, - "example": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "cal_name": "Production On-Call Calendar (Updated)", - "timezone": "America/New_York", - "workdays": [ - 1, - 2, - 3, - 4, - 5 - ] - } - } - } - } - } - }, - "/calendar/delete": { - "post": { - "operationId": "calendarDelete", - "summary": "Delete calendar", - "description": "Delete a personal service calendar. The call fails when referenced by escalation or silence rules.", - "tags": [ - "On-call/Calendars" + "required": [ + "start_time", + "end_time" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/calendars/calendar-delete", - "metadata": { - "sidebarTitle": "Delete calendar" + "type": "object" + }, + "AlertListResponse": { + "description": "Paginated list of alerts.", + "properties": { + "has_next_page": { + "description": "True if more pages are available.", + "type": "boolean" + }, + "items": { + "description": "Alerts on the current page.", + "items": { + "$ref": "#/components/schemas/AlertItem" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor for the next page — the ObjectID hex of the last alert on this page; pass it back as `search_after_ctx`. Present only when `has_next_page` is true.", + "type": "string" + }, + "total": { + "description": "Total matching alerts, capped at 1000.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalendarEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AlertMergeRequest": { + "properties": { + "alert_ids": { + "description": "Alert IDs to merge (ObjectID hex strings); obtain them from `POST /alert/list`. Every ID must belong to the caller's account.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "comment": { + "description": "Optional comment recorded on the merge feed entry. At most 1024 characters.", + "maxLength": 1024, + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "incident_id": { + "description": "Target incident ID (ObjectID hex string); obtain it from `POST /incident/list`.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "owner_id": { + "description": "Member ID of the new owner for the target incident; obtain it from `POST /member/list`.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "Optional new title for the target incident. At most 512 characters.", + "maxLength": 512, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalendarIDRequest" + "required": [ + "alert_ids", + "incident_id" + ], + "type": "object" + }, + "AlertPipeline": { + "description": "A single alert processing rule.", + "properties": { + "if": { + "description": "AND-filter list — the rule applies only when every condition matches. `null` or omitted means the rule applies to all events.", + "items": { + "$ref": "#/components/schemas/FilterCondition" + }, + "type": [ + "array", + "null" + ] + }, + "kind": { + "description": "Rule type. Rules run in array order; when the `if` condition matches, the event is processed according to `kind`.\n| Value | Meaning |\n|---|---|\n| `title_reset` | Rewrites the event title from the `settings.title` template. |\n| `description_reset` | Rewrites the event description from the `settings.description` template. |\n| `severity_reset` | Resets the event severity and status to `settings.severity` (`Critical`/`Warning`/`Info`). |\n| `alert_drop` | Discards the matching event outright; no alert is created. |\n| `alert_inhibit` | Discards the event (inhibition) when an active source alert matching `settings.source_filters` and correlated via `settings.equals` exists. |", + "enum": [ + "title_reset", + "description_reset", + "severity_reset", + "alert_drop", + "alert_inhibit" + ], + "type": "string" + }, + "settings": { + "description": "Kind-specific settings. Shape depends on `kind`:\n- `title_reset`: `{ \"title\": \"\" }`\n- `description_reset`: `{ \"description\": \"\" }`\n- `severity_reset`: `{ \"severity\": \"Critical\"|\"Warning\"|\"Info\" }`\n- `alert_drop`: `{}` (empty object)\n- `alert_inhibit`: `{ \"equals\": [\"\", ...], \"source_filters\": }`", + "oneOf": [ + { + "$ref": "#/components/schemas/ApTitleReset" }, - "example": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM" + { + "$ref": "#/components/schemas/ApDescriptionReset" + }, + { + "$ref": "#/components/schemas/ApSeverityReset" + }, + { + "$ref": "#/components/schemas/ApAlertDrop" + }, + { + "$ref": "#/components/schemas/ApAlertInhibit" } - } + ], + "type": "object" } - } - } - }, - "/calendar/info": { - "post": { - "operationId": "calendarInfo", - "summary": "Get calendar info", - "description": "Return details of a service calendar.", - "tags": [ - "On-call/Calendars" + }, + "required": [ + "kind" ], - "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 |", - "href": "/en/api-reference/on-call/calendars/calendar-info", - "metadata": { - "sidebarTitle": "Get calendar info" + "type": "object" + }, + "AlertPipelineInfoRequest": { + "properties": { + "integration_id": { + "description": "Integration ID. Must be greater than 0.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalendarItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 2451002751131, - "team_id": 2477033058131, - "cal_id": "cal.eh9gvPtWeH3xXgKeVSRxRg", - "cal_name": "Stock Exchange Calendar", - "description": "A stock market trading calendar example", - "timezone": "Asia/Shanghai", - "kind": "personal", - "workdays": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6 - ], - "created_at": 1702455630, - "updated_at": 1775529526, - "creator_id": 2476444212131, - "updated_by": 3790925372131, - "status": "enabled" - } - } - } - } + "required": [ + "integration_id" + ], + "type": "object" + }, + "AlertPipelineItem": { + "description": "Alert processing pipeline for an integration.", + "properties": { + "created_at": { + "description": "Creation timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "creator_id": { + "description": "Member ID who created the pipeline.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "deleted_at": { + "description": "Soft-delete time, Unix epoch seconds. Omitted when not deleted.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_id": { + "description": "Integration ID this pipeline applies to.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rules": { + "description": "Ordered list of processing rules.", + "items": { + "$ref": "#/components/schemas/AlertPipeline" + }, + "type": "array" + }, + "status": { + "description": "Pipeline status. Always `enabled` in these responses — deleted pipelines are filtered out.", + "enum": [ + "enabled" + ], + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Member ID who last updated the pipeline.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalendarIDRequest" - }, - "example": { - "cal_id": "cal.eh9gvPtWeH3xXgKeVSRxRg" - } - } + "type": "object" + }, + "AlertPipelineListRequest": { + "properties": { + "integration_ids": { + "description": "Integration IDs. At least one entry is required.", + "items": { + "format": "int64", + "type": "integer" + }, + "minItems": 1, + "type": "array" } - } - } - }, - "/calendar/list": { - "post": { - "operationId": "calendarList", - "summary": "List calendars", - "description": "Return the list of service calendars visible to the current account.", - "tags": [ - "On-call/Calendars" + }, + "required": [ + "integration_ids" ], - "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 |", - "href": "/en/api-reference/on-call/calendars/calendar-list", - "metadata": { - "sidebarTitle": "List calendars" + "type": "object" + }, + "AlertPipelineListResponse": { + "properties": { + "items": { + "description": "Alert pipeline configuration of each requested integration, one item per configured integration.", + "items": { + "$ref": "#/components/schemas/AlertPipelineItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalendarListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "team_id": 2477033058131, - "cal_id": "cal.eh9gvPtWeH3xXgKeVSRxRg", - "cal_name": "Stock Exchange Calendar", - "description": "A stock market trading calendar example", - "timezone": "Asia/Shanghai", - "kind": "personal", - "workdays": [ - 0, - 1, - 2, - 3, - 4, - 5, - 6 - ], - "created_at": 1702455630, - "updated_at": 1775529526, - "creator_id": 2476444212131, - "updated_by": 3790925372131, - "status": "enabled" - }, - { - "account_id": 2451002751131, - "team_id": 0, - "cal_id": "cal.VZYkchxJhGELSF4jzkUAud", - "cal_name": "HK Stock Exchange Calendar", - "description": "Hong Kong Stock Exchange trading days calendar", - "timezone": "Asia/Shanghai", - "kind": "personal", - "extra_cal_ids": [ - "zh-cn.china.official" - ], - "created_at": 1702968470, - "updated_at": 1775188967, - "creator_id": 2451002751131, - "updated_by": 3790925372131, - "status": "enabled" - } - ], - "total": 8 - } - } - } - } + "type": "object" + }, + "AlertPipelineUpsertRequest": { + "properties": { + "integration_id": { + "description": "Integration ID to configure.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "rules": { + "description": "Rules to apply, evaluated in array order. Between 1 and 50 entries.", + "items": { + "$ref": "#/components/schemas/AlertPipeline" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "integration_id", + "rules" + ], + "type": "object" + }, + "AlertRule": { + "description": "Full alert rule configuration.", + "properties": { + "account_id": { + "description": "Account ID. Filled by the server from the authenticated identity; do not provide.", + "format": "uint64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "annotations": { + "additionalProperties": { + "type": "string" + }, + "description": "Annotation key-value pairs delivered with alert events; keys must not start with `$` (reserved for query fields).", + "type": "object" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "channel_ids": { + "description": "Channel IDs to send alerts to.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalendarListRequest" - }, - "example": { - "kind": "personal" + "created_at": { + "description": "Creation time as a Unix timestamp in seconds. Generated by the server; do not provide.", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "Creator user ID. Filled by the server from the current user; do not provide.", + "format": "uint64", + "type": "integer" + }, + "creator_name": { + "description": "Creator name. Filled by the server; do not provide.", + "type": "string" + }, + "cron_pattern": { + "description": "Schedule expression: a 6-field cron (with seconds) or an `@every 30s` interval descriptor. Must not start with `CRON_TZ=` or `TZ=`; use the `timezone` field instead.", + "type": "string" + }, + "debug_log_enabled": { + "description": "Whether to enable debug logging; the edge emits detailed evaluation logs, useful for troubleshooting rules that do not trigger as expected.", + "type": "boolean" + }, + "delay_seconds": { + "description": "Seconds to shift the evaluation query window backward, compensating for data ingestion latency.", + "type": "integer" + }, + "description": { + "description": "Rule description, in Markdown.", + "type": "string" + }, + "description_type": { + "default": "text", + "description": "Format for the description. Defaults to `text` when omitted or empty. `text` = plain text; `markdown` = Markdown, rendered as Markdown in alert details.", + "enum": [ + "text", + "markdown" + ], + "type": "string" + }, + "ds_ids": { + "description": "Datasource IDs, merged with `ds_list` to decide which datasources the rule monitors; IDs survive datasource renames. At least one of `ds_list` and `ds_ids` must be provided.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" + }, + "ds_list": { + "description": "Data source name patterns (supports wildcards). At least one of `ds_list` / `ds_ids` must be non-empty; the two are merged to decide which datasources the rule monitors.", + "items": { + "type": "string" + }, + "type": "array" + }, + "ds_type": { + "description": "Datasource type identifier (e.g. `prometheus`, `elasticsearch`).", + "type": "string" + }, + "enabled": { + "description": "Whether the rule is enabled. Updating to `false` makes the server clean up the rule's active alerts.", + "type": "boolean" + }, + "enabled_times": { + "default": [ + { + "days": [ + 1, + 2, + 3, + 4, + 5, + 6, + 0 + ], + "etime": "23:59", + "stime": "00:00" } - } - } - } - } - }, - "/calendar/event/upsert": { - "post": { - "operationId": "calEventUpsert", - "summary": "Upsert calendar event", - "description": "Create or update a calendar event (holiday or workday override). Omit event_id to create a new event.", - "tags": [ - "On-call/Calendars" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/calendars/cal-event-upsert", - "metadata": { - "sidebarTitle": "Upsert calendar event" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalEventUpsertResponse" - } - } - } - ] + ], + "description": "Time windows when the rule is active. Defaults to all days from 00:00 to 23:59 when omitted or empty.", + "items": { + "properties": { + "days": { + "description": "Days of week (0=Sunday).", + "items": { + "type": "integer" + }, + "type": "array" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "event_id": "cale.KyG9XWTCU5CucbwukEVBQ4", - "summary": "Test Holiday" - } + "etime": { + "description": "End time, e.g. `18:00`.", + "type": "string" + }, + "stime": { + "description": "Start time, e.g. `09:00`.", + "type": "string" } - } - } + }, + "type": "object" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "folder_id": { + "description": "ID of the folder the rule belongs to. Obtainable via `POST /monit/folder/list`.", + "format": "uint64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "id": { + "description": "Rule ID. Required for update; omit for create (assigned by the server).", + "format": "uint64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom labels.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" + "name": { + "description": "Rule name. Must be unique within the same folder.", + "type": "string" + }, + "repeat_interval": { + "description": "Notification repeat interval in seconds.", + "format": "int64", + "type": "integer" + }, + "repeat_total": { + "description": "Max number of repeat notifications.", + "format": "int64", + "type": "integer" + }, + "rule_configs": { + "$ref": "#/components/schemas/RuleConfigs", + "description": "Check configuration: query list plus trigger/recovery conditions. Structure see `RuleConfigs`." + }, + "timezone": { + "default": "Asia/Shanghai", + "description": "Timezone in which the rule executes. Determines how the cron schedule and effective time windows are interpreted. Only IANA timezone names are accepted (e.g. `Asia/Shanghai`, `UTC`, `Europe/London`); shortcuts and offsets such as `Local`, `UTC+8`, or `CST` are rejected. Treated as `Asia/Shanghai` if empty.", + "type": "string" + }, + "updated_at": { + "description": "Last update time as a Unix timestamp in seconds. Generated by the server; do not provide.", + "format": "int64", + "type": "integer" + }, + "updater_id": { + "description": "Last updater user ID. Filled by the server; do not provide.", + "format": "uint64", + "type": "integer" + }, + "updater_name": { + "description": "Last updater name. Filled by the server; do not provide.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalEventUpsertRequest" - }, - "example": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "summary": "Labour Day", - "start_at": "2024-05-01", - "end_at": "2024-05-06", - "is_off": true, - "description": "International Workers Day holiday" - } - } - } - } - } - }, - "/calendar/event/delete": { - "post": { - "operationId": "calEventDelete", - "summary": "Delete calendar event", - "description": "Delete a calendar event by calendar ID and event ID.", - "tags": [ - "On-call/Calendars" + "required": [ + "folder_id", + "name", + "ds_type", + "cron_pattern", + "rule_configs" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Calendars Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/calendars/cal-event-delete", - "metadata": { - "sidebarTitle": "Delete calendar event" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalendarEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AlertRuleAudit": { + "description": "An audit record capturing a rule snapshot at a point in time.", + "properties": { + "account_id": { + "description": "ID of the account that owns the rule.", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "action": { + "description": "Action performed: `create` = rule created; `update` = rule updated (covers full updates, field-batch updates, imports and moves).", + "enum": [ + "create", + "update" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "alert_rule_id": { + "description": "ID of the alert rule this record belongs to.", + "format": "uint64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "content": { + "description": "JSON string of the full rule snapshot at audit time. Populated on `/monit/rule/audit/detail`, omitted on list responses.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "created_at": { + "description": "When this audit record was produced, as a Unix timestamp in seconds; equals the rule's `updated_at` at change time.", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "ID of the user who made this change (taken from the rule's `updater_id` at change time).", + "format": "uint64", + "type": "integer" + }, + "creator_name": { + "description": "Name of the user who made this change (taken from the rule's `updater_name` at change time).", + "type": "string" + }, + "id": { + "description": "Audit record ID.", + "format": "uint64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalEventIDRequest" - }, - "example": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "event_id": "cale.KyG9XWTCU5CucbwukEVBQ4" - } - } - } - } - } - }, - "/calendar/event/list": { - "post": { - "operationId": "calEventList", - "summary": "List calendar events", - "description": "Return events for a personal calendar within a year/month/day scope. When month and day are both omitted the whole year is returned.", - "tags": [ - "On-call/Calendars" + "required": [ + "id", + "account_id", + "alert_rule_id", + "action", + "creator_id", + "creator_name", + "created_at" ], - "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 |", - "href": "/en/api-reference/on-call/calendars/cal-event-list", - "metadata": { - "sidebarTitle": "List calendar events" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CalEventListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "creator_id": 2476444212131, - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "event_id": "cale.KyG9XWTCU5CucbwukEVBQ4", - "summary": "Test Holiday", - "description": "A test holiday event", - "start_at": "2026-05-01", - "end_at": "2026-05-02", - "is_off": true, - "created_at": 1775972034, - "updated_at": 1775972034 - }, - { - "account_id": 2451002751131, - "creator_id": 2451002751131, - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "event_id": "non_work.20260502", - "summary": "non-working day (Saturday)", - "description": "", - "start_at": "2026-05-02", - "end_at": "2026-05-03", - "is_off": true, - "created_at": 0, - "updated_at": 0 - } - ], - "total": 11 - } - } - } - } + "type": "object" + }, + "AlertRuleBasic": { + "description": "Basic alert rule information for list views.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "active_alert_count": { + "description": "Number of currently active (unrecovered) alerts fired by this rule. `triggered` equals `active_alert_count > 0`.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "created_at": { + "description": "Creation time, as a Unix timestamp in seconds.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "creator_id": { + "description": "ID of the user who created the rule.", + "format": "uint64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "creator_name": { + "description": "Name of the user who created the rule.", + "type": "string" + }, + "cron_pattern": { + "description": "Schedule expression: a 6-field cron with seconds, e.g. `0 * * * * *`, or an `@every 30s` interval descriptor. Must not start with `CRON_TZ=` or `TZ=`; use the `timezone` field instead.", + "type": "string" + }, + "debug_log_enabled": { + "description": "Whether debug logging is enabled.", + "type": "boolean" + }, + "delay_seconds": { + "description": "Evaluation delay in seconds.", + "type": "integer" + }, + "ds_type": { + "description": "Data source type, e.g. `prometheus`.", + "type": "string" + }, + "enabled": { + "description": "Whether the rule is enabled.", + "type": "boolean" + }, + "folder_id": { + "description": "Folder ID.", + "format": "uint64", + "type": "integer" + }, + "id": { + "description": "Unique rule ID.", + "format": "uint64", + "type": "integer" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom labels.", + "type": "object" + }, + "name": { + "description": "Rule name.", + "type": "string" + }, + "runtime_state": { + "description": "Runtime evaluation state, derived from edge heartbeats and the edge-reported rule status. Omitted when the state is unavailable.\n\n| Value | Meaning |\n|---|---|\n| `disabled` | The rule is disabled. |\n| `offline` | The edge instance or cluster owning this rule is offline. |\n| `abnormal` | The edge reports evaluation errors. |\n| `stale` | The edge's runtime status report is outdated. |\n| `no_datasource` | No datasource currently matches the rule's `ds_list` / `ds_ids`. |\n| `config_pending` | The latest rule config has not been delivered to the edge yet. |\n| `waiting` | Enabled, but the edge has not reported runtime status yet. |\n| `normal` | Evaluating normally. |", + "enum": [ + "disabled", + "offline", + "abnormal", + "stale", + "no_datasource", + "config_pending", + "waiting", + "normal" + ], + "type": "string" + }, + "timezone": { + "default": "Asia/Shanghai", + "description": "Timezone in which the rule executes. Determines how the cron schedule and effective time windows are interpreted. Only IANA timezone names are accepted (e.g. `Asia/Shanghai`, `UTC`, `Europe/London`); shortcuts and offsets such as `Local`, `UTC+8`, or `CST` are rejected. Treated as `Asia/Shanghai` if empty.", + "type": "string" + }, + "triggered": { + "description": "True if the rule currently has active alerts.", + "type": "boolean" + }, + "updated_at": { + "description": "Last modification time, as a Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "updater_id": { + "description": "ID of the user who last modified the rule.", + "format": "uint64", + "type": "integer" + }, + "updater_name": { + "description": "Name of the user who last modified the rule.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CalEventListRequest" - }, - "example": { - "cal_id": "cal.QiNvtdKs4Wj52kZhT3LafM", - "year": 2024, - "month": 5 - } - } - } - } - } - }, - "/template/info": { - "post": { - "operationId": "template-read-info", - "summary": "Get template detail", - "description": "Return a single notification template by ID.", - "tags": [ - "On-call/Notification templates" + "required": [ + "id", + "account_id", + "folder_id", + "name", + "ds_type", + "enabled", + "debug_log_enabled", + "cron_pattern", + "delay_seconds", + "creator_id", + "creator_name", + "updater_id", + "updater_name", + "created_at", + "updated_at", + "triggered", + "labels", + "timezone", + "active_alert_count" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Templates Read** (`on-call`) |\n\n## Usage\n\n- Pass `000000000000000000000001` as `template_id` to retrieve the built-in preset template for the caller's account locale.", - "href": "/en/api-reference/on-call/notification-templates/template-read-info", - "metadata": { - "sidebarTitle": "Get template detail" + "type": "object" + }, + "AlertRuleCounter": { + "description": "One historical snapshot of the account's alert rule total.", + "properties": { + "account_id": { + "description": "ID of the account this snapshot belongs to.", + "format": "uint64", + "type": "integer" + }, + "clock": { + "description": "Sample timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" + }, + "id": { + "description": "ID of this snapshot record.", + "format": "uint64", + "type": "integer" + }, + "num": { + "description": "Rule count at the sample time.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TemplateItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 10023, - "team_id": 0, - "template_id": "6605a1b2c3d4e5f6a7b8c9d0", - "template_name": "Prod incident default", - "description": "Default template for production incidents.", - "email": "Incident {{ .IncidentName }} on {{ .Severity }}", - "sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}", - "voice": "", - "dingtalk": "", - "wecom": "", - "feishu": "", - "feishu_app": "", - "dingtalk_app": "", - "wecom_app": "", - "slack_app": "", - "teams_app": "", - "telegram": "", - "slack": "", - "zoom": "", - "status": "enabled", - "creator_id": 80011, - "updated_by": 80011, - "created_at": 1712700000, - "updated_at": 1712702400 - } - } - } - } + "required": [ + "id", + "account_id", + "num", + "clock" + ], + "type": "object" + }, + "AlertRuleExport": { + "description": "Portable alert rule representation for import/export. Omits identifying fields like `id`, `account_id`, and audit metadata.", + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom annotation key-value pairs attached to alert events; keys must not start with `$` (reserved for query field references).", + "type": "object" + }, + "cron_pattern": { + "description": "Evaluation schedule as a 6-field cron expression (seconds included) or `@every ` (an integral number of seconds, at least 1s); `CRON_TZ=`/`TZ=` prefixes are rejected — set the timezone in `timezone` instead.", + "type": "string" + }, + "debug_log_enabled": { + "description": "Whether to emit debug logs for this rule's evaluations; enable when troubleshooting.", + "type": "boolean" + }, + "delay_seconds": { + "description": "Query time offset in seconds: each evaluation reads data as of `schedule time − delay_seconds` to tolerate ingestion lag; `0` means no offset.", + "type": "integer" + }, + "description": { + "description": "Rule description in the format given by `description_type`, shown with alert events.", + "type": "string" + }, + "description_type": { + "description": "Format of `description`, `text` or `markdown`; treated as `text` when omitted.", + "enum": [ + "text", + "markdown" + ], + "type": "string" + }, + "ds_ids": { + "description": "Datasource ID list, merged with `ds_list`; references by ID and is therefore immune to datasource renames.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" + }, + "ds_list": { + "description": "Datasource name list with wildcard support; merged with `ds_ids` to decide which datasources the rule monitors — must be maintained by hand if a datasource is renamed.", + "items": { + "type": "string" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "ds_type": { + "description": "Datasource type ident, e.g. `prometheus`; must be a datasource type (`ident`) that exists in the import target environment.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "enabled": { + "description": "Whether the rule is enabled; rules imported as disabled are not evaluated.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "enabled_times": { + "description": "Effective time windows; each entry has `days` (0–6, 0 = Sunday) and `stime`/`etime` (`HH:MM`), interpreted in the rule's `timezone`; an empty list disables the rule.", + "items": { + "$ref": "#/components/schemas/EnabledTime" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateIDRequest" - }, - "example": { - "template_id": "6605a1b2c3d4e5f6a7b8c9d0" - } - } - } - } - } - }, - "/template/list": { - "post": { - "operationId": "template-read-list", - "summary": "List templates", - "description": "Return a paginated list of notification templates.", - "tags": [ - "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 | **Templates Read** (`on-call`) or **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Pagination defaults to page 1 with 20 rows. The response's `has_next_page` tells you whether another page exists without needing a separate count request.\n- When `is_my_team` is `true`, `team_ids` is ignored.", - "href": "/en/api-reference/on-call/notification-templates/template-read-list", - "metadata": { - "sidebarTitle": "List templates" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TemplateListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 47, - "has_next_page": true, - "items": [ - { - "account_id": 10023, - "team_id": 0, - "template_id": "6605a1b2c3d4e5f6a7b8c9d0", - "template_name": "Prod incident default", - "description": "Default template for production incidents.", - "email": "Incident {{ .IncidentName }} on {{ .Severity }}", - "sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}", - "voice": "", - "dingtalk": "", - "wecom": "", - "feishu": "", - "feishu_app": "", - "dingtalk_app": "", - "wecom_app": "", - "slack_app": "", - "teams_app": "", - "telegram": "", - "slack": "", - "zoom": "", - "status": "enabled", - "creator_id": 80011, - "updated_by": 80011, - "created_at": 1712700000, - "updated_at": 1712702400 - } - ] - } - } - } - } + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom label key-value pairs attached to alert events produced by this rule.", + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "name": { + "description": "Rule name, up to 128 characters when imported.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "repeat_interval": { + "description": "Interval in seconds between repeated notifications for a firing alert; values below 1 fall back to the default of 3600.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "repeat_total": { + "description": "Maximum number of repeated notifications for the same alert; values below 1 fall back to the default of 3.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rule_configs": { + "$ref": "#/components/schemas/RuleConfigs" + }, + "timezone": { + "default": "Asia/Shanghai", + "description": "Timezone in which the rule executes. IANA timezone name; defaults to `Asia/Shanghai`.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateListRequest" - }, - "example": { - "p": 1, - "limit": 20, - "orderby": "updated_at", - "asc": false, - "is_my_team": false - } - } - } - } - } - }, - "/template/create": { - "post": { - "operationId": "template-write-create", - "summary": "Create a template", - "description": "Create a new notification template.", - "tags": [ - "On-call/Notification templates" + "required": [ + "name", + "ds_type", + "enabled", + "debug_log_enabled", + "cron_pattern" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Templates Manage** (`on-call`) |\n\n## Usage\n\n- `template_name` must be unique within the account; duplicates return `InvalidParameter`.\n- The server validates every non-empty channel template by rendering it against a mock incident — a syntactic error in any channel fails the whole request with `InvalidParameter`.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/notification-templates/template-write-create", - "metadata": { - "sidebarTitle": "Create a template" - } + "type": "object" + }, + "AlertRuleExportListResponse": { + "description": "List of exported rule configurations, compatible with `POST /monit/rule/import`.", + "items": { + "$ref": "#/components/schemas/AlertRuleExport" }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TemplateCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "template_id": "6605a1b2c3d4e5f6a7b8c9d0", - "template_name": "Prod incident default" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "type": "array" + }, + "AlertShort": { + "description": "Brief alert reference.", + "properties": { + "alert_id": { + "description": "Alert ID (ObjectID hex string).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "title": { + "description": "Alert title, resolved at read time. Omitted when empty.", + "type": "string" + } + }, + "type": "object" + }, + "ApAlertDrop": { + "description": "Settings for `alert_drop` rule: no additional settings required. Matched alerts are silently discarded.", + "properties": {}, + "type": "object" + }, + "ApAlertInhibit": { + "description": "Settings for `alert_inhibit` rule: suppresses source alerts that match the filter when they share the same label values as the current alert.", + "properties": { + "equals": { + "description": "Label keys whose values must be equal between the source and current alert for inhibition to apply.", + "items": { + "type": "string" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "source_filters": { + "description": "AND-filter list identifying the source alerts to inhibit — every condition must match.", + "items": { + "$ref": "#/components/schemas/FilterCondition" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateCreateRequest" - }, - "example": { - "team_id": 0, - "template_name": "Prod incident default", - "description": "Default template for production incidents.", - "email": "Incident {{ .IncidentName }} on {{ .Severity }}", - "sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}" - } - } + "required": [ + "equals", + "source_filters" + ], + "type": "object" + }, + "ApDescriptionReset": { + "description": "Settings for `description_reset` rule: overrides the alert description.", + "properties": { + "description": { + "description": "New description template.", + "type": "string" } - } - } - }, - "/template/update": { - "post": { - "operationId": "template-write-update", - "summary": "Update a template", - "description": "Update an existing template. Only the fields present in the request are written: a channel you omit keeps its current content, and an explicit empty string clears it.", - "tags": [ - "On-call/Notification templates" + }, + "required": [ + "description" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Only the fields present in the request are written. A channel you omit keeps its current content; send it as an empty string to clear it.\n- The caller needs data-permission on the template's team; otherwise the response is `AccessDenied`.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/notification-templates/template-write-update", - "metadata": { - "sidebarTitle": "Update a template" + "type": "object" + }, + "ApSeverityReset": { + "description": "Settings for `severity_reset` rule: forces the alert severity to a fixed value.", + "properties": { + "severity": { + "description": "Target severity level.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "required": [ + "severity" + ], + "type": "object" + }, + "ApTitleReset": { + "description": "Settings for `title_reset` rule: overrides the alert title with a template string.", + "properties": { + "title": { + "description": "New title template. Supports Golang template syntax referencing alert fields.", + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "ArtifactFileStateItem": { + "description": "Live publish state of one presented file. Returned only for files that have a live published artifact.", + "properties": { + "artifact_id": { + "description": "Artifact ID (`art_` prefix). Also the key of the public-share link.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "file_id": { + "description": "Echoes the requested presented-file ID.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "gallery_path": { + "description": "Console-relative path of the artifact page: `/ai-sre/artifacts/`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "Gallery display title of the published artifact.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateUpdateRequest" - }, - "example": { - "template_id": "6605a1b2c3d4e5f6a7b8c9d0", - "template_name": "Prod incident default", - "description": "Updated description.", - "email": "Incident {{ .IncidentName }} on {{ .Severity }}", - "sms": "[Flashduty] {{ .IncidentName }} — {{ .Severity }}" - } - } + "required": [ + "file_id", + "artifact_id", + "title", + "gallery_path" + ], + "type": "object" + }, + "ArtifactFileStateRequest": { + "description": "Probe publish state for a batch of presented files.", + "properties": { + "file_ids": { + "description": "Presented-file IDs (`pf_` prefix) to probe. At most 50 per call; duplicates and empty strings are ignored.", + "items": { + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" } - } - } - }, - "/template/delete": { - "post": { - "operationId": "template-write-delete", - "summary": "Delete a template", - "description": "Soft-delete a template by ID.", - "tags": [ - "On-call/Notification templates" + }, + "required": [ + "file_ids" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Templates Manage** (`on-call`) |\n\n## Usage\n\n- Fails with `400 ReferenceExist` if the template is still referenced by any channel, escalation rule, or notification subscription.\n- Deletion is soft — `deleted_at` is set. The record remains for audit, but the template stops appearing in listings.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/notification-templates/template-write-delete", - "metadata": { - "sidebarTitle": "Delete a template" + "type": "object" + }, + "ArtifactFileStateResponse": { + "description": "Publish states keyed by file.", + "properties": { + "items": { + "description": "One entry per requested file that has a live published artifact; files without one are omitted.", + "items": { + "$ref": "#/components/schemas/ArtifactFileStateItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "ArtifactIdRequest": { + "description": "Identify one gallery artifact.", + "properties": { + "artifact_id": { + "description": "Artifact ID (`art_` prefix). Also the key of the public-share link.", + "type": "string" + } + }, + "required": [ + "artifact_id" + ], + "type": "object" + }, + "ArtifactListRequest": { + "description": "Filter and paginate the artifact gallery.", + "properties": { + "asc": { + "description": "Sort ascending when true, descending when false. Applies only when `orderby` is set.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "default": 20, + "description": "Page size. Defaults to 20; capped at 100.", + "maximum": 100, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "orderby": { + "description": "Sort field: `created_at` or `updated_at`. Empty means `updated_at` descending.", + "enum": [ + "created_at", + "updated_at" + ], + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "page": { + "default": 1, + "description": "Page number, 1-based.", + "minimum": 1, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "query": { + "description": "Case-insensitive substring match on the artifact title.", + "type": "string" + }, + "scope": { + "default": "all", + "description": "Visibility scope. `all` (default) lists the caller's own personal artifacts plus artifacts of every team the caller belongs to; `personal` lists only the caller's own; `team` lists only team-owned artifacts of the caller's teams.", + "enum": [ + "all", + "personal", + "team" + ], + "type": "string" + }, + "team_ids": { + "description": "Restrict to artifacts owned by these team IDs, intersected with the caller's visibility — teams the caller does not belong to silently return nothing.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + } + }, + "type": "object" + }, + "ArtifactListResponse": { + "description": "A page of gallery artifacts.", + "properties": { + "items": { + "description": "Artifacts on this page.", + "items": { + "$ref": "#/components/schemas/PublishedArtifactItem" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "total": { + "description": "Total number of artifacts matching the filter across all pages.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TemplateIDRequest" - }, - "example": { - "template_id": "6605a1b2c3d4e5f6a7b8c9d0" - } - } + "type": "object" + }, + "ArtifactPublishFromFileRequest": { + "description": "Publish a session-produced file to the artifact gallery.", + "properties": { + "file_id": { + "description": "Presented-file ID (`pf_` prefix) of a file produced in a session, as shown on the file card in chat.", + "type": "string" + }, + "title": { + "description": "Gallery display title. Trimmed; must be non-empty.", + "type": "string" } - } - } - }, - "/enrichment/info": { - "post": { - "operationId": "enrichment-read-info", - "summary": "Get enrichment rules", - "description": "Return the enrichment rule set configured for a specific integration.", - "tags": [ - "On-call/Alert enrichment" + }, + "required": [ + "file_id", + "title" ], - "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 **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- Returns `null` if no enrichment rules have been configured for the integration.", - "href": "/en/api-reference/on-call/alert-enrichment/enrichment-read-info", - "metadata": { - "sidebarTitle": "Get enrichment rules" + "type": "object" + }, + "ArtifactPublishResponse": { + "description": "Result of publishing a file to the gallery.", + "properties": { + "artifact_id": { + "description": "Artifact ID (`art_` prefix). Also the key of the public-share link.", + "type": "string" + }, + "gallery_path": { + "description": "Console-relative path of the artifact page: `/ai-sre/artifacts/`.", + "type": "string" + }, + "title": { + "description": "Gallery display title.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EnrichmentItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "integration_id": 5001, - "rules": [ - { - "kind": "extraction", - "settings": { - "source_field": "labels.env", - "result_label": "environment", - "pattern": "^(prod|staging|dev).*$", - "override": true - } - } - ], - "status": "enabled", - "updated_by": 80011, - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - } - } - } + "required": [ + "artifact_id", + "title", + "gallery_path" + ], + "type": "object" + }, + "ArtifactShareState": { + "description": "Public-share state of an artifact.", + "properties": { + "artifact_id": { + "description": "Artifact ID (`art_` prefix). Also the key of the public-share link.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "public_url": { + "description": "Anonymous public link served entirely from CDN. Anyone with the link can view the content, no login required.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "share_enabled": { + "description": "Always `true` in this response.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "shared_at": { + "description": "Unix timestamp in milliseconds of the last share enable or snapshot sync.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "shared_by": { + "description": "Person ID of the member who enabled sharing.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EnrichmentInfoRequest" - }, - "example": { - "integration_id": 5001 - } - } - } - } - } - }, - "/enrichment/list": { - "post": { - "operationId": "enrichment-read-list", - "summary": "List enrichment rules", - "description": "Return the enrichment rule sets for a list of integration IDs.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "artifact_id", + "share_enabled", + "public_url", + "shared_by", + "shared_at" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/alert-enrichment/enrichment-read-list", - "metadata": { - "sidebarTitle": "List enrichment rules" + "type": "object" + }, + "ArtifactSignRequest": { + "description": "Request signed download/preview URLs for a presented file.", + "properties": { + "file_id": { + "description": "Presented-file ID (`pf_` prefix) to sign.", + "type": "string" + }, + "share_token": { + "description": "Optional session share-link token. Needed only when the caller reaches the file through a shared session link rather than account membership.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EnrichmentListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "integration_id": 5001, - "rules": [], - "status": "enabled", - "updated_by": 80011, - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "required": [ + "file_id" + ], + "type": "object" + }, + "ArtifactUpdateRequest": { + "description": "Partial update of a gallery artifact. Only provided fields change.", + "properties": { + "artifact_id": { + "description": "Artifact ID (`art_` prefix). Also the key of the public-share link.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "team_id": { + "description": "Transfer target scope. `0` moves the artifact to personal scope (only the creator can manage it); a positive value moves it to a team the caller must belong to. Omit to leave unchanged.", + "format": "int64", + "type": [ + "integer", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "New title. Trimmed; must be non-empty when provided. Omit to leave unchanged.", + "type": [ + "string", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EnrichmentListRequest" - }, - "example": { - "integration_ids": [ - 5001, - 5002 - ] - } - } - } - } - } - }, - "/enrichment/upsert": { - "post": { - "operationId": "enrichment-write-upsert", - "summary": "Upsert enrichment rules", - "description": "Create or fully replace the enrichment rule set for an integration. The entire `rules` array is replaced atomically.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "artifact_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Channels Manage** (`on-call`) or **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- Enrichment rules are evaluated in order.\n- Each rule has a `kind`: `extraction` (regex/gjson extraction), `composition` (template-based label composition), `mapping` (lookup via mapping schema or API), or `drop` (remove labels).\n- The optional `if` field is an `AndFilters` condition: if it does not match, the rule is skipped.\n- For `kind: extraction`: `source_field` must be `title`, `description`, or a `labels.*` key; specify exactly one of `pattern` (RE2 regex — its capture groups are joined with a space and written to `result_label`) or `g_json` (GJson path).\n- For `kind: composition`: `template` is a Go text/template rendered against the event struct, e.g. `{{.Title}}`, `{{.Description}}`, `{{.Labels.key}}`.\n- For `kind: mapping`: `mapping_type` is `schema` (default) or `api`; provide `schema_id` or `api_id` accordingly.\n- For `kind: drop`: `drop_labels` lists the label keys to remove.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alert-enrichment/enrichment-write-upsert", - "metadata": { - "sidebarTitle": "Upsert enrichment rules" + "type": "object" + }, + "AssignIncidentRequest": { + "description": "Parameters for dispatching one or more incidents to a target. Provide `incident_id` or `incident_ids` but not both.", + "properties": { + "assigned_to": { + "$ref": "#/components/schemas/AssignedTo", + "description": "Assign target; at least one of `person_ids` and `escalate_rule_id` must be set." + }, + "incident_id": { + "description": "Single incident ID. Ignored when `incident_ids` is also provided.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "incident_ids": { + "description": "Incident IDs to assign in bulk; obtain them from `POST /incident/list`.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "assigned_to" + ], + "type": "object" + }, + "AssignedTo": { + "description": "Incident assignment target. Either `person_ids` or `escalate_rule_id` must be provided.", + "properties": { + "assigned_at": { + "description": "Unix timestamp (seconds) when the assignment was made.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "emails": { + "description": "Email recipients, used by integrations such as ServiceNow.", + "items": { + "format": "email", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "escalate_rule_id": { + "description": "Escalation rule ID (MongoDB ObjectID) to drive assignment.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "escalate_rule_name": { + "description": "Escalation rule display name, filled by the server.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EnrichmentUpsertRequest" - }, - "example": { - "integration_id": 5001, - "rules": [ - { - "kind": "extraction", - "settings": { - "source_field": "labels.env", - "result_label": "environment", - "pattern": "(?Pprod|staging|dev)", - "override": true - } - }, - { - "kind": "composition", - "settings": { - "result_label": "full_env", - "template": "{{.Labels.region}}-{{.Labels.environment}}", - "override": false - } - } + "id": { + "description": "Opaque assignment ID generated by the server.", + "type": "string" + }, + "layer_idx": { + "description": "Current level index within the escalation rule.", + "type": "integer" + }, + "notify": { + "description": "Override the notification channels used for this assignment.", + "properties": { + "follow_preference": { + "description": "When false, use `personal_channels`; when true or omitted, use each responder's personal preference.", + "type": [ + "boolean", + "null" ] + }, + "personal_channels": { + "description": "Channels to use (e.g. `voice`, `sms`, `email`).", + "items": { + "type": "string" + }, + "type": "array" + }, + "template_id": { + "description": "Notification template ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" } - } - } - } - } - }, - "/enrichment/mapping/schema/list": { - "post": { - "operationId": "mapping-schema-read-list", - "summary": "List mapping schemas", - "description": "Return all mapping schemas for the account, sorted by creation time ascending.", - "tags": [ - "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 | **Channels Read** (`on-call`) or **Channels Manage** (`on-call`) or **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) or **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-schema-read-list", - "metadata": { - "sidebarTitle": "List mapping schemas" + }, + "type": "object" + }, + "person_ids": { + "description": "Member IDs to assign directly.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "type": { + "description": "Assignment type: `assign` direct assignment, `reassign` reassignment, `escalate` escalation-rule driven, `reopen` automatic reassignment on reopen.", + "enum": [ + "assign", + "reassign", + "escalate", + "reopen" + ], + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingSchemaListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "items": [ - { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "schema_name": "CMDB Lookup", - "description": "Enrich alerts with CMDB data", - "source_labels": [ - "host" - ], - "result_labels": [ - "owner", - "team", - "service" - ], - "status": "enabled", - "team_id": 0, - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - ] - } - } - } - } + "type": "object" + }, + "AuditLog": { + "description": "A single audit log entry.", + "properties": { + "account_id": { + "description": "ID of the account.", + "format": "uint64", + "type": "integer" + }, + "body": { + "description": "JSON-encoded request body. Bodies containing sensitive fields are base64url-encoded instead; bodies over 10 KB are replaced by a truncation placeholder.", + "type": "string" + }, + "created_at": { + "description": "Timestamp of the operation in Unix epoch milliseconds.", + "format": "int64", + "type": "integer" + }, + "credential_id": { + "description": "ID of the credential (the app key ID) when `credential_type` is `app_key`; 0 otherwise.", + "format": "uint64", + "type": "integer" + }, + "credential_type": { + "description": "Credential type used for the call. `app_key` when authenticated with an app key; empty string for member sessions.", + "type": "string" + }, + "ip": { + "description": "Client IP address of the caller.", + "type": "string" + }, + "is_dangerous": { + "description": "True if this is flagged as a high-risk operation.", + "type": "boolean" + }, + "is_write": { + "description": "True for mutating operations; false for read-only ones.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "member_id": { + "description": "ID of the member who performed the action. 0 when the action was performed by the account principal itself.", + "format": "uint64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "member_name": { + "description": "Display name of the member. Empty when `member_id` is 0.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "operation": { + "description": "Stable machine-readable operation name, e.g. `template:write:create`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "operation_name": { + "description": "Human-readable Chinese label of the operation (e.g. `创建模板`).", + "type": "string" + }, + "params": { + "description": "URL path parameters as an array of key-value pairs, or an empty array when none.", + "items": { + "properties": { + "Key": { + "description": "Name of a URL path parameter (the `:xxx` placeholder in the route).", + "type": "string" + }, + "Value": { + "description": "The actual value of that path parameter in this request.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "principal_kind": { + "description": "Kind of the caller. `member` — an interactive member session; `service` — an app key credential.", + "enum": [ + "member", + "service" + ], + "type": "string" + }, + "request_id": { + "description": "Unique request ID for correlation.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmptyRequest" - }, - "example": {} - } + "required": [ + "created_at", + "account_id", + "member_id", + "member_name", + "request_id", + "ip", + "operation", + "operation_name", + "body", + "params", + "is_dangerous", + "is_write", + "principal_kind", + "credential_type", + "credential_id" + ], + "type": "object" + }, + "AuditOperationListRequest": { + "additionalProperties": false, + "description": "No parameters required.", + "type": "object" + }, + "AuditOperationListResponse": { + "description": "List of auditable operation types.", + "properties": { + "items": { + "description": "Array of all auditable operation types (only APIs flagged for audit); always an array, possibly empty.", + "items": { + "$ref": "#/components/schemas/AuditOperationTypeItem" + }, + "type": "array" } - } - } - }, - "/enrichment/mapping/schema/info": { - "post": { - "operationId": "mapping-schema-read-info", - "summary": "Get mapping schema detail", - "description": "Return detail of a single mapping schema by its ID.", - "tags": [ - "On-call/Alert enrichment" + }, + "required": [ + "items" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) or **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Returns `null` if the schema does not exist.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-schema-read-info", - "metadata": { - "sidebarTitle": "Get mapping schema detail" + "type": "object" + }, + "AuditOperationTypeItem": { + "description": "An auditable operation type.", + "properties": { + "name": { + "description": "Stable machine-readable operation name for use as a filter.", + "example": "template:write:create", + "type": "string" + }, + "name_cn": { + "description": "Human-readable Chinese label shown in the console.", + "example": "创建模板", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingSchemaItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "schema_name": "CMDB Lookup", - "description": "Enrich alerts with CMDB data", - "source_labels": [ - "host" - ], - "result_labels": [ - "owner", - "team", - "service" - ], - "status": "enabled", - "team_id": 0, - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - } - } - } + "required": [ + "name", + "name_cn" + ], + "type": "object" + }, + "AuditRecordIDRequest": { + "properties": { + "id": { + "description": "Audit record ID — the `id` of an audit row returned by `POST /monit/rule/audits`, NOT the rule ID. Passing a rule ID returns HTTP 400.", + "format": "uint64", + "type": "integer" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "AuditSearchRequest": { + "description": "Filter criteria for audit log search. Time range is required.", + "properties": { + "end_time": { + "description": "End of the search window, Unix epoch seconds. Inclusive. Must be after `start_time`; maximum span 90 days.", + "example": 1712707200, + "format": "int64", + "minimum": 1, + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "is_dangerous": { + "description": "When true, return only high-risk (dangerous) operations.", + "type": [ + "boolean", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "is_write": { + "description": "When true, return only write operations; when false, return only read operations.", + "type": [ + "boolean", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "limit": { + "description": "Page size, 0–99. Omit or set to 0 for no page-size cap — all matching rows in the window are returned.", + "example": 20, + "maximum": 99, + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "operations": { + "description": "Filter to specific operation names. Use `POST /audit/operation/list` to get the valid set.", + "items": { + "type": "string" + }, + "type": "array" + }, + "person_id": { + "description": "Filter by the operator's member ID (get IDs from `POST /member/list`). Pass the account ID to match actions performed by the account principal itself.", + "format": "uint64", + "type": "integer" + }, + "request_id": { + "description": "Filter to a single request by its unique request ID.", + "type": "string" + }, + "search_after_ctx": { + "description": "Opaque pagination cursor returned by the previous response. Leave empty for the first page.", + "type": "string" + }, + "start_time": { + "description": "Start of the search window, Unix epoch seconds. Exclusive — entries at exactly this second are not included.", + "example": 1712620800, + "format": "int64", + "minimum": 1, + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingSchemaIDRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01" - } - } - } - } - } - }, - "/enrichment/mapping/schema/create": { - "post": { - "operationId": "mapping-schema-write-create", - "summary": "Create mapping schema", - "description": "Create a new mapping schema defining source lookup labels and the result labels to populate. Requires a Pro plan.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "start_time", + "end_time" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Schema names must be unique within an account.\n- `source_labels` (1–3 labels) are used as lookup keys; `result_labels` (1–10 labels) are the labels written on match.\n- Label names must match `^[a-zA-Z_][a-zA-Z0-9_]*$` and be unique within each list.\n- `source_labels` and `result_labels` must not overlap.\n- An account can have at most 20 mapping schemas.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-schema-write-create", - "metadata": { - "sidebarTitle": "Create mapping schema" + "type": "object" + }, + "AuditSearchResponse": { + "description": "Cursor-paginated audit log search result.", + "properties": { + "docs": { + "description": "Audit log entries for this page, newest first. Omitted when the page is empty.", + "items": { + "$ref": "#/components/schemas/AuditLog" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Opaque cursor for the next page. Empty string when there are no more results.", + "type": "string" + }, + "total": { + "description": "Total matching entries in the search window.", + "example": 2, + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingSchemaCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "schema_name": "CMDB Lookup" - } - } - } - } + "required": [ + "total", + "search_after_ctx" + ], + "type": "object" + }, + "AutomationRuleCreateRequest": { + "description": "Create an Automation rule.", + "properties": { + "cron_expr": { + "description": "Run cadence. Supports 4 fields (`hour day month weekday`, minute defaults to 0) and 5 fields (`minute hour day month weekday`). The minute must be one fixed integer; 6-field seconds are not supported. A cron that sets both day-of-month and day-of-week is rejected. The create API currently requires this field even for HTTP-POST-only rules; send a valid cron and set `schedule_trigger_enabled=false`.", + "example": "15 9 * * *", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "enabled": { + "description": "Whether the rule is enabled after creation. Omitted API value is false; Chat/CLI create sends true by default unless the user asks for disabled.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "environment_id": { + "description": "BYOC Runner ID. Used only when `environment_kind=byoc`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "environment_kind": { + "description": "Runtime environment kind. Omit or send an empty value for automatic selection. One of: `cloud` (platform-hosted cloud sandbox), `byoc` (a self-hosted BYOC runner in the account, used with `environment_id`); automatic selection prefers an online BYOC runner and falls back to the cloud sandbox.", + "enum": [ + "", + "cloud", + "byoc" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "http_post_trigger_enabled": { + "description": "Whether to create and enable an HTTP POST trigger. When enabled, the response includes a one-time token.", + "type": "boolean" + }, + "name": { + "description": "Rule name.", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "oncall_incident_channel_ids": { + "description": "On-call integration IDs to watch. Creating or enabling this trigger requires at least one valid ID.", + "items": { + "format": "int64", + "minimum": 1, + "type": "integer" + }, + "type": "array" + }, + "oncall_incident_severities": { + "description": "Incident severities to watch. Supported values are Critical, Warning, and Info; creating or enabling this trigger requires at least one value.", + "items": { + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" + }, + "type": "array" + }, + "oncall_incident_trigger_enabled": { + "description": "Whether the On-call incident trigger is enabled.", + "type": "boolean" + }, + "prompt": { + "description": "Task prompt sent to the AI SRE agent on each run.", + "minLength": 1, + "type": "string" + }, + "schedule_trigger_enabled": { + "description": "Whether the schedule trigger is enabled. Defaults to true when omitted; HTTP-POST-only rules should send false.", + "type": [ + "boolean", + "null" + ] + }, + "team_id": { + "description": "Scope team ID. 0 or omitted means a personal rule; >0 means a team in the account. Can be reassigned later via update (converting a team rule to personal is owner-only; moving into a team requires the caller to belong to it).", + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "timezone": { + "description": "IANA timezone `cron_expr` is evaluated in, e.g. `Asia/Shanghai`. Must be a timezone name loadable by the server; an invalid value is rejected. Defaults to the caller's member timezone, then the account timezone, then the server default (Asia/Shanghai) when omitted.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingSchemaCreateRequest" - }, - "example": { - "schema_name": "CMDB Lookup", - "description": "Enrich alerts with CMDB data", - "source_labels": [ - "host" - ], - "result_labels": [ - "owner", - "team", - "service" - ] - } - } - } - } - } - }, - "/enrichment/mapping/schema/update": { - "post": { - "operationId": "mapping-schema-write-update", - "summary": "Update mapping schema", - "description": "Update the name, description, or owning team of a mapping schema. Source and result labels cannot be changed after creation.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "name", + "cron_expr", + "prompt" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Only the schema creator, account admin, or team member can update the schema.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-schema-write-update", - "metadata": { - "sidebarTitle": "Update mapping schema" + "type": "object" + }, + "AutomationRuleIDRequest": { + "properties": { + "rule_id": { + "description": "Rule ID, from the list returned by `POST /safari/automation/rule/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "rule_id" + ], + "type": "object" + }, + "AutomationRuleItem": { + "description": "Automation rule.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" + }, + "can_edit": { + "description": "True when the caller can manage this rule: the personal rule owner; for team rules, an account admin or a member of the rule's team.", + "type": "boolean" + }, + "created_at": { + "description": "Creation time, Unix milliseconds.", + "format": "int64", + "type": "integer" + }, + "cron_expr": { + "description": "Normalized 5-field cron expression.", + "type": "string" + }, + "enabled": { + "description": "Whether the rule is enabled.", + "type": "boolean" + }, + "environment_id": { + "description": "BYOC Runner ID.", + "type": "string" + }, + "environment_kind": { + "description": "Runtime environment kind. Omit or send an empty value for automatic selection. One of: `cloud` (platform-hosted cloud sandbox), `byoc` (self-hosted BYOC runner in the account); an empty value means automatic selection (prefers an online BYOC runner, falls back to the cloud sandbox).", + "enum": [ + "", + "cloud", + "byoc" + ], + "type": "string" + }, + "http_post_token": { + "description": "HTTP POST trigger token. Returned only on create or token rotation; save it immediately.", + "type": "string" + }, + "http_post_trigger_enabled": { + "description": "Whether the HTTP POST trigger is enabled.", + "type": "boolean" + }, + "http_post_trigger_id": { + "description": "HTTP POST trigger ID. Omitted when the rule has no HTTP POST trigger.", + "type": "string" + }, + "http_post_trigger_url": { + "description": "HTTP POST trigger path. Omitted when the rule has no HTTP POST trigger.", + "type": "string" + }, + "name": { + "description": "Rule name.", + "type": "string" + }, + "oncall_incident_channel_ids": { + "description": "On-call integration IDs to watch. Creating or enabling this trigger requires at least one valid ID. Omitted when no On-call incident trigger is configured.", + "items": { + "format": "int64", + "minimum": 1, + "type": "integer" + }, + "type": "array" + }, + "oncall_incident_severities": { + "description": "Incident severities to watch. Supported values are Critical, Warning, and Info; creating or enabling this trigger requires at least one value. Omitted when no On-call incident trigger is configured.", + "items": { + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "oncall_incident_trigger_enabled": { + "description": "Whether the On-call incident trigger is enabled.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "oncall_incident_trigger_id": { + "description": "On-call incident trigger ID. Omitted when the rule has no On-call incident trigger.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "owner_id": { + "description": "Creator person ID.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingSchemaUpdateRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "schema_name": "CMDB Lookup v2", - "description": "Updated description" - } - } - } - } - } - }, - "/enrichment/mapping/schema/delete": { - "post": { - "operationId": "mapping-schema-write-delete", - "summary": "Delete mapping schema", - "description": "Delete a mapping schema and all its associated data. Deletion is blocked if the schema is referenced by any enrichment rule or webhook.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- If the schema is still referenced, the response returns HTTP 400 with a `refs` list of blocking references.\n- Only the schema creator, account admin, or team member can delete the schema.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.\n- High-risk operation. Console JWT callers must pass a second-factor code; `app_key` callers bypass the MFA prompt but remain audited — treat the key as a secret.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-schema-write-delete", - "metadata": { - "sidebarTitle": "Delete mapping schema" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "prompt": { + "description": "Task prompt.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "rule_id": { + "description": "Rule ID.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "run_scope": { + "description": "Hidden session run scope. One of: `person` (personal rule, team_id=0, runs as the creator; disabled when the creator leaves the account), `team` (team rule, team_id>0, owned by the team and shared with its members; survives the creator leaving). Derived from the rule's team_id.", + "enum": [ + "person", + "team" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "schedule_next_fire_at_ms": { + "description": "Next scheduled fire time, Unix milliseconds. 0 means no future scheduled fire is available.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "schedule_trigger_enabled": { + "description": "Whether the schedule trigger is enabled.", + "type": "boolean" + }, + "schedule_trigger_id": { + "description": "Schedule trigger ID. Omitted if the rule has no schedule trigger.", + "type": "string" + }, + "team_id": { + "description": "Scope team ID; 0 means personal rule.", + "format": "int64", + "type": "integer" + }, + "timezone": { + "description": "IANA timezone `cron_expr` is evaluated in. Always populated for rules created after this field shipped; empty on legacy rows created before it, which still resolve to UTC when scheduled.", + "type": "string" + }, + "updated_at": { + "description": "Last update time, Unix milliseconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingSchemaIDRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01" - } - } - } - } - } - }, - "/enrichment/mapping/data/list": { - "post": { - "operationId": "mapping-data-read-list", - "summary": "List mapping data", - "description": "Return paginated mapping data rows for a schema, with optional exact-match filtering on source label values.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "rule_id", + "account_id", + "team_id", + "owner_id", + "name", + "enabled", + "run_scope", + "cron_expr", + "timezone", + "prompt", + "environment_kind", + "environment_id", + "schedule_trigger_enabled", + "http_post_trigger_enabled", + "can_edit", + "created_at", + "updated_at", + "schedule_next_fire_at_ms", + "oncall_incident_trigger_enabled" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) or **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- If `query` is provided, all source labels must be specified — partial source label queries are rejected.\n- Pagination uses cursor-based (`search_after_ctx`) or page-based (`p`, `limit`) navigation. `limit` defaults to 20, max 100.\n- The `search_after_ctx` token from a response can be passed back to retrieve the next page.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-data-read-list", - "metadata": { - "sidebarTitle": "List mapping data" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingDataListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "key": "server01", - "fields": { - "host": "server01", - "owner": "alice", - "team": "sre", - "service": "api" - }, - "created_at": 1710000000, - "updated_at": 1710000000 - } - ], - "total": 1, - "has_next_page": false - } - } - } - } + "type": "object" + }, + "AutomationRuleListRequest": { + "description": "List Automation rules visible to the caller. `all` includes the caller's personal rules plus accessible team rules; account admins do not see other users' personal rules in list results.", + "properties": { + "enabled": { + "description": "Filter by enabled state: `true` returns only enabled rules, `false` only disabled; omit or pass null for no filter.", + "type": [ + "boolean", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "include_person": { + "description": "Compatibility field; when scope is empty and this is false, behaves like team scope.", + "type": [ + "boolean", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "keyword": { + "description": "Filter by name keyword.", + "maxLength": 64, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "limit": { + "default": 20, + "description": "Page size.", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "p": { + "default": 1, + "description": "Page number, 1-based.", + "type": "integer" + }, + "scope": { + "description": "Scope filter: `all` (own personal + accessible team rules), `personal`, or `team`; default `all`.", + "enum": [ + "all", + "personal", + "team" + ], + "type": "string" + }, + "team_ids": { + "description": "Filter to these team IDs; this narrows results and does not expand access.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingDataListRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "orderby": "updated_at", - "asc": false, - "p": 1, - "limit": 20 - } - } - } - } - } - }, - "/enrichment/mapping/data/upsert": { - "post": { - "operationId": "mapping-data-write-upsert", - "summary": "Upsert mapping data rows", - "description": "Insert or update up to 1000 data rows in a mapping schema. Each row must contain all source and result labels.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- Each doc must contain values for all labels defined in `source_labels` and `result_labels`.\n- Values for unknown labels are silently dropped.\n- Each value must be at most 2048 characters.\n- Upsert is keyed on the combination of source label values — existing rows with the same source key are updated.\n- A schema can hold at most 10,000 rows by default.\n- The operation is locked per schema; concurrent upserts to the same schema may fail with `ErrRequestTooFrequently`.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-data-write-upsert", - "metadata": { - "sidebarTitle": "Upsert mapping data rows" + "type": "object" + }, + "AutomationRuleListResponse": { + "properties": { + "rules": { + "description": "Array of automation rules for the current page, used with `total` for pagination.", + "items": { + "$ref": "#/components/schemas/AutomationRuleItem" + }, + "type": "array" + }, + "total": { + "description": "Total count.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingDataUpsertResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "keys": [ - "server01", - "server02" - ] - } - } - } - } + "required": [ + "total", + "rules" + ], + "type": "object" + }, + "AutomationRuleUpdateRequest": { + "description": "Update an Automation rule. Omit or send null on a field to leave it unchanged.", + "properties": { + "cron_expr": { + "description": "Run cadence. Supports 4 fields (`hour day month weekday`, minute defaults to 0) and 5 fields (`minute hour day month weekday`). The minute must be one fixed integer; 6-field seconds are not supported.", + "example": "15 9 * * *", + "type": [ + "string", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "enabled": { + "description": "Whether the rule is enabled.", + "type": [ + "boolean", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "environment_id": { + "description": "BYOC Runner ID.", + "type": [ + "string", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "environment_kind": { + "description": "Runtime environment kind. Omit or send an empty value for automatic selection.", + "enum": [ + "", + "cloud", + "byoc" + ], + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "http_post_trigger_enabled": { + "description": "Whether the HTTP POST trigger is enabled. Sending true creates one when missing.", + "type": [ + "boolean", + "null" + ] + }, + "name": { + "description": "New rule name.", + "maxLength": 255, + "type": [ + "string", + "null" + ] + }, + "oncall_incident_channel_ids": { + "description": "On-call integration IDs to watch. Creating or enabling this trigger requires at least one valid ID.", + "items": { + "format": "int64", + "minimum": 1, + "type": "integer" + }, + "type": "array" + }, + "oncall_incident_severities": { + "description": "Incident severities to watch. Supported values are Critical, Warning, and Info; creating or enabling this trigger requires at least one value.", + "items": { + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" + }, + "type": "array" + }, + "oncall_incident_trigger_enabled": { + "description": "Whether the On-call incident trigger is enabled.", + "type": [ + "boolean", + "null" + ] + }, + "prompt": { + "description": "New task prompt.", + "type": [ + "string", + "null" + ] + }, + "rotate_http_post_trigger_token": { + "description": "Whether to rotate the HTTP POST trigger token. The new token is returned only in this response.", + "type": "boolean" + }, + "rule_id": { + "description": "Target rule ID, from the list returned by `POST /safari/automation/rule/list`.", + "type": "string" + }, + "schedule_trigger_enabled": { + "description": "Whether the schedule trigger is enabled.", + "type": [ + "boolean", + "null" + ] + }, + "team_id": { + "description": "Reassign the rule's scope: 0 converts to a personal rule (only the rule owner may convert a team rule); >0 moves it into a team the caller belongs to. Omit to leave unchanged.", + "format": "int64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "timezone": { + "description": "New IANA timezone for evaluating `cron_expr`. Omit or send null to leave the current timezone unchanged.", + "type": [ + "string", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingDataUpsertRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "docs": [ - { - "host": "server01", - "owner": "alice", - "team": "sre", - "service": "api" - }, - { - "host": "server02", - "owner": "bob", - "team": "platform", - "service": "gateway" - } - ] - } - } - } - } - } - }, - "/enrichment/mapping/data/delete": { - "post": { - "operationId": "mapping-data-write-delete", - "summary": "Delete mapping data rows", - "description": "Delete up to 100 mapping data rows by their keys.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "rule_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-data-write-delete", - "metadata": { - "sidebarTitle": "Delete mapping data rows" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AutomationRunItem": { + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" + }, + "attempts": { + "description": "Attempt count.", + "type": "integer" + }, + "completed_at": { + "description": "Completion time, Unix milliseconds. 0 means not completed.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "created_at": { + "description": "Creation time, Unix milliseconds.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "duration_ms": { + "description": "Duration in milliseconds.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "error_code": { + "description": "Error code; empty when the run did not fail.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingDataDeleteRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01", - "keys": [ - "server01", - "server02" - ] - } - } - } - } - } - }, - "/enrichment/mapping/data/truncate": { - "post": { - "operationId": "mapping-data-write-truncate", - "summary": "Truncate mapping data", - "description": "Delete all data rows in a mapping schema.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- This is an irreversible bulk-delete operation.\n- High-risk operation. Console JWT callers must pass a second-factor code; `app_key` callers bypass the MFA prompt but remain audited — treat the key as a secret.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-data-write-truncate", - "metadata": { - "sidebarTitle": "Truncate mapping data" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "error_message": { + "description": "Error message; empty when the run did not fail.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "kind": { + "description": "Run kind; runs listed for a rule are always `automation_rule`.", + "enum": [ + "automation_rule" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "occurrence_key": { + "description": "Idempotency key for this occurrence.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "result_json": { + "additionalProperties": true, + "description": "Raw run result JSON (carries the run's `session_id` once started); null when empty.", + "type": [ + "object", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "rule_id": { + "description": "Rule ID.", + "type": "string" + }, + "run_id": { + "description": "Run ID.", + "type": "string" + }, + "session_id": { + "description": "Session created for this run, extracted from `result_json`. Omitted when the run has not (yet) started a session.", + "type": "string" + }, + "session_name": { + "description": "Display name of the run's session, stamped via a batch lookup. Omitted when empty or when the lookup fails.", + "type": "string" + }, + "started_at": { + "description": "Start time, Unix milliseconds.", + "format": "int64", + "type": "integer" + }, + "stats_json": { + "additionalProperties": true, + "description": "Raw run statistics JSON; null when empty.", + "type": [ + "object", + "null" + ] + }, + "status": { + "description": "Run status. One of (the first three are in-flight, the rest terminal):\n| Value | Meaning |\n| --- | --- |\n| `queued` | Enqueued, waiting for a worker |\n| `running` | Executing |\n| `retrying` | An attempt failed and a retry is scheduled |\n| `succeeded` | Completed successfully |\n| `partial` | Partially succeeded (currently only produced by memory-consolidation runs; rule runs never reach it) |\n| `failed` | Terminal failure, no further retries |\n| `skipped` | Not executed (e.g. grace period expired, trigger or rule invalid); the reason is kept on the run record |\n| `abandoned` | Still in-flight past the stale threshold and swept as never-completed (e.g. worker died) |\n| `blocked` | Terminal: the run produced output but ended with a connector waiting on a human to complete authorization (distinct from `failed`) |", + "enum": [ + "queued", + "running", + "retrying", + "succeeded", + "partial", + "failed", + "skipped", + "abandoned", + "blocked" + ], + "type": "string" + }, + "trigger_kind": { + "description": "Trigger kind. One of:\n| Value | Meaning |\n| --- | --- |\n| `schedule` | Fired by the rule's schedule trigger |\n| `debug` | Debug run (reserved; current rule runs never carry this kind) |\n| `manual` | Triggered manually by a user |\n| `http_post` | Fired via the rule's HTTP POST webhook |\n| `oncall_incident` | Fired by an on-call incident event |", + "enum": [ + "schedule", + "debug", + "manual", + "http_post", + "oncall_incident" + ], + "type": "string" + }, + "updated_at": { + "description": "Last update time, Unix milliseconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingSchemaIDRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01" - } - } - } - } - } - }, - "/enrichment/mapping/data/upload": { - "post": { - "operationId": "mapping-data-write-upload", - "summary": "Upload mapping data via CSV", - "description": "Upload a CSV file to bulk-load mapping data. By default the existing data is truncated before loading the new rows.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "run_id", + "kind", + "account_id", + "rule_id", + "trigger_kind", + "occurrence_key", + "status", + "attempts", + "started_at", + "completed_at", + "duration_ms", + "created_at", + "updated_at", + "error_code", + "error_message", + "stats_json", + "result_json" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **20 requests/minute**; **2 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- The request must use `Content-Type: multipart/form-data`. The file field name is `file` and `schema_id` is a query parameter.\n- CSV header row must include all source and result label names.\n- Maximum file size: 100 MB.\n- By default the schema's existing data is truncated before import. Pass query param `do_not_truncate_first=TRUE` to append instead.\n- Duplicate source label value combinations in the CSV cause a 400 error.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-data-write-upload", - "metadata": { - "sidebarTitle": "Upload mapping data via CSV" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "AutomationRunListRequest": { + "properties": { + "limit": { + "default": 20, + "description": "Page size.", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "p": { + "default": 1, + "description": "Page number, 1-based.", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "rule_id": { + "description": "Target rule ID, from the list returned by `POST /safari/automation/rule/list`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "started_after_ms": { + "description": "Start-time lower bound, Unix milliseconds. Values below the 180-day run-history retention floor are clamped to it (that floor is also the default when omitted).", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "multipart/form-data": { - "schema": { - "type": "object", - "properties": { - "file": { - "type": "string", - "format": "binary", - "description": "CSV file, max 100 MB. The header row must include all of the schema's source/result label names." - } - }, - "required": [ - "file" - ] - } - } + "started_before_ms": { + "description": "Start-time upper bound, Unix milliseconds. Must be greater than or equal to the effective `started_after_ms`; a value below the retention floor yields an empty result.", + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "status": { + "description": "Run status filter: `queued`, `running`, `retrying`, `succeeded`, `partial` (partially succeeded), `failed`, `skipped` (e.g. rule or trigger no longer valid), `abandoned` (stale run terminated by the system), `blocked` (terminal; produced output but a connector is waiting on a human authorization); omit for no filter.", + "enum": [ + "queued", + "running", + "retrying", + "succeeded", + "partial", + "failed", + "skipped", + "abandoned", + "blocked" + ], + "type": "string" + }, + "trigger_kind": { + "description": "Trigger source filter: `schedule` cron trigger, `debug` debug run, `manual` manual run, `http_post` HTTP POST trigger, `oncall_incident` on-call incident trigger; omit for no filter.", + "enum": [ + "schedule", + "debug", + "manual", + "http_post", + "oncall_incident" + ], + "type": "string" } }, - "parameters": [ - { - "name": "schema_id", - "in": "query", - "required": true, - "schema": { - "type": "string", - "pattern": "^[0-9a-fA-F]{24}$" + "required": [ + "rule_id" + ], + "type": "object" + }, + "AutomationRunListResponse": { + "properties": { + "runs": { + "description": "Array of run records for the given `rule_id`, filtered by the request's status/trigger-kind/time-range and paginated.", + "items": { + "$ref": "#/components/schemas/AutomationRunItem" }, - "description": "ID of the target mapping schema (ObjectID hex).", - "example": "665f1a2b3c4d5e6f7a8b9c01" + "type": "array" }, - { - "name": "do_not_truncate_first", - "in": "query", - "required": false, - "schema": { - "type": "string", - "enum": [ - "TRUE" - ] - }, - "description": "Pass `TRUE` (case-insensitive) to append instead of replacing. When omitted and the schema already has data, the server truncates existing rows before importing." + "total": { + "description": "Total count.", + "format": "int64", + "type": "integer" } - ] - } - }, - "/enrichment/mapping/data/download": { - "post": { - "operationId": "mapping-data-read-download", - "summary": "Download mapping data as CSV", - "description": "Export all data rows of a mapping schema as a CSV file download.", - "tags": [ - "On-call/Alert enrichment" + }, + "required": [ + "total", + "runs" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Read** (`on-call`) or **Integrations Manage** (`on-call`) or **Mappings Read** (`on-call`) or **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- The response is a CSV file with `Content-Disposition: attachment` header.\n- The CSV header row matches the schema's source and result labels in order.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-data-read-download", - "metadata": { - "sidebarTitle": "Download mapping data as CSV" + "type": "object" + }, + "AutomationRunView": { + "description": "Reference to the run started by a manual trigger.", + "properties": { + "run_id": { + "description": "Run ID, always populated once a run is created.", + "type": "string" + }, + "session_id": { + "description": "AI SRE session ID for this run. Always populated in a 200 response, since the call only returns after the session has started.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success. CSV attachment stream, not a JSON envelope.", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "description": "CSV file stream (`Content-Type: application/octet-stream`, `Content-Disposition: attachment; filename=.csv`). The header row lists the schema's source_labels followed by result_labels in order; each subsequent row is one mapping document." - }, - "example": "host,owner,team\nserver01,alice,sre\nserver02,bob,backend\n" - } - } + "required": [ + "run_id" + ], + "type": "object" + }, + "AutomationTemplateItem": { + "properties": { + "description": { + "description": "Template description.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "enabled": { + "description": "Whether a rule created from this template starts out enabled (prefill value).", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "icon": { + "description": "Icon identifier.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "name": { + "description": "Template name.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "prompt": { + "description": "Template prompt.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingSchemaIDRequest" - }, - "example": { - "schema_id": "665f1a2b3c4d5e6f7a8b9c01" - } - } - } - } - } - }, - "/enrichment/mapping/api/list": { - "post": { - "operationId": "mapping-api-read-list", - "summary": "List mapping APIs", - "description": "Return all mapping APIs configured for the account.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "name", + "description", + "icon", + "enabled", + "prompt" ], - "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`) |", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-read-list", - "metadata": { - "sidebarTitle": "List mapping APIs" + "type": "object" + }, + "AutomationTemplateListRequest": { + "properties": { + "locale": { + "description": "Template locale such as zh-CN or en-US. Omit to detect from the request locale.", + "maxLength": 16, + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingAPIListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "items": [ - { - "api_id": "665f1a2b3c4d5e6f7a8b9c02", - "api_name": "CMDB API", - "description": "Query CMDB for host metadata", - "url": "https://cmdb.example.com/api/lookup", - "headers": { - "Authorization": "Bearer eyJhbGciOiJIUzI1NiJ9.example-token" - }, - "timeout": 2, - "retry_count": 1, - "insecure_skip_verify": false, - "status": "enabled", - "team_id": 0, - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "type": "object" + }, + "AutomationTemplateListResponse": { + "properties": { + "templates": { + "description": "Array of built-in automation templates, with display text localized by the request `locale` (falling back to request headers).", + "items": { + "$ref": "#/components/schemas/AutomationTemplateItem" + }, + "type": "array" + } + }, + "required": [ + "templates" + ], + "type": "object" + }, + "BindWorkItemPostMortemRequest": { + "description": "Parameters for bulk-binding an incident's unbound follow-ups to a post-mortem.", + "properties": { + "idempotency_key": { + "description": "Client-generated idempotency key (max 128 characters; letters, digits, `_`, `-`, `.`, `:` only).", + "maxLength": 128, + "pattern": "^[A-Za-z0-9_\\-.:]+$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "incident_id": { + "description": "Incident ID (MongoDB ObjectID) whose converted-but-unbound follow-ups are bound.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "post_mortem_id": { + "description": "Post-mortem ID (32-character hex string) to bind the follow-ups to.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmptyRequest" - }, - "example": {} - } - } - } - } - }, - "/enrichment/mapping/api/info": { - "post": { - "operationId": "mapping-api-read-info", - "summary": "Get mapping API detail", - "description": "Return detail of a single mapping API by its ID.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "post_mortem_id", + "incident_id", + "idempotency_key" ], - "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 `null` if the API does not exist.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-read-info", - "metadata": { - "sidebarTitle": "Get mapping API detail" + "type": "object" + }, + "CalEventIDRequest": { + "description": "Calendar event delete request.", + "properties": { + "cal_id": { + "description": "Calendar ID; obtain it from `POST /calendar/list`.", + "type": "string" + }, + "event_id": { + "description": "Event ID.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingAPIItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "api_id": "665f1a2b3c4d5e6f7a8b9c02", - "api_name": "CMDB API", - "url": "https://cmdb.example.com/api/lookup", - "timeout": 2, - "retry_count": 1, - "insecure_skip_verify": false, - "status": "enabled", - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - } - } - } + "required": [ + "cal_id", + "event_id" + ], + "type": "object" + }, + "CalEventItem": { + "description": "Calendar event entry.", + "properties": { + "account_id": { + "description": "Account ID. Only present for private events.", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "cal_id": { + "description": "Calendar ID. For public events this is a locale key such as zh-cn.china.official.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "created_at": { + "description": "Creation timestamp (Unix seconds).", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "creator_id": { + "description": "Creator person ID. Only present for private events.", + "format": "uint64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "description": { + "description": "Event description.", + "type": "string" + }, + "end_at": { + "description": "Event end date (YYYY-MM-DD, exclusive).", + "type": "string" + }, + "event_id": { + "description": "Event ID.", + "type": "string" + }, + "is_off": { + "description": "Whether the event marks a non-working day.", + "type": "boolean" + }, + "start_at": { + "description": "Event start date (YYYY-MM-DD).", + "type": "string" + }, + "summary": { + "description": "Event summary.", + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp (Unix seconds).", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingAPIIDRequest" - }, - "example": { - "api_id": "665f1a2b3c4d5e6f7a8b9c02" - } - } + "required": [ + "cal_id", + "event_id", + "summary", + "description", + "start_at", + "end_at", + "is_off", + "created_at", + "updated_at" + ], + "type": "object" + }, + "CalEventListRequest": { + "description": "Calendar event list request. When day > 0 month must also be specified. month and day accept 0 to mean \"not filtered\".", + "properties": { + "cal_id": { + "description": "Calendar ID; obtain it from `POST /calendar/list`.", + "type": "string" + }, + "day": { + "description": "Day (1-31). 0 means no day filter.", + "maximum": 31, + "minimum": 0, + "type": "integer" + }, + "month": { + "description": "Month (1-12). 0 means no month filter.", + "maximum": 12, + "minimum": 0, + "type": "integer" + }, + "year": { + "description": "Year. Defaults to the current year when omitted.", + "minimum": 2023, + "type": "integer" } - } - } - }, - "/enrichment/mapping/api/create": { - "post": { - "operationId": "mapping-api-write-create", - "summary": "Create mapping API", - "description": "Create a new external HTTP API endpoint used to enrich alerts via HTTP lookup.", - "tags": [ - "On-call/Alert enrichment" + }, + "required": [ + "cal_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- `url` must start with `http://` or `https://` and cannot resolve to an internal IP (in SaaS mode).\n- `timeout` is the HTTP read timeout in seconds (1–3, default 2).\n- `retry_count` is the number of retries on failure (0–1, default 0).\n- Headers with security-sensitive names (e.g. `authorization`, `cookie`) are rejected in SaaS mode.\n- An account can have at most 50 mapping APIs.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-write-create", - "metadata": { - "sidebarTitle": "Create mapping API" + "type": "object" + }, + "CalEventListResponse": { + "description": "Calendar event list response.", + "properties": { + "items": { + "description": "Calendar events sorted by start_at.", + "items": { + "$ref": "#/components/schemas/CalEventItem" + }, + "type": "array" + }, + "total": { + "description": "Total number of events returned.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MappingAPICreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "api_id": "665f1a2b3c4d5e6f7a8b9c02", - "api_name": "CMDB API" - } - } - } - } + "required": [ + "items", + "total" + ], + "type": "object" + }, + "CalEventUpsertRequest": { + "description": "Calendar event upsert request. Provide event_id to update an existing event; omit it to create a new one.", + "properties": { + "cal_id": { + "description": "Calendar ID; obtain it from `POST /calendar/list`.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "description": { + "description": "Event description.", + "maxLength": 499, + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "end_at": { + "description": "Event end date in YYYY-MM-DD (exclusive).", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "event_id": { + "description": "Event ID. Omit when creating.", + "maxLength": 63, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "is_off": { + "description": "Whether the event marks a non-working day. true = day off, false = working day override.", + "type": "boolean" + }, + "start_at": { + "description": "Event start date in YYYY-MM-DD.", + "type": "string" + }, + "summary": { + "description": "Event summary.", + "maxLength": 39, + "minLength": 1, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingAPICreateRequest" - }, - "example": { - "api_name": "CMDB API", - "description": "Query CMDB for host metadata", - "url": "https://cmdb.example.com/api/lookup", - "headers": { - "X-Token": "mytoken" - }, - "timeout": 2, - "retry_count": 1, - "insecure_skip_verify": false - } - } - } - } - } - }, - "/enrichment/mapping/api/update": { - "post": { - "operationId": "mapping-api-write-update", - "summary": "Update mapping API", - "description": "Update configuration of an existing mapping API.", - "tags": [ - "On-call/Alert enrichment" + "required": [ + "cal_id", + "summary", + "start_at", + "end_at", + "is_off" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- Only the API creator, account admin, or team member can update the API.\n- All updatable fields are optional — only provided fields are changed.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-write-update", - "metadata": { - "sidebarTitle": "Update mapping API" + "type": "object" + }, + "CalEventUpsertResponse": { + "description": "Response returned by /calendar/event/upsert.", + "properties": { + "cal_id": { + "description": "Calendar ID.", + "type": "string" + }, + "event_id": { + "description": "Event ID (existing or newly generated).", + "type": "string" + }, + "summary": { + "description": "Event summary.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "cal_id", + "event_id", + "summary" + ], + "type": "object" + }, + "CalendarCreateRequest": { + "description": "Create calendar request. cal_name is required.", + "properties": { + "cal_name": { + "description": "Calendar display name.", + "maxLength": 39, + "minLength": 1, + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "description": { + "description": "Calendar description.", + "maxLength": 499, + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "extra_cal_ids": { + "description": "Additional public-holiday calendar IDs to inherit events from (for example zh-cn.china.official).", + "items": { + "type": "string" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "team_id": { + "description": "Owning team ID. 0 means no team.", + "format": "uint64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "timezone": { + "default": "Asia/Shanghai", + "description": "IANA timezone. Defaults to Asia/Shanghai when empty.", + "type": "string" + }, + "workdays": { + "description": "Workday numbers (0 = Sunday, 6 = Saturday).", + "items": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingAPIUpdateRequest" - }, - "example": { - "api_id": "665f1a2b3c4d5e6f7a8b9c02", - "timeout": 3, - "retry_count": 1 - } - } + "required": [ + "cal_name" + ], + "type": "object" + }, + "CalendarCreateResponse": { + "description": "Create calendar response.", + "properties": { + "cal_id": { + "description": "ID of the newly created calendar (format cal.).", + "type": "string" + }, + "cal_name": { + "description": "Calendar display name.", + "type": "string" } - } - } - }, - "/enrichment/mapping/api/delete": { - "post": { - "operationId": "mapping-api-write-delete", - "summary": "Delete mapping API", - "description": "Delete a mapping API. Deletion is blocked if the API is referenced by any enrichment rule.", - "tags": [ - "On-call/Alert enrichment" + }, + "required": [ + "cal_id", + "cal_name" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Mappings Manage** (`on-call`) |\n\n## Usage\n\n- If the API is still referenced, the response returns HTTP 400 with a `refs` list.\n- Only the API creator, account admin, or team member can delete the API.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/alert-enrichment/mapping-api-write-delete", - "metadata": { - "sidebarTitle": "Delete mapping API" + "type": "object" + }, + "CalendarEmptyObject": { + "description": "Empty response body.", + "properties": {}, + "type": "object" + }, + "CalendarIDRequest": { + "description": "Request body carrying a calendar ID.", + "properties": { + "cal_id": { + "description": "Calendar ID; obtain it from `POST /calendar/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "cal_id" + ], + "type": "object" + }, + "CalendarItem": { + "description": "Service calendar detail.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "uint64", + "type": "integer" + }, + "cal_id": { + "description": "Calendar ID.", + "type": "string" + }, + "cal_name": { + "description": "Calendar display name.", + "type": "string" + }, + "created_at": { + "description": "Creation timestamp (Unix seconds).", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "Creator person ID.", + "format": "uint64", + "type": "integer" + }, + "description": { + "description": "Calendar description.", + "type": "string" + }, + "extra_cal_ids": { + "description": "Inherited public-holiday calendar IDs. Omitted when empty.", + "items": { + "type": "string" + }, + "type": "array" + }, + "kind": { + "description": "Calendar kind. `region.official.holiday` is a public regional holiday calendar (served by the central holiday service), `religion.holiday` is a public religious holiday calendar (reserved, currently no data), and `personal` is an account-created personal/team calendar.", + "enum": [ + "region.official.holiday", + "religion.holiday", + "personal" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "status": { + "description": "Calendar status. `enabled` means usable; `deleted` means removed and never returned by list endpoints.", + "enum": [ + "enabled", + "deleted" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "team_id": { + "description": "Owning team ID (0 when not assigned).", + "format": "uint64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "timezone": { + "description": "IANA timezone.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_at": { + "description": "Last update timestamp (Unix seconds).", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Last updater person ID.", + "format": "uint64", + "type": "integer" + }, + "workdays": { + "description": "Workday numbers (0 = Sunday, 6 = Saturday). Omitted when empty.", + "items": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MappingAPIIDRequest" - }, - "example": { - "api_id": "665f1a2b3c4d5e6f7a8b9c02" - } - } - } - } - } - }, - "/insight/alert/topk-by-label": { - "post": { - "operationId": "insightTopkAlertsByLabel", - "summary": "Get top-K alerts grouped by check or resource", - "description": "Return the top-K alert groups aggregated either by `check` or by `resource` label over the specified time range.", - "tags": [ - "On-call/Analytics" + "required": [ + "account_id", + "team_id", + "cal_id", + "cal_name", + "description", + "timezone", + "kind", + "created_at", + "updated_at", + "creator_id", + "updated_by", + "status" ], - "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`) |", - "href": "/en/api-reference/on-call/analytics/insight-topk-alerts-by-label", - "metadata": { - "sidebarTitle": "Get top-K alerts grouped by check or resource" + "type": "object" + }, + "CalendarListRequest": { + "description": "Calendar list request. kind filters by calendar kind; no_locale disables locale filtering for public holiday calendars.", + "properties": { + "kind": { + "description": "Calendar kind filter; defaults to personal when empty. `region.official.holiday` queries public regional holiday calendars (filtered by the caller's locale); `personal` queries account-created calendars.", + "enum": [ + "region.official.holiday", + "personal" + ], + "type": "string" + }, + "no_locale": { + "description": "Disable locale filtering when listing public-holiday calendars.", + "type": "boolean" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/InsightAlertByLabelResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "label": "cpu-high", - "total_alert_cnt": 312, - "total_alert_event_cnt": 987 - }, - { - "label": "disk-full", - "total_alert_cnt": 178, - "total_alert_event_cnt": 452 - }, - { - "label": "memory-oom", - "total_alert_cnt": 94, - "total_alert_event_cnt": 231 - } - ] - } - } - } - } + "type": "object" + }, + "CalendarListResponse": { + "description": "Calendar list response.", + "properties": { + "items": { + "description": "Calendar items.", + "items": { + "$ref": "#/components/schemas/CalendarItem" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "total": { + "description": "Total number of calendars returned.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "items", + "total" + ], + "type": "object" + }, + "CalendarUpdateRequest": { + "description": "Update calendar request. cal_id is required; all other fields are optional and only applied when provided.", + "properties": { + "cal_id": { + "description": "Calendar ID; obtain it from `POST /calendar/list`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "cal_name": { + "description": "New calendar name.", + "maxLength": 39, + "minLength": 1, + "type": [ + "string", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "description": { + "description": "New description.", + "maxLength": 499, + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "extra_cal_ids": { + "description": "Additional public-holiday calendar IDs to inherit events from.", + "items": { + "type": "string" + }, + "type": "array" + }, + "team_id": { + "description": "New owning team ID; obtain it from `POST /team/list`.", + "format": "uint64", + "type": [ + "integer", + "null" + ] + }, + "timezone": { + "description": "New IANA timezone.", + "type": [ + "string", + "null" + ] + }, + "workdays": { + "description": "Workday numbers (0 = Sunday, 6 = Saturday).", + "items": { + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightTopkAlertByLabelRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "label": "check", - "k": 10, - "orderby": "total_alert_cnt" - } - } - } - } - } - }, - "/insight/account": { - "post": { - "operationId": "insightByAccount", - "summary": "Get account-level insight", - "description": "Return aggregated incident insight metrics for the entire account.", - "tags": [ - "On-call/Analytics" + "required": [ + "cal_id" ], - "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`) |", - "href": "/en/api-reference/on-call/analytics/insight-by-account", - "metadata": { - "sidebarTitle": "Get account-level insight" + "type": "object" + }, + "CancelStatusPageMigrationRequest": { + "description": "Parameters for cancelling an in-progress migration job.", + "properties": { + "job_id": { + "description": "Migration job ID, returned when the migration job is created; check progress via `GET /status-page/migration/status`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DimensionInsightResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "ts": 1740844800, - "total_incident_cnt": 2, - "total_incidents_acknowledged": 2, - "total_incidents_closed": 2, - "total_incidents_auto_closed": 0, - "total_incidents_manually_closed": 2, - "total_incidents_timeout_closed": 0, - "total_incidents_escalated": 0, - "total_incidents_manually_escalated": 0, - "total_incidents_timeout_escalated": 0, - "total_incidents_reassigned": 2, - "total_interruptions": 3, - "total_notifications": 6, - "total_engaged_seconds": 3317709, - "total_seconds_to_ack": 3317709, - "total_seconds_to_close": 3749514, - "mean_seconds_to_ack": 1658854.5, - "mean_seconds_to_close": 1874757, - "noise_reduction_pct": 0, - "acknowledgement_pct": 100, - "total_alert_cnt": 0, - "total_alert_event_cnt": 0 - } - ] - } - } - } - } + "required": [ + "job_id" + ], + "type": "object" + }, + "ChangeEventItem": { + "properties": { + "account_id": { + "description": "Account this change event belongs to.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "change_key": { + "description": "Stable key that groups events belonging to the same change.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "change_status": { + "description": "Lifecycle status of the change event, reported by the change source as execution progresses.\n| Value | Meaning |\n|---|---|\n| `Planned` | Planned, not started. |\n| `Ready` | Ready for execution. |\n| `Processing` | Being executed. |\n| `Canceled` | Canceled. |\n| `Done` | Completed. |", + "enum": [ + "Planned", + "Ready", + "Processing", + "Canceled", + "Done" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "channel_id": { + "description": "Collaboration channel this change event is routed to.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "aggregate_unit": "day", - "severities": [ - "Critical", - "Warning" - ] - } - } - } - } - } - }, - "/insight/incident/list": { - "post": { - "operationId": "insightIncidentList", - "summary": "List insight incidents", - "description": "Return a paged list of incidents with per-incident handling metrics used by the analytics dashboard.", - "tags": [ - "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`) |", - "href": "/en/api-reference/on-call/analytics/insight-incident-list", - "metadata": { - "sidebarTitle": "List insight incidents" + "created_at": { + "description": "Unix timestamp in seconds when the change event was created.", + "format": "int64", + "type": "integer" + }, + "deleted_at": { + "description": "Unix timestamp in seconds when the change event was deleted. Omitted when not deleted.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Change event description.", + "type": "string" + }, + "event_id": { + "description": "Change event ID, a MongoDB ObjectID hex string.", + "type": "string" + }, + "event_time": { + "description": "Unix timestamp in seconds when the change event occurred.", + "format": "int64", + "type": "integer" + }, + "integration_id": { + "description": "Integration that reported this change event.", + "format": "int64", + "type": "integer" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Key-value labels attached to the change event.", + "type": "object" + }, + "link": { + "description": "External link to the source change record.", + "type": "string" + }, + "title": { + "description": "Change event title.", + "type": "string" + }, + "updated_at": { + "description": "Unix timestamp in seconds when the change event was last updated.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/InsightIncidentListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 2363, - "has_next_page": true, - "search_after_ctx": "6a86b5d6f72de50ae1ce2ffb", - "items": [ - { - "incident_id": "6a86b5d6f72de50ae1ce2ffb", - "title": "CPU usage above 90% on prod-web-01", - "description": "CPU usage stayed above the threshold for 5 minutes", - "team_id": 2477033058131, - "team_name": "SRE Team", - "channel_id": 3047621227131, - "channel_name": "Production Alerts", - "progress": "Closed", - "severity": "Critical", - "created_at": 1787213270, - "alert_cnt": 3, - "active_alert_cnt": 0, - "alert_event_cnt": 5, - "closed_by": "manually", - "creator_id": 2477273692131, - "creator_name": "alice", - "closer_id": 2477273692131, - "closer_name": "alice", - "seconds_to_ack": 14, - "seconds_to_close": 1830, - "engaged_seconds": 1816, - "hours": "work", - "responders": [ - { - "person_id": 2477273692131, - "assigned_at": 1787213270, - "acknowledged_at": 1787213284, - "person_name": "alice", - "email": "alice@example.com" - } - ], - "assigned_to": { - "escalate_rule_id": "66138789904a9027583dbc4e", - "layer_idx": 0, - "type": "assign", - "assigned_at": 1787213270, - "id": "b8tyUoRvCv4wsPndFRpmNL", - "escalate_rule_name": "On-call Policy" - }, - "notifications": 2, - "interruptions": 1, - "assignments": 1, - "reassignments": 0, - "acknowledgements": 1, - "escalations": 0, - "timeout_escalations": 0, - "manual_escalations": 0 - } - ] - } - } - } - } + "type": "object" + }, + "ChangeItem": { + "properties": { + "account_id": { + "description": "Account this change belongs to.", + "format": "int64", + "type": "integer" + }, + "change_id": { + "description": "Change ID, a MongoDB ObjectID hex string.", + "type": "string" + }, + "change_key": { + "description": "Stable key that groups events belonging to the same change.", + "type": "string" + }, + "change_status": { + "description": "Current lifecycle status of the change.\n| Value | Meaning |\n|---|---|\n| `Planned` | Planned, not started. |\n| `Ready` | Ready for execution. |\n| `Processing` | Being executed. |\n| `Canceled` | Canceled. |\n| `Done` | Completed. |", + "enum": [ + "Planned", + "Ready", + "Processing", + "Canceled", + "Done" + ], + "type": "string" + }, + "channel_id": { + "description": "Collaboration channel this change is routed to.", + "format": "int64", + "type": "integer" + }, + "channel_name": { + "description": "Name of the collaboration channel.", + "type": "string" + }, + "channel_status": { + "description": "Status of the collaboration channel: `enabled` or `disabled`.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "description": { + "description": "Change description.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "end_time": { + "description": "Unix timestamp in seconds when the change ended.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "events": { + "description": "Underlying change events, returned only when include_events is true.", + "items": { + "$ref": "#/components/schemas/ChangeEventItem" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "integration_id": { + "description": "Integration that reported this change.", + "format": "int64", + "type": "integer" + }, + "integration_name": { + "description": "Name of the reporting integration.", + "type": "string" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Key-value labels attached to the change.", + "type": "object" + }, + "last_time": { + "description": "Unix timestamp in seconds of the most recent change activity.", + "format": "int64", + "type": "integer" + }, + "link": { + "description": "External link to the source change record.", + "type": "string" + }, + "start_time": { + "description": "Unix timestamp in seconds when the change started.", + "format": "int64", + "type": "integer" + }, + "title": { + "description": "Change title.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightIncidentListRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "p": 1, - "limit": 20, - "severities": [ - "Critical" - ] - } - } + "type": "object" + }, + "ChannelCreateResponse": { + "properties": { + "channel_id": { + "description": "Newly created channel ID.", + "format": "int64", + "type": "integer" + }, + "channel_name": { + "description": "Channel name echoed back from the request.", + "type": "string" + }, + "external_report_token": { + "description": "External report token. Emitted only when external reporting is enabled.", + "type": "string" } - } - } - }, - "/insight/incident/export": { - "post": { - "operationId": "insightIncidentExport", - "summary": "Export insight incidents", - "description": "Export the filtered incident analytics list as a CSV file. The response is a CSV stream delivered with `Content-Disposition: attachment` — it is not a JSON envelope. CSV headers and formatted values use the request locale, falling back to the member locale and then the account locale. `time_zone` defaults to the account time zone, then `Asia/Shanghai`. Export stops after at most 100,000 rows. Valid `export_fields` keys: incident_id, title, severity, progress, channel_id, channel_name, team_id, team_name, created_at, alert_cnt, active_alert_cnt, alert_event_cnt, seconds_to_ack, seconds_to_close, closed_by, owner_id, owner_name, creator_id, creator_name, closer_id, closer_name, engaged_seconds, hours, notifications, interruptions, acknowledgements, ackers, assignments, reassignments, escalations, manual_escalations, timeout_escalations, assigned_to, raw_assigned_to, escalate_rule_name, responders, raw_responders, snooze_status, snoozed_before, ever_muted, frequency, is_rare, description, labels, fields. When `export_fields` is omitted, all columns are exported.", - "tags": [ - "On-call/Analytics" + }, + "required": [ + "channel_id", + "channel_name" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/day**; **20 requests/minute**; **10 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |", - "href": "/en/api-reference/on-call/analytics/insight-incident-export", - "metadata": { - "sidebarTitle": "Export insight incidents" + "type": "object" + }, + "ChannelIDRequest": { + "properties": { + "channel_id": { + "description": "Channel ID; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "description": "CSV file stream (`Content-Type: application/octet-stream`, `Content-Disposition: attachment; filename=incident_export_yyyyMMdd_HHmmss.csv`). The first row holds localized column headers. Columns default to the full incident field set, or the keys given in `export_fields`." - }, - "example": "incident_id,title,severity,created_at\n6a86b5d6f72de50ae1ce2ffb,CPU usage above 90%,Critical,2026-01-01 10:00:00 +0800 CST\n" - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" + "required": [ + "channel_id" + ], + "type": "object" + }, + "ChannelInfoRequest": { + "properties": { + "channel_id": { + "description": "ID of the channel to query; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightIncidentExportRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "severities": [ - "Critical", - "Warning" - ], - "export_fields": [ - "incident_id", - "title", - "severity", - "created_at", - "seconds_to_close" - ], - "description_html_to_text": true - } - } + "required": [ + "channel_id" + ], + "type": "object" + }, + "ChannelInfosRequest": { + "properties": { + "channel_ids": { + "description": "Channel IDs to look up. Up to 1000.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 1000, + "type": "array" } - } - } - }, - "/insight/channel": { - "post": { - "operationId": "insightByChannel", - "summary": "Get channel insight", - "description": "Return insight metrics aggregated by channel.", - "tags": [ - "On-call/Analytics" + }, + "required": [ + "channel_ids" ], - "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`) |", - "href": "/en/api-reference/on-call/analytics/insight-by-channel", - "metadata": { - "sidebarTitle": "Get channel insight" + "type": "object" + }, + "ChannelInfosResponse": { + "properties": { + "items": { + "description": "Brief info for the requested `channel_ids` that actually exist; IDs not found are ignored.", + "items": { + "$ref": "#/components/schemas/ChannelShort" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DimensionInsightResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "ts": 1740844800, - "channel_id": 4321322010131, - "channel_name": "Production Alerts", - "total_incident_cnt": 2, - "total_incidents_acknowledged": 2, - "total_incidents_closed": 2, - "total_incidents_auto_closed": 0, - "total_incidents_manually_closed": 2, - "total_incidents_timeout_closed": 0, - "total_incidents_escalated": 0, - "total_incidents_manually_escalated": 0, - "total_incidents_timeout_escalated": 0, - "total_incidents_reassigned": 2, - "total_interruptions": 3, - "total_notifications": 6, - "total_engaged_seconds": 3317709, - "total_seconds_to_ack": 3317709, - "total_seconds_to_close": 3749514, - "mean_seconds_to_ack": 1658854.5, - "mean_seconds_to_close": 1874757, - "noise_reduction_pct": 0, - "acknowledgement_pct": 100, - "total_alert_cnt": 0, - "total_alert_event_cnt": 0 - } - ] - } - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "ChannelItem": { + "description": "Channel detail record. All fields are optional; they are emitted only when populated.", + "properties": { + "account_id": { + "description": "Owning account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "active_incident_highest_severity": { + "description": "Highest severity among the channel's active (triggered or processing) incidents: `Critical`, `Warning` or `Info`. Omitted when there are no active incidents.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "auto_resolve_mode": { + "description": "How the auto-resolve timer is reset. `trigger` (default) starts the timer once when the incident is triggered — later merged alerts do not affect it; `update` restarts the timer from the latest alert time whenever a new alert merges into the incident.", + "enum": [ + "trigger", + "update" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "auto_resolve_timeout": { + "description": "Auto-resolve timeout in seconds. 0 disables auto-resolve.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "channel_id": { + "description": "Channel ID.", + "format": "int64", + "type": "integer" + }, + "channel_name": { + "description": "Channel name.", + "type": "string" + }, + "created_at": { + "description": "Creation time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "Member ID who created the channel.", + "format": "int64", + "type": "integer" + }, + "creator_name": { + "description": "Name of the member who created the channel (resolved from the member directory; empty when unavailable).", + "type": "string" + }, + "deleted_at": { + "description": "Deletion time, Unix timestamp in seconds. Non-zero only for soft-deleted channels.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Free-form description.", + "type": "string" + }, + "disable_auto_close": { + "description": "When true, automatic incident closing is disabled.", + "type": "boolean" + }, + "disable_outlier_detection": { + "description": "When true, outlier incident detection is disabled.", + "type": "boolean" + }, + "event_group": { + "$ref": "#/components/schemas/EventGroup", + "description": "Alert event merge configuration." + }, + "external_report_token": { + "description": "Token granted to external reporters. Omitted unless external reporting is enabled on the channel.", + "type": "string" + }, + "flapping": { + "$ref": "#/components/schemas/Flapping", + "description": "Flapping detection configuration." + }, + "group": { + "$ref": "#/components/schemas/Group", + "description": "Alert grouping configuration." + }, + "is_external_report_enabled": { + "description": "Whether external reporters can file incidents into this channel.", + "type": "boolean" + }, + "is_private": { + "description": "When true, the channel is visible only to its managing teams.", + "type": "boolean" + }, + "is_starred": { + "description": "Whether the current user has starred this channel. Present only in `POST /channel/list` responses.", + "type": "boolean" + }, + "last_incident_at": { + "description": "Time of the most recent incident, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "managing_team_ids": { + "description": "Additional teams that can manage the channel.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "progress_to_incident_cnts": { + "$ref": "#/components/schemas/IncProgressCnts", + "description": "Incident counts by progress over the last 30 days." + }, + "status": { + "description": "Channel status. `enabled` receives and processes events normally; `disabled` drops incoming events outright; `deleted` is returned only when fetching a channel by ID — list endpoints never return it.", + "enum": [ + "enabled", + "disabled", + "deleted" + ], + "type": "string" + }, + "team_id": { + "description": "Owning team ID.", + "format": "int64", + "type": "integer" + }, + "team_name": { + "description": "Owning team name (resolved from the team directory; empty when unavailable).", + "type": "string" + }, + "updated_at": { + "description": "Last update time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "channel_ids": [ - 4321322010131 - ], - "aggregate_unit": "day" - } - } + "type": "object" + }, + "ChannelRuleIDRequest": { + "properties": { + "channel_id": { + "description": "Owning channel ID; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" + }, + "rule_id": { + "description": "Rule ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" } - } - } - }, - "/insight/channel/export": { - "post": { - "operationId": "insightChannelExport", - "summary": "Export channel insight", - "description": "Export channel insight metrics as a CSV file — one row per channel (and per time/hour bucket when `aggregate_unit`/`split_hours` is used). The response is a CSV stream delivered with `Content-Disposition: attachment` — it is not a JSON envelope. `time_zone` defaults to UTC. Rows without a valid channel ID are skipped. Valid `export_fields` keys: channel_id, channel_name, total_incident_cnt, total_incidents_acknowledged, total_incidents_closed, total_incidents_auto_closed, total_incidents_manually_closed, total_incidents_timeout_closed, total_incidents_escalated, total_incidents_manually_escalated, total_incidents_timeout_escalated, total_incidents_reassigned, total_interruptions, total_notifications, total_engaged_seconds, mean_seconds_to_ack, mean_seconds_to_close, noise_reduction_pct, acknowledgement_pct, total_alert_cnt, total_alert_event_cnt, hours. The `hours` column is included by default only when `split_hours` is true. For compatibility, incident-export column keys are also accepted but produce empty columns.", - "tags": [ - "On-call/Analytics" + }, + "required": [ + "channel_id", + "rule_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/day**; **20 requests/minute**; **10 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |", - "href": "/en/api-reference/on-call/analytics/insight-channel-export", - "metadata": { - "sidebarTitle": "Export channel insight" + "type": "object" + }, + "ChannelScopedListRequest": { + "properties": { + "channel_id": { + "description": "Channel to list rules for.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "description": "CSV file stream (`Content-Type: application/octet-stream`, `Content-Disposition: attachment; filename=channel_export_yyyyMMdd_HHmmss.csv`). The first row holds localized column headers. Columns default to the full field set, or the keys given in `export_fields`." - }, - "example": "channel_id,channel_name,total_incident_cnt,total_incidents_closed\n4321322010131,Production Alerts,12,10\n" - } - } + "required": [ + "channel_id" + ], + "type": "object" + }, + "ChannelShort": { + "properties": { + "channel_id": { + "description": "Channel ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_name": { + "description": "Channel name.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "status": { + "description": "Channel status: `enabled` processes events normally; `disabled` discards incoming events; `deleted` is soft-deleted.", + "enum": [ + "enabled", + "disabled", + "deleted" + ], + "type": "string" + } + }, + "required": [ + "channel_id", + "channel_name" + ], + "type": "object" + }, + "CommentIncidentRequest": { + "description": "Parameters for adding a comment to one or more incidents.", + "properties": { + "comment": { + "description": "Comment body. Leading and trailing whitespace is trimmed; the comment must be non-empty after trimming and at most 1024 characters (counted after @mention normalization).", + "maxLength": 1024, + "type": "string" + }, + "comment_type_id": { + "description": "Optional ID of an account-level comment type to attach to the comment (MongoDB ObjectID). An invalid or all-zero ID is rejected with 400.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": [ + "string", + "null" + ] + }, + "incident_ids": { + "description": "Incident IDs to comment on. At most 100 per call.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "mute_reply": { + "description": "When true, do not trigger webhook reply actions for this comment.", + "type": "boolean" + } + }, + "required": [ + "incident_ids", + "comment" + ], + "type": "object" + }, + "CompleteWorkItemRequest": { + "description": "Parameters for completing a work item.", + "properties": { + "idempotency_key": { + "description": "Client-generated idempotency key (max 128 characters; letters, digits, `_`, `-`, `.`, `:` only).", + "maxLength": 128, + "pattern": "^[A-Za-z0-9_\\-.:]+$", + "type": "string" + }, + "target_status": { + "description": "Client-defined status to set (max 64 characters). There is no fixed state machine.", + "maxLength": 64, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "version": { + "description": "Current item version for optimistic locking. Must match the stored version.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "work_item_id": { + "description": "Work item ID (opaque string, max 128 characters).", + "maxLength": 128, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "channel_ids": [ - 4321322010131 - ], - "severities": [ - "Critical", - "Warning" - ] - } - } - } - } - } - }, - "/insight/team": { - "post": { - "operationId": "insightByTeam", - "summary": "Get team insight", - "description": "Return insight metrics aggregated by team.", - "tags": [ - "On-call/Analytics" + "required": [ + "work_item_id", + "version", + "target_status", + "idempotency_key" ], - "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`) |", - "href": "/en/api-reference/on-call/analytics/insight-by-team", - "metadata": { - "sidebarTitle": "Get team insight" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DimensionInsightResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "ts": 1740844800, - "team_id": 4295771902131, - "team_name": "SRE Team", - "total_incident_cnt": 2, - "total_incidents_acknowledged": 2, - "total_incidents_closed": 2, - "total_incidents_auto_closed": 0, - "total_incidents_manually_closed": 2, - "total_incidents_timeout_closed": 0, - "total_incidents_escalated": 0, - "total_incidents_manually_escalated": 0, - "total_incidents_timeout_escalated": 0, - "total_incidents_reassigned": 2, - "total_interruptions": 3, - "total_notifications": 6, - "total_engaged_seconds": 3317709, - "total_seconds_to_ack": 3317709, - "total_seconds_to_close": 3749514, - "mean_seconds_to_ack": 1658854.5, - "mean_seconds_to_close": 1874757, - "noise_reduction_pct": 0, - "acknowledgement_pct": 100, - "total_alert_cnt": 0, - "total_alert_event_cnt": 0 - } - ] - } - } - } - } + "type": "object" + }, + "ContextResolvedItem": { + "description": "Snapshot of the three-tier knowledge-pack resolution for this session.", + "properties": { + "account_pack_id": { + "description": "Resolved account-scoped pack id.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "incident_id": { + "description": "Bound incident id, when war-room originated.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "resolved_at_ms": { + "description": "Unix timestamp in milliseconds when the packs were resolved.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "team_pack_id": { + "description": "Resolved team-scoped pack id.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "versions": { + "additionalProperties": { + "type": "integer" + }, + "description": "Per-pack resolved version map.", + "type": "object" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "team_ids": [ - 4295771902131 - ], - "aggregate_unit": "day" - } - } - } - } - } - }, - "/insight/team/export": { - "post": { - "operationId": "insightTeamExport", - "summary": "Export team insight", - "description": "Export team insight metrics as a CSV file — one row per team (and per time/hour bucket when `aggregate_unit`/`split_hours` is used). The response is a CSV stream delivered with `Content-Disposition: attachment` — it is not a JSON envelope. `time_zone` defaults to UTC. Rows without a valid team ID are skipped. Valid `export_fields` keys: team_id, team_name, total_incident_cnt, total_incidents_acknowledged, total_incidents_closed, total_incidents_auto_closed, total_incidents_manually_closed, total_incidents_timeout_closed, total_incidents_escalated, total_incidents_manually_escalated, total_incidents_timeout_escalated, total_incidents_reassigned, total_interruptions, total_notifications, total_engaged_seconds, mean_seconds_to_ack, mean_seconds_to_close, noise_reduction_pct, acknowledgement_pct, total_alert_cnt, total_alert_event_cnt, hours. The `hours` column is included by default only when `split_hours` is true. For compatibility, incident-export column keys are also accepted but produce empty columns.", - "tags": [ - "On-call/Analytics" + "required": [ + "resolved_at_ms" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/day**; **20 requests/minute**; **10 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |", - "href": "/en/api-reference/on-call/analytics/insight-team-export", - "metadata": { - "sidebarTitle": "Export team insight" + "type": "object" + }, + "ConvertWorkItemRequest": { + "description": "Parameters for converting an action item into a post-mortem follow-up in place.", + "properties": { + "idempotency_key": { + "description": "Client-generated idempotency key (max 128 characters; letters, digits, `_`, `-`, `.`, `:` only).", + "maxLength": 128, + "pattern": "^[A-Za-z0-9_\\-.:]+$", + "type": "string" + }, + "target_status": { + "description": "Optional client-defined status to set on the converted follow-up (max 64 characters).", + "maxLength": 64, + "type": [ + "string", + "null" + ] + }, + "version": { + "description": "Current item version for optimistic locking. Must match the stored version.", + "format": "int64", + "type": "integer" + }, + "work_item_id": { + "description": "Work item ID (opaque string, max 128 characters).", + "maxLength": 128, + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "description": "CSV file stream (`Content-Type: application/octet-stream`, `Content-Disposition: attachment; filename=team_export_yyyyMMdd_HHmmss.csv`). The first row holds localized column headers. Columns default to the full field set, or the keys given in `export_fields`." - }, - "example": "team_id,team_name,total_incident_cnt,total_incidents_closed\n4295771902131,SRE Team,12,10\n" - } - } + "required": [ + "work_item_id", + "version", + "idempotency_key" + ], + "type": "object" + }, + "CreateChannelRequest": { + "description": "Parameters for creating a channel.", + "properties": { + "auto_resolve_mode": { + "description": "Auto-resolve timing mode: `trigger` starts the timer when the incident triggers, `update` restarts it on every alert update.", + "enum": [ + "trigger", + "update" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "auto_resolve_timeout": { + "description": "Auto-resolve timeout in seconds. 0 disables auto-resolve. Max 30 days.", + "format": "int64", + "maximum": 2592000, + "minimum": 0, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "channel_name": { + "description": "Channel name. 1 to 59 characters.", + "maxLength": 59, + "minLength": 1, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "description": { + "description": "Free-form description. Up to 500 characters.", + "maxLength": 500, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" + "disable_auto_close": { + "description": "Disable automatic incident closing.", + "type": "boolean" + }, + "disable_outlier_detection": { + "description": "Disable outlier incident detection.", + "type": "boolean" + }, + "escalate_rule": { + "description": "Default escalation rule applied to the channel. Omit to skip default escalation.", + "properties": { + "aggr_window": { + "description": "Delay window in seconds. 0 disables delay.", + "maximum": 3600, + "minimum": 0, + "type": "integer" }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "team_ids": [ - 4295771902131 - ], - "severities": [ - "Critical", - "Warning" - ] - } - } - } - } - } - }, - "/insight/responder": { - "post": { - "operationId": "insightByResponder", - "summary": "Get responder insight", - "description": "Return insight metrics aggregated by responder.", - "tags": [ - "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`) |", - "href": "/en/api-reference/on-call/analytics/insight-by-responder", - "metadata": { - "sidebarTitle": "Get responder insight" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" + "target": { + "description": "Notification target. At least one of `person_ids`, `team_ids`, `schedule_to_role_ids`, or `emails` must be set, together with either `by` or `webhooks`.", + "properties": { + "by": { + "description": "Per-severity personal notification channels. Required unless `webhooks` is provided.", + "properties": { + "critical": { + "description": "Notify channels used for Critical severity. Personal channels: `sms`, `voice`, `email`, `push`; IM group-chat channels: `feishu_app:`, `dingtalk_app:`, `wecom_app:`, `slack_app:`, `teams_app:`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "follow_preference": { + "description": "When true, use each responder's personal preference instead of the lists below.", + "type": "boolean" + }, + "info": { + "description": "Notify channels used for Info severity. Values as for `critical`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "warning": { + "description": "Notify channels used for Warning severity. Values as for `critical`.", + "items": { + "type": "string" + }, + "type": "array" + } }, - { - "type": "object", + "type": "object" + }, + "emails": { + "description": "Email addresses to notify (push-only scenarios).", + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "person_ids": { + "description": "Member IDs to notify directly; obtain member IDs from `POST /member/list`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "schedule_to_role_ids": { + "additionalProperties": { + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "description": "Map of schedule ID to the role IDs on that schedule to notify.", + "type": "object" + }, + "team_ids": { + "description": "Team IDs to notify; obtain team IDs from `POST /team/list`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "webhooks": { + "description": "Group chat / webhook targets. Required unless `by` is provided.", + "items": { "properties": { - "data": { - "$ref": "#/components/schemas/ResponderInsightResponse" + "settings": { + "additionalProperties": true, + "description": "Type-specific settings (chat IDs, URLs, etc.).", + "type": "object" + }, + "type": { + "description": "Webhook type, one of `feishu`, `feishu_app`, `dingtalk`, `dingtalk_app`, `wecom`, `slack`, `slack_app`, `teams_app`, `telegram`, `zoom`.", + "type": "string" } - } + }, + "required": [ + "type", + "settings" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "template_id": { + "description": "Notification template ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + } + }, + "required": [ + "template_id", + "target" + ], + "type": "object" + }, + "event_group": { + "$ref": "#/components/schemas/EventGroup", + "description": "Alert event merge configuration. Omit to use the default (merge enabled, 1440-minute window)." + }, + "flapping": { + "description": "Flapping detection configuration.", + "properties": { + "in_mins": { + "description": "Observation window in minutes.", + "maximum": 1440, + "minimum": 1, + "type": "integer" + }, + "is_disabled": { + "description": "Disable flapping detection.", + "type": "boolean" + }, + "max_changes": { + "description": "Max state changes allowed within `in_mins`.", + "maximum": 100, + "minimum": 2, + "type": "integer" + }, + "mute_mins": { + "description": "Mute duration in minutes after flapping is detected.", + "maximum": 1440, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" + }, + "group": { + "description": "Alert grouping configuration.", + "properties": { + "all_equals_required": { + "description": "When true, all listed keys must be present for grouping.", + "type": "boolean" + }, + "cases": { + "description": "Per-filter grouping overrides.", + "items": { + "description": "Conditional grouping override: stored alerts matching `if` are grouped by `equals` instead of the top-level grouping keys.", + "properties": { + "equals": { + "description": "Grouping keys for matching alerts. Supported values: `title`, `description`, `severity`, or any `labels.`.", + "items": { + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" + }, + "if": { + "description": "AND-ed match conditions evaluated against stored alert fields.", + "items": { + "$ref": "#/components/schemas/FilterCondition" + }, + "type": "array" } - ] + }, + "required": [ + "if", + "equals" + ], + "type": "object" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "ts": 1740844800, - "responder_id": 3790925372131, - "responder_name": "alice", - "total_incident_cnt": 1, - "total_incidents_acknowledged": 1, - "total_incidents_reassigned": 0, - "total_incidents_escalated": 0, - "total_incidents_timeout_escalated": 0, - "total_incidents_manually_escalated": 0, - "total_interruptions": 1, - "total_notifications": 2, - "total_engaged_seconds": 10, - "total_seconds_to_ack": 2265624, - "mean_seconds_to_ack": 2265624, - "acknowledgement_pct": 100 - } - ] - } - } + "maxItems": 100, + "type": "array" + }, + "equals": { + "description": "Groups of label keys whose equality defines a bucket.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxItems": 5, + "type": "array" + }, + "i_keys": { + "description": "Label keys used for intelligent grouping embeddings.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "i_score_threshold": { + "description": "Intelligent grouping similarity threshold.", + "format": "float", + "maximum": 1, + "minimum": 0.5, + "type": "number" + }, + "method": { + "description": "Grouping method: `i` intelligent, `p` pattern, `n` none.", + "enum": [ + "i", + "p", + "n" + ], + "type": "string" + }, + "storm_threshold": { + "description": "Alert storm threshold.", + "maximum": 10000, + "minimum": 0, + "type": "integer" + }, + "storm_thresholds": { + "description": "Multi-level storm thresholds.", + "items": { + "type": "integer" + }, + "maxItems": 5, + "type": "array" + }, + "time_window": { + "description": "Grouping time window in minutes. Default max is 1440 minutes (24 h); extended accounts may allow up to 43200 minutes (30 days).", + "minimum": 0, + "type": "integer" + }, + "window_type": { + "description": "Window type, default `tumbling`. `tumbling` is a fixed window counted from incident creation — once it expires, new alerts open a new incident; `sliding` is a sliding window counted from the incident's most recent alert, extended each time a new alert merges in.", + "enum": [ + "tumbling", + "sliding" + ], + "type": "string" } - } + }, + "required": [ + "method" + ], + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "is_external_report_enabled": { + "description": "Allow external reporters to file incidents into this channel.", + "type": "boolean" + }, + "is_private": { + "description": "When true, the channel is visible only to its managing teams.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "managing_team_ids": { + "description": "Additional teams that can manage the channel. Up to 3 entries.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 3, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "plugin_ids": { + "description": "IDs of plugins (integrations) subscribed to this channel.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "team_id": { + "description": "Owning team ID; obtain it from `POST /team/list`.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "responder_ids": [ - 3790925372131 - ], - "aggregate_unit": "day" - } - } - } - } - } - }, - "/insight/responder/export": { - "post": { - "operationId": "insightResponderExport", - "summary": "Export responder insight", - "description": "Export responder insight metrics as a CSV file — one row per responder (and per time/hour bucket when `aggregate_unit`/`split_hours` is used). The response is a CSV stream delivered with `Content-Disposition: attachment` — it is not a JSON envelope. `time_zone` defaults to UTC. Rows without a valid responder ID are skipped. Valid `export_fields` keys: responder_id, responder_name, total_incident_cnt, total_incidents_acknowledged, total_incidents_reassigned, total_incidents_escalated, total_incidents_manually_escalated, total_incidents_timeout_escalated, total_interruptions, total_notifications, total_engaged_seconds, mean_seconds_to_ack, acknowledgement_pct, hours. The `hours` column is included by default only when `split_hours` is true. For compatibility, incident-export column keys are also accepted but produce empty columns.", - "tags": [ - "On-call/Analytics" + "required": [ + "team_id", + "channel_name" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/day**; **20 requests/minute**; **10 requests/second** per account |\n| Permissions | **Analytics Read** (`on-call`) |", - "href": "/en/api-reference/on-call/analytics/insight-responder-export", - "metadata": { - "sidebarTitle": "Export responder insight" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary", - "description": "CSV file stream (`Content-Type: application/octet-stream`, `Content-Disposition: attachment; filename=responder_export_yyyyMMdd_HHmmss.csv`). The first row holds localized column headers. Columns default to the full field set, or the keys given in `export_fields`." - }, - "example": "responder_id,responder_name,total_incident_cnt,total_incidents_acknowledged\n3790925372131,alice,5,4\n" - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "type": "object" + }, + "CreateDropRuleRequest": { + "description": "Parameters for creating a channel drop rule.", + "properties": { + "channel_id": { + "description": "Owning channel ID; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Rule description, up to 500 characters.", + "maxLength": 500, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "filters": { + "description": "Alert event match conditions (OR-of-AND); matching events are discarded entirely — no alert, incident, or notification is produced. When omitted or empty, the rule matches nothing.", + "items": { + "items": { + "properties": { + "key": { + "description": "Field key (e.g. `alert_severity`, `labels.service`).", + "type": "string" + }, + "oper": { + "description": "Filter operator.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to match.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "type": "array" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rule_name": { + "description": "Rule name, 1 to 39 characters.", + "maxLength": 39, + "minLength": 1, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InsightQueryRequest" - }, - "example": { - "start_time": 1712000000, - "end_time": 1712604800, - "responder_ids": [ - 3790925372131 - ], - "severities": [ - "Critical", - "Warning" - ] - } - } - } - } - } - }, - "/status-page/change/info": { - "get": { - "operationId": "statusPageChangeInfo", - "summary": "Get status page event detail", - "description": "Retrieve details of a specific status page event (incident or maintenance).", - "tags": [ - "On-call/Status pages" + "required": [ + "channel_id", + "rule_name" ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-info", - "metadata": { - "sidebarTitle": "Get status page event detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" + "type": "object" + }, + "CreateEscalationRuleRequest": { + "description": "Parameters for creating an escalation rule.", + "properties": { + "aggr_window": { + "description": "Delay window in seconds. 0 disables delay.", + "maximum": 3600, + "minimum": 0, + "type": "integer" + }, + "channel_id": { + "description": "Owning channel ID; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Rule description, up to 500 characters.", + "maxLength": 500, + "type": "string" + }, + "filters": { + "description": "Incident-level match conditions (OR-of-AND tree): the rule is matched against the incident the alert was grouped into, not against the alert itself. Omit or leave empty to apply the rule to all incidents in the channel.", + "items": { + "items": { + "properties": { + "key": { + "description": "Field key (e.g. `alert_severity`, `labels.service`).", + "type": "string" + }, + "oper": { + "description": "Filter operator.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to match.", + "items": { + "type": "string" }, - { - "type": "object", + "type": "array" + } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "layers": { + "description": "Escalation levels in order. At least one level is required.", + "items": { + "properties": { + "escalate_window": { + "description": "Wait before moving to the next level, in minutes.", + "maximum": 720, + "minimum": 0, + "type": "integer" + }, + "force_escalate": { + "description": "When true, always escalate regardless of acknowledgement.", + "type": "boolean" + }, + "max_times": { + "description": "Max repeat notifications within the level.", + "maximum": 6, + "minimum": 0, + "type": "integer" + }, + "notify_step": { + "description": "Repeat interval in minutes.", + "format": "float", + "maximum": 120, + "minimum": 0.5, + "type": "number" + }, + "target": { + "description": "Notification target. At least one of `person_ids`, `team_ids`, `schedule_to_role_ids`, or `emails` must be set, together with either `by` or `webhooks`.", + "properties": { + "by": { + "description": "Per-severity personal notification channels. Required unless `webhooks` is provided.", "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageChangeItem" + "critical": { + "description": "Notify channels used for Critical severity. Personal channels: `sms`, `voice`, `email`, `push`; IM group-chat channels: `feishu_app:`, `dingtalk_app:`, `wecom_app:`, `slack_app:`, `teams_app:`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "follow_preference": { + "description": "When true, use each responder's personal preference instead of the lists below.", + "type": "boolean" + }, + "info": { + "description": "Notify channels used for Info severity. Values as for `critical`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "warning": { + "description": "Notify channels used for Warning severity. Values as for `critical`.", + "items": { + "type": "string" + }, + "type": "array" } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "change_id": 5821693893131, - "page_id": 5750613685214, - "type": "incident", - "title": "Web Console Degraded Performance", - "description": "The issue has been resolved, and all services are operating normally.\n\nThank you for your patience.", - "status": "resolved", - "affected_components": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "section_id": "01KC3FKKX5TSVG6Z3X1QNGF6V2", - "name": "Web Console", - "available_since_seconds": 1765349358, - "order_id": 1, - "status": "operational" - } - ], - "start_at_seconds": 1766736878, - "close_at_seconds": 1775529742, - "updates": [ - { - "update_id": "01KDCVJQ88SZPHWPTDV2Z2AZW8", - "at_seconds": 1766736876, - "status": "investigating", - "description": "We are currently investigating an issue affecting some services.", - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "component_name": "Web Console", - "status": "degraded" - } - ] }, - { - "update_id": "01KNJX3KW873ZZSRZC14SGFYS3", - "at_seconds": 1775529742, - "status": "resolved", - "description": "The issue has been resolved, and all services are operating normally.", - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "component_name": "Web Console", - "status": "operational" + "type": "object" + }, + "emails": { + "description": "Email addresses to notify (push-only scenarios).", + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "person_ids": { + "description": "Member IDs to notify directly; obtain member IDs from `POST /member/list`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "schedule_to_role_ids": { + "additionalProperties": { + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "description": "Map of schedule ID to the role IDs on that schedule to notify.", + "type": "object" + }, + "team_ids": { + "description": "Team IDs to notify; obtain team IDs from `POST /team/list`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "webhooks": { + "description": "Group chat / webhook targets. Required unless `by` is provided.", + "items": { + "properties": { + "settings": { + "additionalProperties": true, + "description": "Type-specific settings (chat IDs, URLs, etc.).", + "type": "object" + }, + "type": { + "description": "Webhook type, one of `feishu`, `feishu_app`, `dingtalk`, `dingtalk_app`, `wecom`, `slack`, `slack_app`, `teams_app`, `telegram`, `zoom`.", + "type": "string" } - ] - } - ], - "notify_subscribers": true - } + }, + "required": [ + "type", + "settings" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" } - } - } + }, + "required": [ + "target" + ], + "type": "object" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "priority": { + "description": "Evaluation priority. Lower runs first.", + "maximum": 200, + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "rule_name": { + "description": "Rule name, 1 to 39 characters.", + "maxLength": 39, + "minLength": 1, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "template_id": { + "description": "Notification template ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "time_filters": { + "description": "Optional recurring time windows during which the rule applies.", + "items": { + "description": "Recurring time window. `start`/`end` use 24-hour `HH:MM` format; `repeat` uses ISO-style weekday indices (0=Sunday … 6=Saturday).", + "properties": { + "cal_id": { + "description": "Optional calendar ID; restricts the window to days matching the calendar.", + "type": "string" + }, + "end": { + "description": "End of the window in `HH:MM`.", + "type": "string" + }, + "is_off": { + "description": "When true, match days marked as days-off in the calendar.", + "type": "boolean" + }, + "repeat": { + "description": "Days of the week this window repeats on. Empty means every day.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "start": { + "description": "Start of the window in `HH:MM`.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" } }, - "parameters": [ - { - "name": "page_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - }, - "description": "Status page ID." + "required": [ + "channel_id", + "template_id", + "rule_name", + "layers" + ], + "type": "object" + }, + "CreateFieldRequest": { + "properties": { + "default_value": { + "description": "Optional default value. Type must match `field_type`: `bool` for checkbox; one of `options` for single_select; subset of `options` for multi_select; string ≤3000 chars for text.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] }, - { - "name": "change_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" + "description": { + "description": "Optional free-text description.", + "maxLength": 499, + "type": "string" + }, + "display_name": { + "description": "Human-readable name. Must be unique within the account.", + "maxLength": 39, + "type": "string" + }, + "field_name": { + "description": "Machine name. Must start with a letter or underscore; 1–40 chars of `[a-zA-Z0-9_]`. Immutable after creation.", + "maxLength": 39, + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]{0,39}$", + "type": "string" + }, + "field_type": { + "description": "Field type, immutable after creation.\n| Value | Meaning |\n|---|---|\n| `text` | Free text; `value_type` must be `string`, no `options`. |\n| `single_select` | Single choice from `options`; `value_type` must be `string`. |\n| `multi_select` | Multiple choices from `options`; `value_type` must be `string`. |\n| `checkbox` | Boolean checkbox; `value_type` must be `bool`, no `options`. |", + "enum": [ + "checkbox", + "multi_select", + "single_select", + "text" + ], + "type": "string" + }, + "options": { + "description": "Required and non-empty for `single_select`/`multi_select` (unique strings, each 1–200 chars). Must be omitted or empty for `checkbox`/`text`.", + "items": { + "type": "string" }, - "description": "Event (change) ID." + "type": "array" + }, + "value_type": { + "description": "Value type. `checkbox` requires `bool`; all other types require `string`. Immutable after creation. `float` is a reserved value currently rejected for every `field_type`.", + "enum": [ + "string", + "bool", + "float" + ], + "type": "string" + } + }, + "required": [ + "field_name", + "display_name", + "field_type", + "value_type" + ], + "type": "object" + }, + "CreateFieldResponse": { + "properties": { + "field_id": { + "description": "Newly assigned field ID — 24-character hex ObjectID.", + "pattern": "^[a-f0-9]{24}$", + "type": "string" + }, + "field_name": { + "description": "Echo of the submitted `field_name`.", + "type": "string" + } + }, + "required": [ + "field_id", + "field_name" + ], + "type": "object" + }, + "CreateIncidentCommentTypeRequest": { + "description": "Parameters for creating a comment type. At most 10 comment types per account.", + "properties": { + "color": { + "description": "Label color as a hex value in #RRGGBB format. Normalized to uppercase.", + "pattern": "^#[0-9A-Fa-f]{6}$", + "type": "string" + }, + "name": { + "description": "Display name. Trimmed before storing; must be unique within the account (case-insensitive). At most 40 characters.", + "maxLength": 40, + "type": "string" } - ] - } - }, - "/status-page/change/list": { - "get": { - "operationId": "statusPageChangeList", - "summary": "List status page events", - "description": "List status page events for console management. Unlike the public display endpoints, the response includes hidden components.", - "tags": [ - "On-call/Status pages" + }, + "required": [ + "name", + "color" ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-list", - "metadata": { - "sidebarTitle": "List status page events" + "type": "object" + }, + "CreateIncidentCommentTypeResponse": { + "description": "Result of creating a comment type.", + "properties": { + "comment_type_id": { + "description": "ID of the created comment type (24-character hex ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "item": { + "$ref": "#/components/schemas/IncidentCommentTypeItem" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageChangeListResponse" - } - } - } - ] + "required": [ + "comment_type_id", + "item" + ], + "type": "object" + }, + "CreateIncidentRequest": { + "description": "Parameters for manually creating an incident.", + "properties": { + "assigned_to": { + "description": "Incident assignment target. May be omitted entirely: when unset or empty, the channel's default assignment applies; required when the account's create form is in effect. `person_ids`, `escalate_rule_id`, and `emails` can be combined — responders are the union.", + "properties": { + "emails": { + "description": "Recipients to assign by email (1–100): resolved to account members and merged into `person_ids`; emails with no matching member are ignored.", + "items": { + "format": "email", + "type": "string" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "change_id": 5821693893131, - "page_id": 5750613685214, - "type": "incident", - "title": "Web Console Degraded Performance", - "description": "The issue has been resolved, and all services are operating normally.", - "status": "resolved", - "affected_components": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "section_id": "01KC3FKKX5TSVG6Z3X1QNGF6V2", - "name": "Web Console", - "available_since_seconds": 1765349358, - "order_id": 1, - "status": "operational" - } - ], - "start_at_seconds": 1766736878, - "close_at_seconds": 1775529742, - "updates": [ - { - "update_id": "01KDCVJQ88SZPHWPTDV2Z2AZW8", - "at_seconds": 1766736876, - "status": "investigating", - "description": "We are currently investigating an issue affecting some services.", - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "component_name": "Web Console", - "status": "degraded" - } - ] - }, - { - "update_id": "01KNJX3KW873ZZSRZC14SGFYS3", - "at_seconds": 1775529742, - "status": "resolved", - "description": "The issue has been resolved, and all services are operating normally.", - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "component_name": "Web Console", - "status": "operational" - } - ] - } - ], - "notify_subscribers": true - } + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "escalate_rule_id": { + "description": "Escalation rule ID (MongoDB ObjectID); assigns the people at the rule's `layer_idx` layer.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "layer_idx": { + "description": "Zero-based starting layer index of the escalation rule (default 0, the first layer); an out-of-range value returns an error. Only takes effect with `escalate_rule_id`.", + "type": "integer" + }, + "notify": { + "description": "Override the notification channels used for this assignment.", + "properties": { + "follow_preference": { + "description": "When false, use `personal_channels`; when true or omitted, use each responder's personal preference.", + "type": [ + "boolean", + "null" ] + }, + "personal_channels": { + "description": "Channels to use (e.g. `voice`, `sms`, `email`).", + "items": { + "type": "string" + }, + "type": "array" + }, + "template_id": { + "description": "Notification template ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" } - } + }, + "type": "object" + }, + "person_ids": { + "description": "Member IDs to assign directly (1–100). Can be combined with `escalate_rule_id`.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "type": { + "description": "Assignment type, derived server-side — callers do not set it: `assign` for manual creation, `reassign` for re-assignment, `escalate` for escalation-driven assignment.\n| Value | Meaning |\n|---|---|\n| `assign` | Initial assignment when the incident is created manually. |\n| `reassign` | Re-assignment of an existing incident. |\n| `escalate` | Assignment triggered by escalation policy advancement. |\n| `reopen` | Assignment restarted from the first layer after the incident is reopened. |", + "enum": [ + "assign", + "reassign", + "escalate", + "reopen" + ], + "type": "string" } - } + }, + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_id": { + "description": "Channel to file the incident into. Optional; leave unset for a standalone incident.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Incident description, up to 1024 characters.", + "maxLength": 1024, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "fields": { + "$ref": "#/components/schemas/CustomFieldValues", + "description": "Custom field values keyed by field name. When a create form applies, only its visible fields are accepted." }, - "500": { - "$ref": "#/components/responses/ServerError" + "incident_severity": { + "description": "Incident severity: `Info`, `Warning` or `Critical` (most severe).", + "enum": [ + "Info", + "Warning", + "Critical" + ], + "type": "string" + }, + "title": { + "description": "Incident title, up to 512 characters.", + "maxLength": 512, + "type": "string" } }, - "parameters": [ - { - "name": "page_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - }, - "description": "Status page ID." + "required": [ + "incident_severity" + ], + "type": "object" + }, + "CreateIncidentResponse": { + "description": "Result of manually creating an incident.", + "properties": { + "incident_id": { + "description": "Newly created incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - { - "name": "start_at_seconds", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int64" - }, - "description": "Lower bound of the event activity window: only events still open at, or closed at or after, this Unix timestamp (seconds) are returned." + "title": { + "description": "Echoes the incident title from the request.", + "type": "string" + } + }, + "required": [ + "incident_id", + "title" + ], + "type": "object" + }, + "CreateInhibitRuleRequest": { + "description": "Parameters for creating an inhibit rule.", + "properties": { + "channel_id": { + "description": "Owning channel ID; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" }, - { - "name": "end_at_seconds", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int64" + "description": { + "description": "Rule description, up to 500 characters.", + "maxLength": 500, + "type": "string" + }, + "equals": { + "description": "Field keys whose values must be equal between the source (inhibiting) alert and the target (suppressed) alert, e.g. `data_source_id` or `labels.cluster`.", + "items": { + "type": "string" }, - "description": "Upper bound of the event activity window: only events started at or before this Unix timestamp (seconds) are returned." + "type": "array" }, - { - "name": "type", - "in": "query", - "required": true, - "schema": { - "type": "string", - "enum": [ - "incident", - "maintenance" - ] + "is_directly_discard": { + "description": "When true, matching alert events are discarded entirely; when false, alerts are still recorded but marked as muted by this rule.", + "type": "boolean" + }, + "rule_name": { + "description": "Rule name, 1 to 39 characters.", + "maxLength": 39, + "minLength": 1, + "type": "string" + }, + "source_filters": { + "description": "Conditions the source alert must match, evaluated against stored active alerts. Supported keys: `status`, `incident_status`, `alert_status`, `severity`, `incident_severity`, `alert_severity`, `title`, `description`, or any `labels.`. Empty makes the rule inert.", + "items": { + "items": { + "properties": { + "key": { + "description": "Field key (e.g. `alert_severity`, `labels.service`).", + "type": "string" + }, + "oper": { + "description": "Filter operator.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to match.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "type": "array" }, - "description": "Event type filter. Required." + "type": "array" }, - { - "name": "status", - "in": "query", - "required": true, - "schema": { - "type": "string", - "enum": [ - "investigating", - "identified", - "monitoring", - "resolved", - "scheduled", - "ongoing", - "completed" - ] + "target_filters": { + "description": "Conditions the incoming target alert event must match to be suppressed; empty means every event is a target.", + "items": { + "items": { + "properties": { + "key": { + "description": "Field key (e.g. `alert_severity`, `labels.service`).", + "type": "string" + }, + "oper": { + "description": "Filter operator.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to match.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "type": "array" }, - "description": "Event status filter. Required. Must be a status valid for the given `type` (`investigating`/`identified`/`monitoring`/`resolved` for `incident`; `scheduled`/`ongoing`/`completed` for `maintenance`)." - } - ] - } - }, - "/status-page/change/active/list": { - "get": { - "operationId": "statusPageChangeActiveList", - "summary": "List active status page events", - "description": "List in-progress (non-terminal) events of a given type for a status page.", - "tags": [ - "On-call/Status pages" - ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-active-list", - "metadata": { - "sidebarTitle": "List active status page events" + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" + "required": [ + "channel_id", + "rule_name", + "equals" + ], + "type": "object" + }, + "CreateSilenceRuleRequest": { + "description": "Parameters for creating a silence rule. Exactly one of `time_filter` or `time_filters` must be provided, and `filters` must be non-empty.", + "properties": { + "channel_id": { + "description": "Owning channel ID; obtain it from `POST /channel/list`.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Rule description, up to 500 characters.", + "maxLength": 500, + "type": "string" + }, + "filters": { + "description": "Alert event match conditions (OR-of-AND). Required and must contain at least one condition.", + "items": { + "items": { + "properties": { + "key": { + "description": "Field key (e.g. `alert_severity`, `labels.service`).", + "type": "string" + }, + "oper": { + "description": "Filter operator.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to match.", + "items": { + "type": "string" }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageChangeListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "change_id": 5821693893131, - "page_id": 5750613685214, - "type": "incident", - "title": "Web Console Degraded Performance", - "description": "We are currently investigating an issue affecting some services.", - "status": "investigating", - "affected_components": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "section_id": "01KC3FKKX5TSVG6Z3X1QNGF6V2", - "name": "Web Console", - "available_since_seconds": 1765349358, - "order_id": 1, - "status": "degraded" - } - ], - "start_at_seconds": 1766736878, - "updates": [ - { - "update_id": "01KDCVJQ88SZPHWPTDV2Z2AZW8", - "at_seconds": 1766736876, - "status": "investigating", - "description": "We are currently investigating an issue affecting some services.", - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "component_name": "Web Console", - "status": "degraded" - } - ] - } - ], - "notify_subscribers": true - } - ] + "type": "array" } - } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "type": "array" + }, + "type": "array" + }, + "from_incident_id": { + "description": "Incident ID (ObjectID hex) to attach the rule to. Optional; when set, only one enabled silence rule may exist per incident.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "is_auto_delete": { + "description": "When true, the silence rule is automatically deleted after its time window expires. Defaults to false.", + "type": "boolean" + }, + "is_directly_discard": { + "description": "When true, matching alert events are discarded entirely; when false, alerts are still recorded but marked as muted by this rule.", + "type": "boolean" + }, + "rule_name": { + "description": "Rule name, 1 to 39 characters.", + "maxLength": 39, + "minLength": 1, + "type": "string" + }, + "time_filter": { + "description": "One-off time window defined by unix seconds.", + "properties": { + "end_time": { + "description": "Window end, Unix timestamp in seconds. Must be greater than 0.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" + }, + "start_time": { + "description": "Window start, Unix timestamp in seconds. Must be greater than 0 and less than `end_time`.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" } - } + }, + "required": [ + "start_time", + "end_time" + ], + "type": "object" + }, + "time_filters": { + "description": "Recurring time windows during which silencing applies. Mutually exclusive with `time_filter`.", + "items": { + "description": "Recurring time window. `start`/`end` use 24-hour `HH:MM` format; `repeat` uses ISO-style weekday indices (0=Sunday … 6=Saturday).", + "properties": { + "cal_id": { + "description": "Optional calendar ID; restricts the window to days matching the calendar.", + "type": "string" + }, + "end": { + "description": "End of the window in `HH:MM`.", + "type": "string" + }, + "is_off": { + "description": "When true, match days marked as days-off in the calendar.", + "type": "boolean" + }, + "repeat": { + "description": "Days of the week this window repeats on. Empty means every day.", + "items": { + "type": "integer" + }, + "type": "array" + }, + "start": { + "description": "Start of the window in `HH:MM`.", + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "channel_id", + "rule_name" + ], + "type": "object" + }, + "CreateStatusPageChangeRequest": { + "description": "Parameters for creating a status page incident or maintenance event. The first update must contain `component_changes` to define affected components; retrospective events require at least 2 updates.", + "properties": { + "auto_update_by_schedule": { + "description": "Maintenance only: automatically advance the status based on the scheduled window.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "close_at_seconds": { + "description": "Event close time in Unix seconds. Must be greater than or equal to the first update's `at_seconds`. For retrospective events this is the time the event ended; for maintenances with `auto_update_by_schedule` it schedules the automatic transition to `completed` and must be within 30 days from now.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Event description (Markdown). Must not be empty.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "is_retrospective": { + "description": "Mark this event as a retrospective (historical) one.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "parameters": [ - { - "name": "page_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" + "linked_changes": { + "description": "Linked change IDs (related incidents, deployments, etc.).", + "items": { + "type": "string" }, - "description": "Status page ID." + "type": "array" }, - { - "name": "type", - "in": "query", - "required": true, - "schema": { - "type": "string", - "enum": [ - "incident", - "maintenance" - ] + "notify_subscribers": { + "description": "Notify subscribers about this event and all its updates.", + "type": "boolean" + }, + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" + }, + "responders": { + "description": "Member IDs responsible for the event.", + "items": { + "format": "int64", + "type": "integer" }, - "description": "Event type filter. Required. Returns only in-progress (non-terminal) events — `investigating`/`identified`/`monitoring` for `incident`, `scheduled`/`ongoing` for `maintenance`." - } - ] - } - }, - "/status-page/draft/create": { - "post": { - "operationId": "statusPageDraftCreate", - "summary": "Create status page draft", - "description": "Store a status page event draft so a human can review and publish it from the console.", - "tags": [ - "On-call/Status pages" - ], - "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 `draft` payload is stored verbatim (up to 64 KB); the console publish form reads it back to prefill the event.\n- A draft lives for 30 days and is consumed exactly once when the event is published.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/status-pages/status-page-draft-create", - "metadata": { - "sidebarTitle": "Create status page draft" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageDraftCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "draft_id": "draft_3xK9mQ2vN7pR4wT8yH1sJ5", - "created_at": 1788000000 - } - } - } - } + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "start_at_seconds": { + "description": "Event start time in Unix seconds. The stored start time is always derived from the first update's `at_seconds` (which defaults to the current time when omitted); for maintenances with `auto_update_by_schedule`, this value schedules the automatic transition to `ongoing`.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "status": { + "description": "Initial event status. `investigating`/`identified`/`monitoring`/`resolved` apply to incidents; `scheduled`/`ongoing`/`completed` apply to maintenances.", + "enum": [ + "investigating", + "identified", + "monitoring", + "resolved", + "scheduled", + "ongoing", + "completed" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "title": { + "description": "Event title, up to 255 characters.", + "maxLength": 255, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageDraftRequest" - }, - "example": { - "draft": { - "v": 1, - "page_id": 5750613685214, - "type": "incident", - "name": "Web Console Degraded Performance", - "message": "We are investigating degraded performance affecting the web console.", - "affected_components": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "status": "degraded" - } - ] + "type": { + "description": "Change type: `incident` unplanned incident, `maintenance` planned maintenance.", + "enum": [ + "incident", + "maintenance" + ], + "type": "string" + }, + "updates": { + "description": "Timeline updates. At least one update is required, and at least one of them must contain `component_changes`. Immediate events normally pass one update; retrospective events must pass all historical updates.", + "items": { + "description": "One timeline update entry.", + "properties": { + "at_seconds": { + "description": "Update timestamp in Unix seconds. When omitted or 0 on the first update, defaults to the current time.", + "format": "int64", + "type": "integer" }, - "source": "ai_sre:sess_01KC3H2A9ZQ8W7E6R5T4Y3U2I1" - } - } - } - } - } - }, - "/status-page/change/create": { - "post": { - "operationId": "statusPageChangeCreate", - "summary": "Create status page event", - "description": "Create a new incident or maintenance event on a status page.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Events Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-create", - "metadata": { - "sidebarTitle": "Create status page event" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageChangeCreateResponse" - } + "component_changes": { + "description": "Component status transitions applied by this update.", + "items": { + "properties": { + "component_id": { + "description": "Component ID; obtain it from `GET /status-page/info`.", + "type": "string" + }, + "status": { + "description": "New component status. `operational`/`degraded`/`partial_outage`/`full_outage` apply to incidents; `operational`/`under_maintenance` apply to maintenances.", + "enum": [ + "operational", + "degraded", + "partial_outage", + "full_outage", + "under_maintenance" + ], + "type": "string" } - } + }, + "required": [ + "component_id", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "description": { + "description": "Update description (Markdown).", + "type": [ + "string", + "null" ] }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "change_id": 6294539747131, - "change_name": "API Test Incident" - } + "status": { + "description": "Change status after this update. May be omitted (or null) when the overall status does not change. The first four values apply to incident-type changes, the last three to maintenance-type changes.\n| Value | Meaning |\n|---|---|\n| `investigating` | Investigating (incident). |\n| `identified` | Root cause identified (incident). |\n| `monitoring` | Fix deployed, monitoring (incident). |\n| `resolved` | Resolved (incident). |\n| `scheduled` | Scheduled (maintenance). |\n| `ongoing` | In progress (maintenance). |\n| `completed` | Completed (maintenance). |", + "enum": [ + "investigating", + "identified", + "monitoring", + "resolved", + "scheduled", + "ongoing", + "completed" + ], + "type": [ + "string", + "null" + ] + }, + "update_id": { + "description": "Update ID. Server-assigned on create; supply when replaying historical updates.", + "type": "string" } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageChangeRequest" }, - "example": { - "page_id": 5750613685214, - "type": "incident", - "title": "Web Console Degraded Performance", - "description": "We are investigating degraded performance affecting the web console.", - "status": "investigating", - "start_at_seconds": 1712000000, - "notify_subscribers": true, - "updates": [ - { - "status": "investigating", - "description": "We are currently investigating an issue affecting some users.", - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "status": "degraded" - } - ] - } - ] - } - } - } - } - } - }, - "/status-page/change/update": { - "post": { - "operationId": "statusPageChangeUpdate", - "summary": "Update status page event", - "description": "Update an existing status page event.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Events Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-update", - "metadata": { - "sidebarTitle": "Update status page event" + "type": "object" + }, + "minItems": 1, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] + "required": [ + "page_id", + "type", + "title", + "description", + "status", + "updates" + ], + "type": "object" + }, + "CreateStatusPageChangeTimelineRequest": { + "description": "Parameters for appending an update to a status page event timeline.", + "properties": { + "at_seconds": { + "description": "Update timestamp in Unix seconds. Defaults to the current time when omitted or 0.", + "format": "int64", + "type": "integer" + }, + "change_id": { + "description": "Target change ID; obtain it from `GET /status-page/change/list`.", + "format": "int64", + "type": "integer" + }, + "component_changes": { + "description": "Component status transitions applied by this update. Component IDs must be unique.", + "items": { + "properties": { + "component_id": { + "description": "Component ID; obtain it from `GET /status-page/info`.", + "type": "string" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} + "status": { + "description": "New component status. `operational`/`degraded`/`partial_outage`/`full_outage` apply to incidents; `operational`/`under_maintenance` apply to maintenances.", + "enum": [ + "operational", + "degraded", + "partial_outage", + "full_outage", + "under_maintenance" + ], + "type": "string" } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + }, + "required": [ + "component_id", + "status" + ], + "type": "object" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Update description (Markdown). Must not be empty.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "status": { + "description": "Change status after this update; must be valid for the change type. When transitioning to `resolved` or `completed`, all affected components must be back to `operational`.\n| Value | Meaning |\n|---|---|\n| `investigating` | Investigating (incident). |\n| `identified` | Root cause identified (incident). |\n| `monitoring` | Fix deployed, monitoring (incident). |\n| `resolved` | Resolved (incident). |\n| `scheduled` | Scheduled (maintenance). |\n| `ongoing` | In progress (maintenance). |\n| `completed` | Completed (maintenance). |", + "enum": [ + "investigating", + "identified", + "monitoring", + "resolved", + "scheduled", + "ongoing", + "completed" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageChangeRequest" - }, - "example": { - "page_id": 5750613685214, - "change_id": 5821693893131, - "title": "Web Console Degraded Performance (Updated)" - } - } - } - } - } - }, - "/status-page/change/delete": { - "post": { - "operationId": "statusPageChangeDelete", - "summary": "Delete status page event", - "description": "Delete a status page event.", - "tags": [ - "On-call/Status pages" + "required": [ + "page_id", + "change_id", + "status", + "description" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Events Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-delete", - "metadata": { - "sidebarTitle": "Delete status page event" + "type": "object" + }, + "CreateStatusPageDraftRequest": { + "description": "Parameters for storing a status page draft. The `draft` payload is stored verbatim; only the validated fields listed below are interpreted.", + "properties": { + "draft": { + "description": "Draft payload, stored verbatim, up to 64 KB serialized. Validated fields: `page_id`, `type` (`incident` or `maintenance`), `name`, `message`; optional `change_id` (append an update to an existing event when > 0), `status`, `affected_components`, and `start_time`/`end_time` (Unix epoch seconds, new maintenance only).", + "type": "object" + }, + "source": { + "description": "Opaque marker of the drafting origin, e.g. `ai_sre:sess_xxx`. Up to 64 characters.", + "maxLength": 64, + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "draft" + ], + "type": "object" + }, + "CreateStatusPageRequest": { + "properties": { + "contact_info": { + "description": "Get-in-touch contact, such as a mailto or website URL.", + "type": "string" + }, + "custom_domain": { + "description": "Custom domain for a public status page.", + "maxLength": 255, + "type": "string" + }, + "custom_links": { + "description": "Custom navigation links shown on the status page.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "date_view": { + "description": "How change dates are displayed: `calendar` calendar view, `list` list view.", + "enum": [ + "calendar", + "list" + ], + "type": "string" + }, + "display_uptime_mode": { + "description": "Uptime display mode: `chart_and_percentage` chart plus percentage, `chart` chart only, `none` hidden.", + "enum": [ + "chart_and_percentage", + "chart", + "none" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "name": { + "description": "Display name of the status page.", + "maxLength": 255, + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "page_footer": { + "description": "Footer content shown on the status page.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "page_header": { + "description": "Header content shown on the status page.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "page_title": { + "description": "Browser title shown for the status page.", + "type": "string" + }, + "subscription": { + "$ref": "#/components/schemas/StatusPageSubscriptionItem", + "description": "Subscription channel toggles." + }, + "type": { + "description": "Visibility type: `public` accessible to anyone, `internal` restricted to logged-in members of this account.", + "enum": [ + "public", + "internal" + ], + "type": "string" + }, + "url_name": { + "description": "URL-safe slug, unique per account and page type.", + "maxLength": 255, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteStatusPageChangeRequest" - }, - "example": { - "page_id": 5750613685214, - "change_id": 5821693893131 - } - } - } - } - } - }, - "/status-page/change/timeline/create": { - "post": { - "operationId": "statusPageChangeTimelineCreate", - "summary": "Create event timeline entry", - "description": "Add a timeline update to a status page event.", - "tags": [ - "On-call/Status pages" + "required": [ + "name", + "url_name", + "type", + "date_view", + "display_uptime_mode" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Events Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-timeline-create", - "metadata": { - "sidebarTitle": "Create event timeline entry" + "type": "object" + }, + "CreateStatusPageResponse": { + "properties": { + "page_id": { + "description": "Created status page ID.", + "format": "int64", + "type": "integer" + }, + "page_name": { + "description": "Created status page name.", + "type": "string" + }, + "page_url_name": { + "description": "Final URL-safe slug assigned to the status page.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageChangeTimelineCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "update_id": "01KP0311872NVYFRRQ82FWXAP4" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "page_id", + "page_name", + "page_url_name" + ], + "type": "object" + }, + "CreateWarRoomRequest": { + "description": "Parameters for opening an incident war room in an IM integration.", + "properties": { + "add_observers": { + "description": "When true, also add historical responders of the incident as observers.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_id": { + "description": "IM integration ID. Must have war room enabled; Feishu, DingTalk, WeCom (self-built), Slack and Teams are supported.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "member_ids": { + "description": "Additional member IDs to add to the war room.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageChangeTimelineRequest" - }, - "example": { - "page_id": 5750613685214, - "change_id": 5821693893131, - "status": "identified", - "description": "We have identified the root cause and are working on a fix.", - "at_seconds": 1712003600, - "component_changes": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "status": "partial_outage" - } - ] - } - } - } - } - } - }, - "/status-page/change/timeline/update": { - "post": { - "operationId": "statusPageChangeTimelineUpdate", - "summary": "Update event timeline entry", - "description": "Update a timeline entry for a status page event.", - "tags": [ - "On-call/Status pages" + "required": [ + "incident_id", + "integration_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Events Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-timeline-update", - "metadata": { - "sidebarTitle": "Update event timeline entry" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "CreateWorkItemRequest": { + "description": "Parameters for creating an incident work item.", + "properties": { + "assignee_ids": { + "description": "Initial assignee member IDs. Assignees must be active members who can already read the anchor; assignment never grants access.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "description": { + "description": "Optional longer description (max 65,535 characters).", + "maxLength": 65535, + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "idempotency_key": { + "description": "Client-generated idempotency key (max 128 characters; letters, digits, `_`, `-`, `.`, `:` only).", + "maxLength": 128, + "pattern": "^[A-Za-z0-9_\\-.:]+$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "incident_id": { + "description": "Incident ID (MongoDB ObjectID) the item is anchored to.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "item_type": { + "description": "`action` anchors to an active incident and must not set `post_mortem_id`; `follow_up` requires `post_mortem_id`.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "post_mortem_id": { + "description": "Post-mortem ID (32-character hex string). Required for `follow_up`, forbidden for `action`. The post-mortem must be linked to `incident_id`.", + "type": "string" + }, + "priority": { + "description": "Optional client-defined priority (max 64 characters).", + "maxLength": 64, + "type": "string" + }, + "status": { + "description": "Optional client-defined initial status (max 64 characters).", + "maxLength": 64, + "type": "string" + }, + "title": { + "description": "Item title (max 512 characters).", + "maxLength": 512, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageChangeTimelineRequest" - }, - "example": { - "page_id": 5750613685214, - "change_id": 5821693893131, - "update_id": "01KP0311872NVYFRRQ82FWXAP4", - "description": "Corrected description: root cause identified in database layer.", - "at_seconds": 1712003600 - } - } - } - } - } - }, - "/status-page/change/timeline/delete": { - "post": { - "operationId": "statusPageChangeTimelineDelete", - "summary": "Delete event timeline entry", - "description": "Delete a timeline entry from a status page event.", - "tags": [ - "On-call/Status pages" + "required": [ + "item_type", + "title", + "incident_id", + "idempotency_key" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Events Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-change-timeline-delete", - "metadata": { - "sidebarTitle": "Delete event timeline entry" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "CustomFieldValues": { + "additionalProperties": true, + "description": "Values keyed by account custom field name. The active form determines the allowed keys, types, and required fields.", + "type": "object" + }, + "DSClickHouseConfig": { + "description": "ClickHouse datasource configuration. TLS fields are inherited from TLSClientConfig.", + "properties": { + "database": { + "description": "Default database for authentication.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "dial_timeout_mills": { + "description": "Dial timeout in milliseconds.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "idle_conns": { + "description": "Maximum number of idle connections in the pool; `0` or omitted uses the default of 4.", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "lifetime_seconds": { + "description": "Maximum connection lifetime in seconds; `0` or omitted uses the default of 600 (10 minutes).", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "max_execution_seconds": { + "description": "Max query execution time in seconds.", + "format": "int64", + "type": "integer" + }, + "open_conns": { + "description": "Maximum number of open connections in the pool; `0` or omitted uses the default of 32.", + "type": "integer" + }, + "password": { + "description": "ClickHouse authentication password.", + "type": "string" + }, + "timeout_mills": { + "description": "Per-query timeout in milliseconds; `0` or omitted uses the default of 10000 (10 seconds).", + "format": "int64", + "type": "integer" + }, + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the server certificate.", + "type": "string" + }, + "tls_cert": { + "description": "PEM-encoded client certificate for mutual TLS; must be configured together with `tls_key`.", + "type": "string" + }, + "tls_enabled": { + "description": "Whether TLS is enabled; when `false`, all `tls_*` fields are cleared before saving.", + "type": "boolean" + }, + "tls_key": { + "description": "PEM-encoded client private key; must be configured together with `tls_cert`.", + "type": "string" + }, + "tls_max_version": { + "description": "Maximum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint.", + "type": "string" + }, + "tls_min_version": { + "description": "Minimum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint and it must not exceed `tls_max_version`.", + "type": "string" + }, + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" + }, + "tls_skip_verify": { + "description": "Whether to skip server certificate verification (insecure, for self-signed setups only).", + "type": "boolean" + }, + "username": { + "description": "ClickHouse authentication username.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteStatusPageChangeTimelineRequest" - }, - "example": { - "page_id": 5750613685214, - "change_id": 5821693893131, - "update_id": "01KP0311872NVYFRRQ82FWXAP4" - } - } - } - } - } - }, - "/status-page/subscriber/list": { - "get": { - "operationId": "statusPageSubscriberList", - "summary": "List status page subscribers", - "description": "List subscribers who have signed up for status page notifications.", - "tags": [ - "On-call/Status pages" - ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-subscriber-list", - "metadata": { - "sidebarTitle": "List status page subscribers" + "type": "object" + }, + "DSElasticSearchConfig": { + "description": "Elasticsearch datasource configuration.", + "properties": { + "api_key": { + "description": "Elastic Cloud API key. Only for `cloud` deployment.", + "type": "string" + }, + "certificate_fingerprint": { + "description": "SHA-256 fingerprint of the Elasticsearch CA certificate, used to verify the server chain (the recommended check for ES 8 default security).", + "type": "string" + }, + "cloud_id": { + "description": "Elastic Cloud deployment ID. Only for `cloud` deployment.", + "type": "string" + }, + "deployment": { + "description": "Deployment type. `cloud` uses Elastic Cloud; `self-managed` uses a self-hosted cluster.", + "enum": [ + "cloud", + "self-managed" + ], + "type": "string" + }, + "headers": { + "description": "Custom HTTP headers added to every request, each entry formatted as `Key: Value`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "password": { + "description": "Authentication password for self-managed clusters; ignored when `service_token` is set.", + "type": "string" + }, + "service_token": { + "description": "Service token; overrides username/password if set.", + "type": "string" + }, + "timeout_mills": { + "description": "Per-query timeout in milliseconds; `0` or omitted uses the default of 10000 (10 seconds).", + "format": "int64", + "type": "integer" + }, + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the Elasticsearch server certificate.", + "type": "string" + }, + "username": { + "description": "Username for `self-managed` deployment.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageSubscriberListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 2, - "has_next_page": false, - "items": [ - { - "recipient": "alice@example.com", - "method": "email", - "components": [], - "all": true, - "locale": "zh-CN" - }, - { - "recipient": "bob@example.com", - "method": "email", - "components": [], - "all": true, - "locale": "en-US" - } - ] - } - } - } - } + "type": "object" + }, + "DSKafkaConfig": { + "description": "Diagnostic datasource connection configuration.", + "properties": { + "password": { + "description": "Authentication password; supports ${env:NAME}. Omit on update to preserve; explicitly send an empty string to clear. Literal passwords are omitted from responses.", + "type": "string", + "x-flashduty-preserve-absence": true + }, + "sasl_mechanism": { + "default": "none", + "description": "SASL mechanism: none (default, no credentials), plain, scram-sha-256, scram-sha-512 (require username and password).", + "enum": [ + "none", + "plain", + "scram-sha-256", + "scram-sha-512" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "timeout_ms": { + "default": 5000, + "description": "Connection timeout in milliseconds; defaults to 5000 when omitted.", + "maximum": 10000, + "minimum": 1000, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "tls_ca": { + "description": "PEM CA certificates or an ${env:NAME} reference.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_cert": { + "description": "PEM client certificate or ${env:NAME}; configure both tls_cert and tls_key.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "tls_enabled": { + "default": false, + "description": "Whether TLS is enabled; defaults to false.", + "type": "boolean" + }, + "tls_key": { + "description": "PEM client private key or ${env:NAME}; configure both tls_cert and tls_key. Omit on update to preserve; an empty string clears it. Literal keys are omitted from responses.", + "type": "string", + "x-flashduty-preserve-absence": true + }, + "tls_max_version": { + "description": "Maximum TLS version: 1.2 or 1.3; empty means no constraint. Must not be below the minimum.", + "type": "string" + }, + "tls_min_version": { + "description": "Minimum TLS version: 1.2 (default) or 1.3.", + "type": "string" + }, + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" + }, + "tls_skip_verify": { + "description": "Skip server certificate verification when TLS is enabled.", + "type": "boolean" + }, + "username": { + "description": "Authentication username; an ${env:NAME} reference is supported.", + "type": "string" } }, - "parameters": [ - { - "name": "page_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - }, - "description": "Status page ID." + "type": "object" + }, + "DSLokiConfig": { + "description": "Loki datasource configuration. TLS fields are inherited from TLSClientConfig.", + "properties": { + "basic_auth_enabled": { + "description": "Whether HTTP Basic Auth is enabled; when `false`, `basic_auth_username`/`basic_auth_password` are ignored.", + "type": "boolean" }, - { - "name": "component_ids", - "in": "query", - "required": false, - "schema": { + "basic_auth_password": { + "description": "Basic Auth password, effective when `basic_auth_enabled` is `true`.", + "type": "string" + }, + "basic_auth_username": { + "description": "Basic Auth username, effective when `basic_auth_enabled` is `true`.", + "type": "string" + }, + "headers": { + "description": "Custom HTTP headers added to every request, each entry formatted as `Key: Value`; usable for tenancy headers such as `X-Scope-OrgID`.", + "items": { "type": "string" }, - "description": "Comma-separated component IDs to filter subscribers by." + "type": "array" }, - { - "name": "p", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 1, - "default": 1 + "params": { + "description": "Custom query parameters appended to every request URL, each entry formatted as `key=value`.", + "items": { + "type": "string" }, - "description": "Page number (1-based)." + "type": "array" }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "format": "int64", - "minimum": 1, - "maximum": 100, - "default": 10 - }, - "description": "Page size (1-100)." - } - ] - } - }, - "/status-page/subscriber/import": { - "post": { - "operationId": "statusPageSubscriberImport", - "summary": "Import subscribers", - "description": "Bulk import subscribers for a status page. The account must be allowlisted for subscriber import; otherwise the call is rejected with an access-denied error.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **20 requests/minute**; **2 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-subscriber-import", - "metadata": { - "sidebarTitle": "Import subscribers" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the server certificate.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "tls_cert": { + "description": "PEM-encoded client certificate for mutual TLS; must be configured together with `tls_key`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "tls_key": { + "description": "PEM-encoded client private key; must be configured together with `tls_cert`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_max_version": { + "description": "Maximum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ImportStatusPageSubscribersRequest" - }, - "example": { - "page_id": 5750613685214, - "method": "email", - "subscribers": [ - { - "recipient": "alice@example.com", - "all": true, - "locale": "en-US" - }, - { - "recipient": "bob@example.com", - "component_ids": [ - "01KC3GAZ6ZJE40H55GM31RPWZE" - ], - "all": false, - "locale": "zh-CN" - } - ] - } - } - } - } - } - }, - "/status-page/subscriber/export": { - "post": { - "operationId": "statusPageSubscriberExport", - "summary": "Export subscribers", - "description": "Export subscribers list for a status page as a CSV attachment. The response is a `text/csv` file with columns: Method, Recipient, Components, Subscribe All, Locale.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/day**; **20 requests/minute**; **10 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-subscriber-export", - "metadata": { - "sidebarTitle": "Export subscribers" + "tls_min_version": { + "description": "Minimum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint and it must not exceed `tls_max_version`.", + "type": "string" + }, + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" + }, + "tls_skip_verify": { + "description": "Whether to skip server certificate verification (insecure, for self-signed setups only).", + "type": "boolean" } }, - "responses": { - "200": { - "description": "Success. CSV attachment, not a JSON envelope.", - "content": { - "text/csv": { - "schema": { - "$ref": "#/components/schemas/StatusPageSubscriberExportResponse" - }, - "example": "Method,Recipient,Components,Subscribe All,Locale\nemail,alice@example.com,,Yes,zh-CN\nemail,bob@example.com,\"Core Services › API\",No,en-US" - } - } + "type": "object" + }, + "DSMongoDBConfig": { + "description": "Diagnostic datasource connection configuration.", + "properties": { + "auth_source": { + "default": "admin", + "description": "Authentication database; defaults to admin. Username and password must be configured together. Client certificates are unsupported.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "password": { + "description": "Authentication password; supports ${env:NAME}. Omit on update to preserve; explicitly send an empty string to clear. Literal passwords are omitted from responses.", + "type": "string", + "x-flashduty-preserve-absence": true }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "timeout_ms": { + "default": 3000, + "description": "Connection timeout in milliseconds; defaults to 3000 when omitted.", + "maximum": 10000, + "minimum": 1000, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_ca": { + "description": "PEM CA certificates or an ${env:NAME} reference.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ExportStatusPageSubscribersRequest" - }, - "example": { - "page_id": 5750613685214 - } - } - } - } - } - }, - "/status-page/migrate-structure": { - "post": { - "operationId": "statusPageMigrateStructure", - "summary": "Migrate status page structure", - "description": "Start a migration job that imports the structure and historical events of an Atlassian Statuspage into a new Flashduty status page.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-migrate-structure", - "metadata": { - "sidebarTitle": "Migrate status page structure" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageMigrationStartResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "job_id": "01KP0311872NVYFRRQ82FW0001" - } - } - } - } + "tls_enabled": { + "default": false, + "description": "Whether TLS is enabled; defaults to false.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "tls_max_version": { + "description": "Maximum TLS version: 1.2 or 1.3; empty means no constraint. Must not be below the minimum.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "tls_min_version": { + "description": "Minimum TLS version: 1.2 (default) or 1.3.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MigrateStatusPageStructureRequest" - }, - "example": { - "api_key": "sk-stsp-xxxxxxxxxxxxxxxxxxxx", - "source_page_id": "abcdefghij" - } - } - } - } - } - }, - "/status-page/migrate-email-subscribers": { - "post": { - "operationId": "statusPageMigrateEmailSubscribers", - "summary": "Migrate email subscribers", - "description": "Start a migration job that imports email subscribers from an Atlassian Statuspage into an existing Flashduty status page.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-migrate-email-subscribers", - "metadata": { - "sidebarTitle": "Migrate email subscribers" + "tls_skip_verify": { + "description": "Skip server certificate verification when TLS is enabled.", + "type": "boolean" + }, + "username": { + "description": "Authentication username; an ${env:NAME} reference is supported.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageMigrationStartResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "job_id": "01KP0311872NVYFRRQ82FW0002" - } - } - } - } + "type": "object" + }, + "DSMySQLConfig": { + "description": "MySQL datasource configuration. TLS fields are inherited from TLSClientConfig.", + "properties": { + "idle_conns": { + "description": "Maximum idle connections.", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "lifetime_seconds": { + "description": "Connection maximum lifetime in seconds.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "open_conns": { + "description": "Maximum open connections.", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "password": { + "description": "MySQL authentication password.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MigrateStatusPageEmailSubscribersRequest" - }, - "example": { - "api_key": "sk-stsp-xxxxxxxxxxxxxxxxxxxx", - "source_page_id": "abcdefghij", - "target_page_id": 5750613685214 - } - } - } - } - } - }, - "/status-page/migration/status": { - "get": { - "operationId": "statusPageMigrationStatus", - "summary": "Get migration status", - "description": "Get the current status and progress of a status page migration job.", - "tags": [ - "On-call/Status pages" - ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-migration-status", - "metadata": { - "sidebarTitle": "Get migration status" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageMigrationJob" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "job_id": "01KP0311872NVYFRRQ82FW0001", - "account_id": 2451002751131, - "source_page_id": "abcdefghij", - "target_page_id": 5750613685214, - "phase": "history", - "status": "completed", - "progress": { - "total_steps": 5, - "completed_steps": 5, - "components_imported": 8, - "sections_imported": 3, - "incidents_imported": 12, - "maintenances_imported": 2, - "subscribers_imported": 0, - "templates_imported": 0, - "subscribers_skipped": 0 - }, - "created_at": 1766736878, - "updated_at": 1766740000 - } - } - } - } + "timeout_mills": { + "description": "Query timeout in milliseconds.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the server certificate; only allowed when `tls_mode` is `verify-full` (or empty legacy mode).", + "type": "string" + }, + "tls_cert": { + "description": "PEM-encoded client certificate for mutual TLS; must be configured together with `tls_key`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "tls_key": { + "description": "PEM-encoded client private key; must be configured together with `tls_cert`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_max_version": { + "description": "Maximum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "parameters": [ - { - "name": "job_id", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "description": "Migration job ID returned by `migrate-structure` or `migrate-email-subscribers`." - } - ] - } - }, - "/status-page/migration/cancel": { - "post": { - "operationId": "statusPageMigrationCancel", - "summary": "Cancel status page migration", - "description": "Cancel an in-progress status page migration job. Only jobs currently in the `running` state can be cancelled.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-migration-cancel", - "metadata": { - "sidebarTitle": "Cancel status page migration" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "tls_min_version": { + "description": "Minimum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint and it must not exceed `tls_max_version`.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "tls_mode": { + "description": "TLS mode for the MySQL connection. Empty keeps the legacy per-field TLS behavior. `disable` = no TLS (all `tls_*` fields are cleared on save); `require` = TLS without server certificate verification; `verify-full` = TLS with full server verification (CA chain and hostname). MySQL has no `verify-ca` — verifying the CA implies verifying the hostname.", + "enum": [ + "disable", + "require", + "verify-full" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_skip_verify": { + "description": "Whether to skip server certificate verification; derived from `tls_mode` when set (`require` → `true`, `verify-full` → `false`) — only manually effective under legacy empty `tls_mode`.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CancelStatusPageMigrationRequest" - }, - "example": { - "job_id": "01KP0311872NVYFRRQ82FW0001" - } - } - } - } - } - }, - "/monit/rule/list/basic": { - "post": { - "operationId": "monit-rule-read-list", - "summary": "List alert rules", - "description": "Return the basic information of all alert rules in a folder. For full rule details, call `POST /monit/rule/info`.", - "tags": [ - "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** (`monit`) |\n\n## Usage\n\n- Set `folder_id` to `0` to list all rules across all folders visible to the current user.\n- The `triggered` field indicates whether the rule has any currently active alerts.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-list", - "metadata": { - "sidebarTitle": "List alert rules" + "username": { + "description": "MySQL authentication username.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleBasicListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "id": 50001, - "folder_id": 100, - "name": "CPU High", - "ds_type": "prometheus", - "enabled": true, - "triggered": true, - "created_at": 1710000000, - "active_alert_count": 2, - "runtime_state": "normal" - } - ] - } - } - } + "type": "object" + }, + "DSOracleConfig": { + "description": "Oracle datasource configuration.", + "properties": { + "idle_conns": { + "description": "Maximum number of idle connections in the pool; `0` or omitted uses the default of 4.", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "lifetime_seconds": { + "description": "Maximum connection lifetime in seconds; `0` or omitted uses the default of 600 (10 minutes).", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "open_conns": { + "description": "Maximum number of open connections in the pool; `0` or omitted uses the default of 32.", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "options": { + "additionalProperties": { + "type": "string" + }, + "description": "Extra connection options as key-value pairs.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleListRequest" - }, - "example": { - "folder_id": 100 - } - } - } - } - } - }, - "/monit/rule/info": { - "post": { - "operationId": "monit-rule-read-info", - "summary": "Get alert rule detail", - "description": "Return the full configuration of an alert rule by its ID, including rule queries, thresholds, and notification settings.", - "tags": [ - "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** (`monit`) |", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-info", - "metadata": { - "sidebarTitle": "Get alert rule detail" + "password": { + "description": "Oracle authentication password.", + "type": "string" + }, + "timeout_mills": { + "description": "Per-query timeout in milliseconds; `0` or omitted uses the default of 10000 (10 seconds).", + "format": "int64", + "type": "integer" + }, + "username": { + "description": "Oracle authentication username.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertRuleInfoResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 50001, - "folder_id": 100, - "name": "CPU High", - "ds_type": "prometheus", - "ds_list": [ - "prometheus*" - ], - "enabled": true, - "cron_pattern": "0 * * * * *", - "channel_ids": [ - 20001 - ] - } - } - } - } + "type": "object" + }, + "DSPayload": { + "description": "Type-specific datasource configuration. Include only the block matching `type_ident`.", + "properties": { + "clickhouse": { + "$ref": "#/components/schemas/DSClickHouseConfig" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "elasticsearch": { + "$ref": "#/components/schemas/DSElasticSearchConfig" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "kafka": { + "$ref": "#/components/schemas/DSKafkaConfig", + "x-flashduty-preserve-absence": true }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "loki": { + "$ref": "#/components/schemas/DSLokiConfig" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleIDRequest" - }, - "example": { - "id": 50001 - } - } - } - } - } - }, - "/monit/rule/create": { - "post": { - "operationId": "monit-rule-write-create", - "summary": "Create alert rule", - "description": "Create a new alert rule. Returns the created rule with its assigned ID.", - "tags": [ - "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 Manage** (`monit`) |\n\n## Usage\n\n- `name`, `ds_type`, `cron_pattern`, and `rule_configs.queries` are required.\n- Either `ds_list` (supports wildcards) or `ds_ids` must be non-empty.\n- `cron_pattern` uses standard 5-field cron syntax.\n- `channel_ids` can be empty; alerts will then route through the global integration.\n- `name` must be unique within `folder_id`; a duplicate returns `InvalidParameter`.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-create", - "metadata": { - "sidebarTitle": "Create alert rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertRule" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 50001, - "folder_id": 100, - "name": "CPU High", - "ds_type": "prometheus", - "created_at": 1712000000 - } - } - } - } + "mongodb_mongod": { + "$ref": "#/components/schemas/DSMongoDBConfig", + "x-flashduty-preserve-absence": true }, - "400": { - "$ref": "#/components/responses/BadRequest" + "mongodb_mongos": { + "$ref": "#/components/schemas/DSMongoDBConfig", + "x-flashduty-preserve-absence": true }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "mysql": { + "$ref": "#/components/schemas/DSMySQLConfig" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "oracle": { + "$ref": "#/components/schemas/DSOracleConfig" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertRule" - }, - "example": { - "folder_id": 100, - "name": "CPU High", - "ds_type": "prometheus", - "ds_list": [ - "prometheus*" - ], - "enabled": true, - "cron_pattern": "0 * * * * *", - "channel_ids": [ - 20001 - ], - "rule_configs": { - "queries": [ - { - "name": "A", - "expr": "avg(cpu_usage_idle) < 10" - } - ], - "check_threshold": { - "enabled": true, - "critical": "A", - "alerting_check_times": 1, - "recovery_check_times": 1, - "push_recovery_event": true, - "recovery": { - "mode": "invert" - } - } - } - } - } - } - } - } - }, - "/monit/rule/update": { - "post": { - "operationId": "monit-rule-write-update", - "summary": "Update alert rule", - "description": "Replace the full configuration of an existing alert rule. All fields are overwritten.", - "tags": [ - "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 Manage** (`monit`) |\n\n## Usage\n\n- `id` is required. All other fields follow the same rules as `POST /monit/rule/create`.\n- The name must remain unique within its folder; a duplicate returns `InvalidParameter`.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-update", - "metadata": { - "sidebarTitle": "Update alert rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertRule" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 50001, - "updated_at": 1712100000 - } - } - } - } + "postgres": { + "$ref": "#/components/schemas/DSPostgresConfig" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "prometheus": { + "$ref": "#/components/schemas/DSPrometheusConfig" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "redis_node": { + "$ref": "#/components/schemas/DSRedisNodeConfig", + "x-flashduty-preserve-absence": true }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "redis_sentinel": { + "$ref": "#/components/schemas/DSRedisSentinelConfig", + "x-flashduty-preserve-absence": true }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AlertRule" - }, - "example": { - "id": 50001, - "folder_id": 100, - "name": "CPU High v2", - "ds_type": "prometheus", - "ds_list": [ - "prometheus*" - ], - "enabled": true, - "cron_pattern": "0 * * * * *", - "rule_configs": { - "queries": [ - { - "name": "A", - "expr": "avg(cpu_usage_idle) < 5" - } - ] - } - } - } - } - } - } - }, - "/monit/rule/delete": { - "post": { - "operationId": "monit-rule-write-delete", - "summary": "Delete alert rule", - "description": "Delete a single alert rule by its ID.", - "tags": [ - "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 Manage** (`monit`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-delete", - "metadata": { - "sidebarTitle": "Delete alert rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleEmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "sls": { + "$ref": "#/components/schemas/DSSLSConfig" + }, + "tencent_cls": { + "$ref": "#/components/schemas/DSTencentCLSConfig", + "description": "Tencent CLS credentials. Required when `type_ident` is `tencent_cls`." + }, + "victorialogs": { + "$ref": "#/components/schemas/DSVictoriaLogsConfig" + } + }, + "type": "object" + }, + "DSPostgresConfig": { + "description": "PostgreSQL datasource configuration.", + "properties": { + "idle_conns": { + "description": "Maximum number of idle connections in the pool; `0` or omitted uses the default of 4.", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "lifetime_seconds": { + "description": "Maximum connection lifetime in seconds; `0` or omitted uses the default of 600 (10 minutes).", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "open_conns": { + "description": "Maximum number of open connections in the pool; `0` or omitted uses the default of 32.", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "password": { + "description": "PostgreSQL authentication password.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleIDRequest" - }, - "example": { - "id": 50001 - } - } - } - } - } - }, - "/monit/rule/delete/batch": { - "post": { - "operationId": "monit-rule-write-delete-batch", - "summary": "Batch delete alert rules", - "description": "Delete multiple alert rules in a single request.", - "tags": [ - "Monitors/Alert rules" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **30 requests/minute**; **5 requests/second** per account |\n| Permissions | **Alerting Rules Manage** (`monit`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-delete-batch", - "metadata": { - "sidebarTitle": "Batch delete alert rules" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleEmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "ssl_mode": { + "description": "SSL mode for the PostgreSQL connection. Empty keeps the legacy behavior inferred from `tls_ca`. `disable` = no TLS (all `tls_*` fields are cleared on save); `require` = TLS without server certificate verification (`tls_ca` not allowed); `verify-ca` = verify the server certificate CA chain but not the hostname; `verify-full` = verify both CA chain and hostname.", + "enum": [ + "disable", + "require", + "verify-ca", + "verify-full" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "timeout_mills": { + "description": "Per-query timeout in milliseconds; `0` or omitted uses the default of 10000 (10 seconds).", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the server certificate; used with `ssl_mode` `verify-ca`/`verify-full` and rejected under `require`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tls_cert": { + "description": "PEM-encoded client certificate for mutual TLS; must be configured together with `tls_key`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleIDsRequest" - }, - "example": { - "ids": [ - 50001, - 50002 - ] - } - } - } - } - } - }, - "/monit/rule/update/fields": { - "post": { - "operationId": "monit-rule-write-fields-update", - "summary": "Batch update rule fields", - "description": "Update specific fields across multiple alert rules at once. Only the fields listed in `fields` are applied.", - "tags": [ - "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 Manage** (`monit`) |\n\n## Usage\n\n- Include the field names you want to update in the `fields` array, e.g. `[\"enabled\", \"channel_ids\"]`.\n- Only the specified fields are updated; others are left unchanged.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-fields-update", - "metadata": { - "sidebarTitle": "Batch update rule fields" + "tls_key": { + "description": "PEM-encoded client private key; must be configured together with `tls_cert`.", + "type": "string" + }, + "username": { + "description": "PostgreSQL authentication username.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleNameMessageListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "name": "CPU High", - "message": "" - }, - { - "name": "Disk High", - "message": "" - } - ] - } - } - } + "type": "object" + }, + "DSPrometheusConfig": { + "description": "Prometheus datasource configuration. TLS fields are inherited from TLSClientConfig.", + "properties": { + "basic_auth_enabled": { + "description": "Enable HTTP Basic Auth.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "basic_auth_password": { + "description": "Basic auth password.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "basic_auth_username": { + "description": "Basic auth username.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "headers": { + "description": "Custom HTTP headers in `Key: Value` format.", + "items": { + "type": "string" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "params": { + "description": "Custom query parameters in `key=value` format.", + "items": { + "type": "string" + }, + "type": "array" + }, + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the server certificate.", + "type": "string" + }, + "tls_cert": { + "description": "PEM-encoded client certificate for mutual TLS; must be configured together with `tls_key`.", + "type": "string" + }, + "tls_key": { + "description": "PEM-encoded client private key; must be configured together with `tls_cert`.", + "type": "string" + }, + "tls_max_version": { + "description": "Maximum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint.", + "type": "string" + }, + "tls_min_version": { + "description": "Minimum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint and it must not exceed `tls_max_version`.", + "type": "string" + }, + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" + }, + "tls_skip_verify": { + "description": "Whether to skip server certificate verification (insecure, for self-signed setups only).", + "type": "boolean" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleFieldsUpdateRequest" - }, - "example": { - "ids": [ - 50001, - 50002 - ], - "fields": [ - "enabled" - ], - "enabled": false - } - } - } - } - } - }, - "/monit/rule/import": { - "post": { - "operationId": "monit-rule-write-import", - "summary": "Import alert rules", - "description": "Import one or more alert rules from a JSON array. Returns the result for each rule, indicating success or failure.", - "tags": [ - "Monitors/Alert rules" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **20 requests/minute**; **2 requests/second** per account |\n| Permissions | **Alerting Rules Manage** (`monit`) |\n\n## Usage\n\n- The request body is a JSON array of rule export objects (compatible with the output of `POST /monit/rule/export`).\n- Each object must include `folder_id`, `ds_type`, and either `ds_list` or `ds_ids`.\n- Some rules may fail (e.g. duplicate name). Check each result for individual status.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-import", - "metadata": { - "sidebarTitle": "Import alert rules" + "type": "object" + }, + "DSRedisNodeConfig": { + "description": "Diagnostic datasource connection configuration.", + "properties": { + "database": { + "default": 0, + "description": "Redis database number; defaults to 0.", + "minimum": 0, + "type": "integer" + }, + "password": { + "description": "Authentication password; supports ${env:NAME}. Omit on update to preserve; explicitly send an empty string to clear. Literal passwords are omitted from responses.", + "type": "string", + "x-flashduty-preserve-absence": true + }, + "timeout_ms": { + "default": 3000, + "description": "Connection timeout in milliseconds; defaults to 3000 when omitted.", + "maximum": 10000, + "minimum": 1000, + "type": "integer" + }, + "username": { + "description": "Authentication username; an ${env:NAME} reference is supported.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleImportResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "name": "CPU High", - "message": "" - } - ] - } - } - } + "type": "object" + }, + "DSRedisSentinelConfig": { + "description": "Diagnostic datasource connection configuration.", + "properties": { + "password": { + "description": "Authentication password; supports ${env:NAME}. Omit on update to preserve; explicitly send an empty string to clear. Literal passwords are omitted from responses.", + "type": "string", + "x-flashduty-preserve-absence": true }, - "400": { - "$ref": "#/components/responses/BadRequest" + "timeout_ms": { + "default": 3000, + "description": "Connection timeout in milliseconds; defaults to 3000 when omitted.", + "maximum": 10000, + "minimum": 1000, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "username": { + "description": "Authentication username; an ${env:NAME} reference is supported.", + "type": "string" + } + }, + "type": "object" + }, + "DSSLSConfig": { + "description": "Alibaba Cloud SLS datasource configuration.", + "properties": { + "access_key_id": { + "description": "Alibaba Cloud Access Key ID.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "access_key_secret": { + "description": "Alibaba Cloud Access Key Secret.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "headers": { + "description": "Custom HTTP headers.", + "items": { + "type": "string" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleImportRequest" - }, - "example": [ - { - "folder_id": 100, - "name": "CPU High", - "ds_type": "prometheus", - "ds_list": [ - "prometheus*" - ], - "enabled": true, - "cron_pattern": "0 * * * * *", - "rule_configs": { - "queries": [ - { - "name": "A", - "expr": "avg(cpu_usage_idle) < 10" - } - ] - } - } - ] - } + "type": "object" + }, + "DSTencentCLSConfig": { + "description": "Tencent CLS (Cloud Log Service) credential configuration.", + "properties": { + "secret_id": { + "description": "Tencent Cloud API SecretId. Always required (create and update). Supports `${env:VAR}` references resolved on the edge.", + "type": "string" + }, + "secret_key": { + "description": "Tencent Cloud API SecretKey. Required on create; on update, omit to keep the stored key. Supports `${env:VAR}` references. Never returned by read APIs: responses carry an empty string unless the stored value is an `${env:...}` reference.", + "type": "string" } - } - } - }, - "/monit/rule/export": { - "post": { - "operationId": "monit-rule-read-export", - "summary": "Export alert rules", - "description": "Export the configuration of selected alert rules as a portable JSON array, compatible with `POST /monit/rule/import`.", - "tags": [ - "Monitors/Alert rules" + }, + "required": [ + "secret_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/day**; **200 requests/minute**; **20 requests/second** per account |\n| Permissions | **Alerting Rules Read** (`monit`) |", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-export", - "metadata": { - "sidebarTitle": "Export alert rules" + "type": "object" + }, + "DSVictoriaLogsConfig": { + "description": "VictoriaLogs datasource configuration. TLS fields are inherited from TLSClientConfig.", + "properties": { + "basic_auth_enabled": { + "description": "Whether HTTP Basic Auth is enabled; when `false`, `basic_auth_username`/`basic_auth_password` are ignored.", + "type": "boolean" + }, + "basic_auth_password": { + "description": "Basic Auth password, effective when `basic_auth_enabled` is `true`.", + "type": "string" + }, + "basic_auth_username": { + "description": "Basic Auth username, effective when `basic_auth_enabled` is `true`.", + "type": "string" + }, + "headers": { + "description": "Custom HTTP headers added to every request, each entry formatted as `Key: Value`; usable for tenancy headers such as `AccountID`/`ProjectID`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "params": { + "description": "Custom query parameters appended to every request URL, each entry formatted as `key=value`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "tls_ca": { + "description": "PEM-encoded CA certificate used to verify the server certificate.", + "type": "string" + }, + "tls_cert": { + "description": "PEM-encoded client certificate for mutual TLS; must be configured together with `tls_key`.", + "type": "string" + }, + "tls_key": { + "description": "PEM-encoded client private key; must be configured together with `tls_cert`.", + "type": "string" + }, + "tls_max_version": { + "description": "Maximum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint.", + "type": "string" + }, + "tls_min_version": { + "description": "Minimum TLS version, one of `1.0`, `1.1`, `1.2`, `1.3`; empty means no constraint and it must not exceed `tls_max_version`.", + "type": "string" + }, + "tls_server_name": { + "description": "Server name used for TLS SNI and certificate verification; defaults to the host from the connection address when empty.", + "type": "string" + }, + "tls_skip_verify": { + "description": "Whether to skip server certificate verification (insecure, for self-signed setups only).", + "type": "boolean" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertRuleExportListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "name": "CPU High", - "ds_type": "prometheus", - "ds_list": [ - "prometheus*" - ], - "enabled": true, - "cron_pattern": "0 * * * * *" - } - ] - } - } - } + "type": "object" + }, + "DataSourceItem": { + "description": "A monitoring datasource.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "address": { + "description": "Connection address. For Prometheus/Loki/VictoriaLogs: HTTP URL. For MySQL/Oracle/Postgres/ClickHouse: `host:port`. For SLS: endpoint without http/https prefix. Redis/MongoDB diagnostic types: one host:port, bracket IPv6; no URI, userinfo or query. Kafka: 1–32 unique comma-separated host:port bootstrap addresses; payload has no broker list. At most 4096 characters after normalization.", + "maxLength": 4096, + "type": "string" + }, + "alerting_enabled": { + "description": "Whether alert evaluation is allowed. Alerting also requires enabled=true and an alerting-capable type. Always false for diagnostic-only types; false does not block non-alerting queries or tools.", + "type": "boolean" + }, + "edge_cluster_name": { + "description": "Monitors edge cluster name responsible for evaluating rules using this datasource.", + "type": "string" + }, + "enabled": { + "description": "Whether business execution is enabled. Disabled datasources reject business queries and tools; enabling does not change alerting_enabled.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "id": { + "description": "Unique datasource ID.", + "format": "uint64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "name": { + "description": "Datasource display name.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleIDsRequest" + "note": { + "description": "Optional description.", + "type": "string" + }, + "payload": { + "anyOf": [ + { + "$ref": "#/components/schemas/DSPayload" }, - "example": { - "ids": [ - 50001 - ] + { + "type": "null" } - } + ], + "description": "Type-specific configuration block; must contain the key matching `type_ident`. Always `null` in `/monit/datasource/list` responses (the list query does not read the payload column); populated in create/update/info responses. For `tencent_cls`, `secret_key` is masked to an empty string unless it is an `${env:...}` reference. For diagnostic types, password and Kafka tls_key are omitted from responses unless they are ${env:...} references. On update, omit those fields to preserve stored secrets; explicitly send an empty string to clear. Other configuration fields retain their existing behavior." + }, + "type_ident": { + "description": "Datasource type identifier. Allowed: `prometheus`, `loki`, `mysql`, `oracle`, `postgres`, `clickhouse`, `elasticsearch`, `sls`, `tencent_cls`, `victorialogs`, `redis_node`, `redis_sentinel`, `mongodb_mongod`, `mongodb_mongos`, `kafka`。", + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp, Unix epoch seconds.", + "format": "int64", + "type": "integer" } - } - } - }, - "/monit/rule/move": { - "post": { - "operationId": "monit-rule-write-move", - "summary": "Move alert rules to folder", - "description": "Move one or more alert rules to a different folder.", - "tags": [ - "Monitors/Alert rules" + }, + "required": [ + "id", + "account_id", + "type_ident", + "name", + "enabled", + "note", + "address", + "edge_cluster_name", + "updated_at", + "payload", + "alerting_enabled" ], - "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 Manage** (`monit`) |\n\n## Usage\n\n- Rules whose names already exist in the destination folder are skipped. Inspect each result's `message` to identify conflicts.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-write-move", - "metadata": { - "sidebarTitle": "Move alert rules to folder" + "type": "object" + }, + "DataSourceListRequest": { + "description": "Filter parameters for listing datasources.", + "properties": { + "type": { + "description": "Datasource type identifier. Omit to return all types. Allowed: `prometheus`, `loki`, `mysql`, `oracle`, `postgres`, `clickhouse`, `elasticsearch`, `sls`, `tencent_cls`, `victorialogs`, `redis_node`, `redis_sentinel`, `mongodb_mongod`, `mongodb_mongos`, `kafka`。", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleNameMessageListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "name": "CPU High", - "message": "" - } - ] - } - } - } + "type": "object" + }, + "DataSourceListResponse": { + "description": "List of datasources. The `payload` column is not read by this endpoint, so `payload` is `null` in every item.", + "items": { + "$ref": "#/components/schemas/DataSourceItem" + }, + "type": "array" + }, + "DataSourceUpsertRequest": { + "description": "Request body for creating or updating a datasource. `id` is required only for update. `address` is required for all types except Elasticsearch with `deployment=cloud`.", + "properties": { + "address": { + "description": "Connection address. Required for every type except `elasticsearch` with `deployment: cloud`. Prometheus/Loki/VictoriaLogs: HTTP URL; MySQL/Oracle/Postgres/ClickHouse: `host:port`; SLS: endpoint without the `http(s)://` prefix; `tencent_cls`: must be `cls.tencentcloudapi.com` or `cls.internal.tencentcloudapi.com` (requires Monitors edge >= v0.66.0). Redis/MongoDB diagnostic types: one host:port, bracket IPv6; no URI, userinfo or query. Kafka: 1–32 unique comma-separated host:port bootstrap addresses; payload has no broker list. At most 4096 characters after normalization.", + "maxLength": 4096, + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "alerting_enabled": { + "description": "Whether this datasource may evaluate alerts. Omitted on create: true for alerting types, false for diagnostic-only types; omitted on update: preserve current value. null is invalid. redis_node, redis_sentinel, mongodb_mongod, mongodb_mongos and kafka reject true. Disabling is rejected with conflict when enabled rules reference the datasource.", + "type": "boolean", + "x-flashduty-preserve-absence": true }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "edge_cluster_name": { + "description": "Monitors edge cluster name responsible for evaluating rules using this datasource.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "enabled": { + "description": "Whether business execution is enabled. Omitted on create: true; omitted on update: preserve the current value. Explicit false disables execution; null is invalid. Does not change alerting_enabled.", + "type": "boolean", + "x-flashduty-preserve-absence": true }, - "500": { - "$ref": "#/components/responses/ServerError" + "id": { + "description": "Datasource ID. Required for update; omit for create.", + "format": "uint64", + "type": "integer" + }, + "name": { + "description": "Datasource display name. This is the name referenced as `ds_name` in query APIs.", + "type": "string" + }, + "note": { + "description": "Optional description.", + "type": "string" + }, + "payload": { + "$ref": "#/components/schemas/DSPayload", + "description": "Type-specific configuration block. Must include the key matching `type_ident`. For diagnostic types, password and Kafka tls_key are omitted from responses unless they are ${env:...} references. On update, omit those fields to preserve stored secrets; explicitly send an empty string to clear. Other configuration fields retain their existing behavior." + }, + "type_ident": { + "description": "Datasource type identifier. Allowed: `prometheus`, `loki`, `mysql`, `oracle`, `postgres`, `clickhouse`, `elasticsearch`, `sls`, `tencent_cls`, `victorialogs`, `redis_node`, `redis_sentinel`, `mongodb_mongod`, `mongodb_mongos`, `kafka`。", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleMoveRequest" - }, - "example": { - "ids": [ - 50001, - 50002 - ], - "dest_folder_id": 200 - } - } - } - } - } - }, - "/monit/rule/audits": { - "post": { - "operationId": "monit-rule-read-audits", - "summary": "List rule change history", - "description": "Return the change history (audit records) for an alert rule.", - "tags": [ - "Monitors/Alert rules" + "required": [ + "type_ident", + "name", + "edge_cluster_name", + "payload" ], - "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** (`monit`) |", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-audits", - "metadata": { - "sidebarTitle": "List rule change history" + "type": "object" + }, + "DatasourceToolInvokeRequest": { + "properties": { + "account_id": { + "description": "Optional consistency check; must equal the authenticated account.", + "format": "uint64", + "type": "integer" + }, + "datasource_id": { + "description": "Datasource ID from /monit/datasource/list.", + "format": "uint64", + "minimum": 1, + "type": "integer" + }, + "params": { + "additionalProperties": true, + "description": "Tool-specific JSON parameters; omitted means {}. Explicit null is invalid.", + "type": "object", + "x-flashduty-raw-json": true + }, + "tool": { + "description": "Single tool name prefixed by the datasource type, e.g. mysql.overview. Free SQL uses /monit/query/data; mysql.query and postgres.query are unsupported.", + "maxLength": 128, + "minLength": 1, + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleAuditListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "id": 9001, - "account_id": 10023, - "alert_rule_id": 50001, - "action": "update", - "creator_id": 80011, - "creator_name": "Alice", - "created_at": 1712000000 - } - ] - } - } - } + "required": [ + "datasource_id", + "tool" + ], + "type": "object" + }, + "DatasourceToolResult": { + "properties": { + "data": { + "description": "Tool-specific JSON evidence, preserved without conversion; never null. No nested legacy diagnose envelope.", + "not": { + "type": "null" + }, + "x-flashduty-raw-json": true }, - "400": { - "$ref": "#/components/responses/BadRequest" + "datasource_id": { + "description": "Datasource ID from /monit/datasource/list.", + "format": "uint64", + "minimum": 1, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "summary": { + "description": "Optional non-empty summary.", + "type": "string", + "x-flashduty-preserve-absence": true }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "tool": { + "description": "Executed tool name matching the request.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "truncated": { + "$ref": "#/components/schemas/DatasourceToolTruncation", + "x-flashduty-preserve-absence": true } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleIDRequest" - }, - "example": { - "id": 50001 - } - } + "required": [ + "datasource_id", + "tool", + "data" + ], + "type": "object" + }, + "DatasourceToolTruncation": { + "properties": { + "reason": { + "description": "Why the result was truncated. Presence of this object indicates truncation.", + "type": "string" } - } - } - }, - "/monit/rule/audit/detail": { - "post": { - "operationId": "monit-rule-read-audit-detail", - "summary": "Get rule audit snapshot", - "description": "Return the audit record (including the `content` field, a JSON string of the rule snapshot at that point in time).", - "tags": [ - "Monitors/Alert rules" + }, + "required": [ + "reason" ], - "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** (`monit`) |\n\n## Usage\n\n- Pass the audit record `id` (not the rule `id`) from `POST /monit/rule/audits`.\n- `content` is a JSON string — parse it to get the full rule snapshot.", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-audit-detail", - "metadata": { - "sidebarTitle": "Get rule audit snapshot" + "type": "object" + }, + "DeleteFieldRequest": { + "properties": { + "field_id": { + "description": "Field ID — 24-character hex ObjectID.", + "pattern": "^[a-f0-9]{24}$", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AlertRuleAudit" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 9001, - "account_id": 10023, - "alert_rule_id": 50001, - "action": "update", - "content": "{\"id\":50001,\"name\":\"CPU High\"}", - "creator_id": 80011, - "creator_name": "Alice", - "created_at": 1712000000 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" + "required": [ + "field_id" + ], + "type": "object" + }, + "DeleteIncidentCommentTypeRequest": { + "description": "Parameters for deleting a comment type.", + "properties": { + "comment_type_id": { + "description": "ID of the comment type to delete (24-character hex ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AuditRecordIDRequest" - }, - "example": { - "id": 9001 - } - } + "required": [ + "comment_type_id" + ], + "type": "object" + }, + "DeletePostMortemRequest": { + "description": "Parameters for deleting a post-mortem report.", + "properties": { + "post_mortem_id": { + "description": "Post-mortem report ID; obtain it from `POST /incident/post-mortem/list`.", + "type": "string" } - } - } - }, - "/monit/rule/dstypes": { - "post": { - "operationId": "monit-rule-read-dstypes", - "summary": "List available datasource types", - "description": "Return the list of datasource types (`DSType` records) that the current account can use when authoring alert rules — combines global types and account-scoped types.", - "tags": [ - "Monitors/Alert rules" + }, + "required": [ + "post_mortem_id" ], - "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** (`monit`) |", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-dstypes", - "metadata": { - "sidebarTitle": "List available datasource types" + "type": "object" + }, + "DeletePostMortemTemplateRequest": { + "description": "Parameters for deleting a post-mortem template.", + "properties": { + "template_id": { + "description": "Template ID; obtain it from `POST /incident/post-mortem/template/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleDsTypesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "id": 1, - "name": "Prometheus", - "ident": "prometheus", - "account_id": 0, - "weight": 100 - } - ] - } - } - } + "required": [ + "template_id" + ], + "type": "object" + }, + "DeleteStatusPageChangeRequest": { + "description": "Parameters for deleting a status page event.", + "properties": { + "change_id": { + "description": "Target change ID; obtain it from `GET /status-page/change/list`.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "page_id", + "change_id" + ], + "type": "object" + }, + "DeleteStatusPageChangeTimelineRequest": { + "description": "Parameters for deleting a timeline entry on a status page event.", + "properties": { + "change_id": { + "description": "Owning change ID; obtain it from `GET /status-page/change/list`.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "update_id": { + "description": "Timeline update ID to delete; obtain it from `GET /status-page/change/info`.", + "type": "string" + } + }, + "required": [ + "page_id", + "change_id", + "update_id" + ], + "type": "object" + }, + "DeleteStatusPageComponentRequest": { + "description": "Parameters for deleting one or more service components from a status page.", + "properties": { + "component_ids": { + "description": "Component IDs to delete; obtain them from `GET /status-page/info`.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleEmptyRequest" - }, - "example": {} - } + "required": [ + "page_id", + "component_ids" + ], + "type": "object" + }, + "DeleteStatusPageRequest": { + "description": "Parameters for deleting a status page.", + "properties": { + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" } - } - } - }, - "/monit/rule/counter/total": { - "post": { - "operationId": "monit-rule-read-counter-total", - "summary": "Get rule counter time series", - "description": "Return the stored time series of the total rule count across the account — one sample per `clock` timestamp.", - "tags": [ - "Monitors/Alert rules" + }, + "required": [ + "page_id" ], - "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** (`monit`) |\n\n## Usage\n\n- Each item is a historical snapshot: `num` is the total rule count at the given `clock` (Unix epoch seconds).", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-counter-total", - "metadata": { - "sidebarTitle": "Get rule counter time series" + "type": "object" + }, + "DeleteStatusPageSectionRequest": { + "description": "Parameters for deleting one or more sections from a status page.", + "properties": { + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" + }, + "section_ids": { + "description": "Section IDs to delete; obtain them from `GET /status-page/info`.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCounterTotalResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "id": 1, - "account_id": 10023, - "num": 50, - "clock": 1712000000 - } - ] - } - } - } + "required": [ + "page_id", + "section_ids" + ], + "type": "object" + }, + "DeleteStatusPageTemplateRequest": { + "description": "Parameters for deleting a status page template.", + "properties": { + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "template_id": { + "description": "ID of the template to delete; obtain it from `GET /status-page/template/list`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "type": { + "description": "Template kind: `pre_defined` predefined template, `message` message template.", + "enum": [ + "pre_defined", + "message" + ], + "type": "string" + } + }, + "required": [ + "page_id", + "type", + "template_id" + ], + "type": "object" + }, + "DeleteWarRoomRequest": { + "description": "Parameters for deleting an incident war room.", + "properties": { + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_id": { + "description": "IM integration ID; obtain it from `POST /datasource/im/war-room-enabled/list`.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "incident_id", + "integration_id" + ], + "type": "object" + }, + "DeleteWorkItemRequest": { + "description": "Parameters for soft-deleting a work item.", + "properties": { + "version": { + "description": "Current item version for optimistic locking. Must match the stored version.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "work_item_id": { + "description": "Work item ID (opaque string, max 128 characters).", + "maxLength": 128, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleEmptyRequest" + "required": [ + "work_item_id", + "version" + ], + "type": "object" + }, + "DimensionInsightItem": { + "allOf": [ + { + "$ref": "#/components/schemas/MetricsBase" + }, + { + "description": "Aggregated incident + alert metrics for an account/team/channel bucket.", + "properties": { + "acknowledgement_pct": { + "description": "Acknowledgement rate (%): acknowledged incidents ÷ total incidents × 100, rounded to two decimals and capped at 100; 0 when the bucket has no incidents.", + "format": "double", + "type": "number" }, - "example": {} - } + "mean_seconds_to_ack": { + "description": "Mean time to first acknowledgement in seconds; 0 when no incident in the bucket was acknowledged.", + "format": "double", + "type": "number" + }, + "mean_seconds_to_close": { + "description": "Mean time to close in seconds; 0 when no incident in the bucket was closed.", + "format": "double", + "type": "number" + }, + "noise_reduction_pct": { + "description": "Noise reduction ratio (%): 100 − incidents ÷ alert events × 100, rounded to two decimals; 0 when there is no alert-event data or alert events do not exceed incidents.", + "format": "double", + "type": "number" + }, + "total_alert_cnt": { + "description": "Total number of alerts.", + "format": "int64", + "type": "integer" + }, + "total_alert_event_cnt": { + "description": "Total number of alert events.", + "format": "int64", + "type": "integer" + }, + "total_engaged_seconds": { + "description": "Total engaged time in seconds: each incident contributes the sum of close time minus acknowledgement time across its acknowledged responders.", + "format": "int64", + "type": "integer" + }, + "total_incident_cnt": { + "description": "Total number of incidents.", + "format": "int64", + "type": "integer" + }, + "total_incidents_acknowledged": { + "description": "Incidents that were acknowledged at least once.", + "format": "int64", + "type": "integer" + }, + "total_incidents_auto_closed": { + "description": "Incidents closed automatically because all alerts recovered.", + "format": "int64", + "type": "integer" + }, + "total_incidents_closed": { + "description": "Incidents that are closed.", + "format": "int64", + "type": "integer" + }, + "total_incidents_escalated": { + "description": "Incidents that were escalated at least once.", + "format": "int64", + "type": "integer" + }, + "total_incidents_manually_closed": { + "description": "Incidents closed manually.", + "format": "int64", + "type": "integer" + }, + "total_incidents_manually_escalated": { + "description": "Incidents escalated manually at least once.", + "format": "int64", + "type": "integer" + }, + "total_incidents_reassigned": { + "description": "Incidents that were reassigned at least once.", + "format": "int64", + "type": "integer" + }, + "total_incidents_timeout_closed": { + "description": "Incidents closed automatically on timeout.", + "format": "int64", + "type": "integer" + }, + "total_incidents_timeout_escalated": { + "description": "Incidents escalated on timeout at least once.", + "format": "int64", + "type": "integer" + }, + "total_interruptions": { + "description": "Total interruptions: notifications sent via app push, SMS, or voice call; consecutive notifications to the same responder within 60 seconds count as one.", + "format": "int64", + "type": "integer" + }, + "total_notifications": { + "description": "Total number of notifications sent.", + "format": "int64", + "type": "integer" + }, + "total_seconds_to_ack": { + "description": "Total time to first acknowledgement in seconds.", + "format": "int64", + "type": "integer" + }, + "total_seconds_to_close": { + "description": "Total time to close in seconds.", + "format": "int64", + "type": "integer" + } + }, + "type": "object" } - } - } - }, - "/monit/rule/counter/node": { - "post": { - "operationId": "monit-rule-read-counter-node", - "summary": "Get rule counts by folder node", - "description": "Return an object mapping top-level folder name to the total number of rules under that folder and all its descendants.", - "tags": [ - "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** (`monit`) |", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-counter-node", - "metadata": { - "sidebarTitle": "Get rule counts by folder node" + ] + }, + "DimensionInsightResponse": { + "properties": { + "items": { + "description": "Insight metric rows aggregated by the endpoint's dimension (account/team/channel); further split by hour bucket or time bucket when `split_hours` or `aggregate_unit` is enabled.", + "items": { + "$ref": "#/components/schemas/DimensionInsightItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCounterNodeResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "Production": 10, - "Staging": 3 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" + "type": "object" + }, + "DisableIncidentMergeRequest": { + "description": "Parameters for disabling automatic merging on incidents.", + "properties": { + "incident_ids": { + "description": "Incident IDs whose automatic merge should be disabled.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "minItems": 1, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleEmptyRequest" - }, - "example": {} - } + "required": [ + "incident_ids" + ], + "type": "object" + }, + "DoIncidentCustomActionRequest": { + "description": "Parameters for invoking a custom action integration on an incident.", + "properties": { + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "integration_id": { + "description": "Custom action integration ID. Must be enabled and associated with the incident's channel.", + "format": "int64", + "type": "integer" } - } - } - }, - "/monit/rule/counter/channel": { - "post": { - "operationId": "monit-rule-read-counter-channel", - "summary": "Get rule counts by channel", - "description": "Return an object mapping channel name to the number of rules routing alerts to that channel. If a channel name cannot be resolved, the channel ID (as a string) is used as the key.", - "tags": [ - "Monitors/Alert rules" + }, + "required": [ + "incident_id", + "integration_id" ], - "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** (`monit`) |", - "href": "/en/api-reference/monitors/alert-rules/monit-rule-read-counter-channel", - "metadata": { - "sidebarTitle": "Get rule counts by channel" + "type": "object" + }, + "DoIncidentCustomActionResponse": { + "description": "Result of a custom action dispatch.", + "properties": { + "message": { + "description": "Error message if the action's HTTP call failed; omitted on success.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RuleCounterChannelResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "Production": 8 - } - } - } - } + "type": "object" + }, + "DutyError": { + "description": "Error payload inside the response envelope. Present only on non-2xx responses.", + "properties": { + "code": { + "$ref": "#/components/schemas/ErrorCode" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "message": { + "description": "Human-readable error message, localized by the caller's Accept-Language. May contain field names, IDs, or other context from the failing request.", + "example": "The specified parameter template_id is not valid.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "reason": { + "description": "Optional machine-readable rejection reason, including datasource tool failures. Inspect alongside HTTP status and code.", + "type": "string", + "x-flashduty-preserve-absence": true + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "EmptyObject": { + "additionalProperties": false, + "description": "An empty object. Returned as the `data` payload by operations whose success signal is simply the absence of an error.", + "type": "object" + }, + "EmptyRequest": { + "additionalProperties": false, + "description": "No parameters required.", + "type": "object" + }, + "EmptyResponse": { + "description": "Empty response body. The server returns `data: null` on success.", + "properties": {}, + "type": "object" + }, + "EnabledTime": { + "description": "Time window in which the rule is active.", + "properties": { + "days": { + "description": "Days of week, 0 = Sunday.", + "items": { + "type": "integer" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "etime": { + "description": "End time, e.g. `18:00`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "stime": { + "description": "Start time, e.g. `09:00`.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RuleEmptyRequest" + "type": "object" + }, + "EnrichFilter": { + "description": "A single label filter condition.", + "properties": { + "key": { + "description": "Event key to match on (e.g. `labels.severity`, `title`). Must be non-empty.", + "minLength": 1, + "type": "string" + }, + "oper": { + "description": "Match operator. `IN` matches when any value matches; `NOTIN` matches when none of the values match.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to match against. Must contain at least one value.", + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "EnrichRule": { + "description": "An enrichment rule with an optional condition and type-specific settings.", + "properties": { + "if": { + "description": "Optional AND-filter list; the rule is skipped unless every filter matches. `null` when the rule has no condition. Filter keys come from the alert/change event vocabulary (e.g. `title`, `labels.severity`).", + "items": { + "$ref": "#/components/schemas/EnrichFilter" + }, + "type": [ + "array", + "null" + ] + }, + "kind": { + "description": "Rule type.\n| Value | Meaning |\n|---|---|\n| `extraction` | Extract a value from the alert's `title`, `description`, or a `labels.*` key via regex or GJson, and write it to a label. |\n| `composition` | Render a Go `text/template` against the event and write the result to a label. |\n| `mapping` | Look up labels from a mapping schema or an external mapping API. |\n| `drop` | Remove the listed labels from the alert. |", + "enum": [ + "extraction", + "composition", + "mapping", + "drop" + ], + "type": "string" + }, + "settings": { + "description": "Rule-kind–specific settings. The shape depends on `kind`.", + "discriminator": { + "mapping": { + "composition": "#/components/schemas/ErsComposition", + "drop": "#/components/schemas/ErsDrop", + "extraction": "#/components/schemas/ErsExtraction", + "mapping": "#/components/schemas/ErsMapping" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/ErsExtraction" }, - "example": {} - } + { + "$ref": "#/components/schemas/ErsComposition" + }, + { + "$ref": "#/components/schemas/ErsMapping" + }, + { + "$ref": "#/components/schemas/ErsDrop" + } + ] } - } - } - }, - "/monit/datasource/list": { - "post": { - "operationId": "monit-datasource-read-list", - "summary": "List datasources", - "description": "Return all data sources for the current account. Optionally filter by `type_ident`. Supports diagnostic types redis_node, redis_sentinel, mongodb_mongod, mongodb_mongos and kafka; enabled and alerting_enabled are independent.", - "tags": [ - "Monitors/Data sources" + }, + "required": [ + "kind", + "settings" ], - "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- Omit `type_ident` to return all types.\n- Sensitive credential fields (passwords, keys) are not returned in the list response.\n\nSee the request/response schemas for all supported types and credential handling. Diagnostic-only types cannot enable alerting. On create omitted enabled defaults to true; on update omission preserves the current value. Explicit null for enabled or alerting_enabled is invalid. Diagnostic passwords and Kafka private keys are omitted from responses unless they are environment references; omit these secrets on update to preserve them, or send an empty string to clear. Other datasource credentials may be returned and must be handled as sensitive.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-list", - "metadata": { - "sidebarTitle": "List datasources" + "type": "object" + }, + "EnrichmentInfoRequest": { + "properties": { + "integration_id": { + "description": "Integration ID to query enrichment rules for. Must be greater than 0.", + "format": "int64", + "minimum": 1, + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DataSourceListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "id": 10, - "account_id": 10023, - "type_ident": "prometheus", - "name": "Prometheus Prod", - "enabled": true, - "note": "Production Prometheus", - "address": "http://prometheus.example.com:9090", - "edge_cluster_name": "default", - "updated_at": 1712000000, - "payload": null, - "alerting_enabled": true - } - ] - } - } - } + "required": [ + "integration_id" + ], + "type": "object" + }, + "EnrichmentItem": { + "description": "Enrichment rule set for an integration.", + "properties": { + "created_at": { + "description": "Creation timestamp, Unix seconds.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "creator_id": { + "description": "Creator member ID.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "deleted_at": { + "description": "Deletion time, Unix seconds. Omitted when the rule set is not deleted; read endpoints never return soft-deleted rule sets, so this is effectively always omitted.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_id": { + "description": "Integration ID.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rules": { + "description": "Ordered enrichment rules.", + "items": { + "$ref": "#/components/schemas/EnrichRule" + }, + "type": "array" + }, + "status": { + "description": "Rule set status: `enabled` (active) or `deleted` (soft-deleted). Read endpoints exclude soft-deleted rule sets, so responses always carry `enabled`.", + "enum": [ + "enabled", + "deleted" + ], + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp, Unix seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Last updater member ID.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DataSourceListRequest" - }, - "example": { - "type": "prometheus" - } - } + "required": [ + "integration_id", + "rules", + "status", + "updated_by", + "creator_id", + "created_at", + "updated_at" + ], + "type": "object" + }, + "EnrichmentListRequest": { + "properties": { + "integration_ids": { + "description": "List of integration IDs to query. Must contain at least one ID.", + "items": { + "format": "int64", + "type": "integer" + }, + "minItems": 1, + "type": "array" } - } - } - }, - "/monit/datasource/info": { - "post": { - "operationId": "monit-datasource-read-info", - "summary": "Get datasource detail", - "description": "Retrieve full details of a single data source by its ID, including the `payload` configuration with its configured connection and authentication settings; treat the response as sensitive and avoid logging or forwarding it. Supports diagnostic types redis_node, redis_sentinel, mongodb_mongod, mongodb_mongos and kafka; enabled and alerting_enabled are independent.", - "tags": [ - "Monitors/Data sources" + }, + "required": [ + "integration_ids" ], - "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\nSee the request/response schemas for all supported types and credential handling. Diagnostic-only types cannot enable alerting. On create omitted enabled defaults to true; on update omission preserves the current value. Explicit null for enabled or alerting_enabled is invalid. Diagnostic passwords and Kafka private keys are omitted from responses unless they are environment references; omit these secrets on update to preserve them, or send an empty string to clear. Other datasource credentials may be returned and must be handled as sensitive.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-info", - "metadata": { - "sidebarTitle": "Get datasource detail" + "type": "object" + }, + "EnrichmentListResponse": { + "properties": { + "items": { + "description": "Enrichment rule sets.", + "items": { + "$ref": "#/components/schemas/EnrichmentItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DataSourceItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 10, - "account_id": 10023, - "type_ident": "prometheus", - "name": "Prometheus Prod", - "enabled": true, - "note": "Production Prometheus", - "address": "http://prometheus.example.com:9090", - "payload": { - "prometheus": { - "basic_auth_enabled": false, - "basic_auth_username": "", - "basic_auth_password": "", - "tls_skip_verify": false - } - }, - "edge_cluster_name": "default", - "updated_at": 1712000000, - "alerting_enabled": true - } - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "EnrichmentUpsertRequest": { + "properties": { + "integration_id": { + "description": "Integration ID to configure enrichment rules for.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "rules": { + "description": "Ordered list of enrichment rules. Replaces all existing rules.", + "items": { + "$ref": "#/components/schemas/EnrichRule" + }, + "type": "array" + } + }, + "required": [ + "integration_id", + "rules" + ], + "type": "object" + }, + "EnvironmentBinding": { + "description": "The runner or cloud sandbox the session is bound to. Null until the first message.", + "properties": { + "id": { + "description": "Environment identifier: a cloud sandbox ID for `cloud` bindings, a runner/environment ID for `byoc` bindings.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "kind": { + "description": "Environment kind bound to the session: `cloud` (managed sandbox) or `byoc` (self-hosted runner).", + "enum": [ + "cloud", + "byoc" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "name": { + "description": "Human-readable environment name; empty for cloud bindings using the default allowlist.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "status": { + "description": "Live binding health, namespaced by kind: BYOC uses online/pending/offline/deleted; cloud uses available/rebuilding/expired.", + "enum": [ + "online", + "pending", + "offline", + "deleted", + "available", + "rebuilding", + "expired" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/IDRequest" - }, - "example": { - "id": 10 - } - } - } - } - } - }, - "/monit/datasource/create": { - "post": { - "operationId": "monit-datasource-write-create", - "summary": "Create datasource", - "description": "Create a new monitoring data source. The `payload` must include the type-specific configuration block. Supports diagnostic types redis_node, redis_sentinel, mongodb_mongod, mongodb_mongos and kafka; enabled and alerting_enabled are independent.", - "tags": [ - "Monitors/Data sources" + "required": [ + "kind", + "id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Manage** (`monit`) |\n\n## Usage\n\n- `type_ident` must be one of: `prometheus`, `loki`, `mysql`, `oracle`, `postgres`, `clickhouse`, `elasticsearch`, `sls`, `tencent_cls`, `victorialogs`, `redis_node`, `redis_sentinel`, `mongodb_mongod`, `mongodb_mongos`, `kafka`.\n- `edge_cluster_name` specifies which Monitors edge cluster evaluates rules using this datasource.\n- For `elasticsearch`, set `payload.elasticsearch.deployment` to `cloud` or `self-managed`.\n- Every call is recorded in the account audit log. Use credential fields only for connection credentials.\n\nSee the request/response schemas for all supported types and credential handling. Diagnostic-only types cannot enable alerting. On create omitted enabled defaults to true; on update omission preserves the current value. Explicit null for enabled or alerting_enabled is invalid. Diagnostic passwords and Kafka private keys are omitted from responses unless they are environment references; omit these secrets on update to preserve them, or send an empty string to clear. Other datasource credentials may be returned and must be handled as sensitive.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-write-create", - "metadata": { - "sidebarTitle": "Create datasource" + "type": "object" + }, + "ErrorCode": { + "description": "Flashduty error code enum. Every failed API response sets `error.code` to one of these stable wire strings. HTTP status is informational — the authoritative signal is the enum value.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `OK` | 200 | Reserved — not returned on real errors. |\n| `InvalidParameter` | 400 | A required parameter is missing or failed validation. |\n| `BadRequest` | 400 | Generic 400 used when no more specific code fits. |\n| `InvalidContentType` | 400 | The `Content-Type` header is not `application/json`. |\n| `ResourceNotFound` | 400 | The referenced resource does not exist. Note: returned as HTTP 400, not 404 (historical choice). |\n| `NoLicense` | 400 | The feature is license-gated and no active license was found. |\n| `ReferenceExist` | 400 | Deletion blocked — other entities still reference this resource. |\n| `Unauthorized` | 401 | `app_key` is missing, invalid, or expired. |\n| `BalanceNotEnough` | 402 | Billing-gated operation with insufficient account balance. |\n| `AccessDenied` | 403 | Authenticated but lacking the permission required for this operation. |\n| `RouteNotFound` | 404 | The request URL path is not a known route. |\n| `MethodNotAllowed` | 405 | The HTTP method is not allowed on this otherwise-known path. |\n| `UndonedOrderExist` | 409 | An outstanding billing order blocks this new one. Wait and retry. |\n| `RequestLocked` | 423 | Operation temporarily locked due to repeated failures. |\n| `EntityTooLarge` | 413 | Request body exceeds the configured max size. |\n| `RequestTooFrequently` | 429 | Rate limit hit — API-global, per-account, or per-integration. |\n| `RequestVerifyRequired` | 428 | Second-factor verification required but not supplied. |\n| `DangerousOperation` | 428 | High-risk operation requires MFA verification. |\n| `InternalError` | 500 | Unhandled server-side error. Include `request_id` in the bug report. |\n| `ServiceUnavailable` | 503 | A backend dependency is unavailable. Try again later. |", + "enum": [ + "OK", + "InvalidParameter", + "BadRequest", + "InvalidContentType", + "ResourceNotFound", + "NoLicense", + "ReferenceExist", + "Unauthorized", + "BalanceNotEnough", + "AccessDenied", + "RouteNotFound", + "MethodNotAllowed", + "UndonedOrderExist", + "RequestLocked", + "EntityTooLarge", + "RequestTooFrequently", + "RequestVerifyRequired", + "DangerousOperation", + "InternalError", + "ServiceUnavailable" + ], + "example": "InvalidParameter", + "type": "string", + "x-enumDescriptions": { + "AccessDenied": "Authenticated but lacking the permission required for this operation.", + "BadRequest": "Generic 400 used when no more specific code fits.", + "BalanceNotEnough": "Billing-gated operation with insufficient account balance.", + "DangerousOperation": "High-risk operation requires MFA verification.", + "EntityTooLarge": "Request body exceeds the configured max size.", + "InternalError": "Unhandled server-side error. Include `request_id` in the bug report.", + "InvalidContentType": "The `Content-Type` header is not `application/json`.", + "InvalidParameter": "A required parameter is missing or failed validation.", + "MethodNotAllowed": "The HTTP method is not allowed on this otherwise-known path.", + "NoLicense": "The feature is license-gated and no active license was found.", + "OK": "Reserved — not returned on real errors.", + "ReferenceExist": "Deletion blocked — other entities still reference this resource.", + "RequestLocked": "Operation temporarily locked due to repeated failures.", + "RequestTooFrequently": "Rate limit hit — API-global, per-account, or per-integration.", + "RequestVerifyRequired": "Second-factor verification required but not supplied.", + "ResourceNotFound": "The referenced resource does not exist. Note: returned as HTTP 400, not 404 (historical choice).", + "RouteNotFound": "The request URL path is not a known route.", + "ServiceUnavailable": "A backend dependency is unavailable. Try again later.", + "Unauthorized": "`app_key` is missing, invalid, or expired.", + "UndonedOrderExist": "An outstanding billing order blocks this new one. Wait and retry." + } + }, + "ErrorResponse": { + "description": "Response envelope for errors. `error` is required; `data` is absent.", + "properties": { + "error": { + "$ref": "#/components/schemas/DutyError" + }, + "request_id": { + "description": "Unique trace ID of this request; include it when reporting issues so logs can be located.", + "example": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DataSourceItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 10, - "type_ident": "prometheus", - "name": "Prometheus Prod", - "enabled": true, - "edge_cluster_name": "default", - "updated_at": 1712000000, - "alerting_enabled": true - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "required": [ + "request_id", + "error" + ], + "type": "object" + }, + "ErsComposition": { + "properties": { + "override": { + "description": "When `true`, overwrite the label if it already exists. Defaults to `false`.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "result_label": { + "description": "Destination label key the composed value is written to. Must match `^[a-zA-Z_][a-zA-Z0-9_]*$`.", + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "template": { + "description": "Go `text/template` string (1–500 characters) rendered against the event struct — e.g. `{{.Title}}`, `{{.Description}}`, `{{.Labels.key}}`. Example: `{{.Labels.region}}-{{.Labels.env}}`.", + "maxLength": 500, + "minLength": 1, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DataSourceUpsertRequest" - }, - "example": { - "type_ident": "prometheus", - "name": "Prometheus Prod", - "note": "Production Prometheus", - "address": "http://prometheus.example.com:9090", - "edge_cluster_name": "default", - "payload": { - "prometheus": { - "basic_auth_enabled": false - } - } - } - } - } - } - } - }, - "/monit/datasource/update": { - "post": { - "operationId": "monit-datasource-write-update", - "summary": "Update datasource", - "description": "Update an existing data source. Supply `id` plus the fields to change. Supports diagnostic types redis_node, redis_sentinel, mongodb_mongod, mongodb_mongos and kafka; enabled and alerting_enabled are independent.", - "tags": [ - "Monitors/Data sources" + "required": [ + "result_label", + "template" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Manage** (`monit`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Use credential fields only for connection credentials.\n\nSee the request/response schemas for all supported types and credential handling. Diagnostic-only types cannot enable alerting. On create omitted enabled defaults to true; on update omission preserves the current value. Explicit null for enabled or alerting_enabled is invalid. Diagnostic passwords and Kafka private keys are omitted from responses unless they are environment references; omit these secrets on update to preserve them, or send an empty string to clear. Other datasource credentials may be returned and must be handled as sensitive.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-write-update", - "metadata": { - "sidebarTitle": "Update datasource" + "title": "composition", + "type": "object" + }, + "ErsDrop": { + "properties": { + "drop_labels": { + "description": "List of label keys to remove from the alert.", + "items": { + "type": "string" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DataSourceItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "id": 10, - "type_ident": "prometheus", - "name": "Prometheus Prod v2", - "enabled": true, - "edge_cluster_name": "default", - "updated_at": 1712100000, - "alerting_enabled": true - } - } - } - } + "required": [ + "drop_labels" + ], + "title": "drop", + "type": "object" + }, + "ErsExtraction": { + "properties": { + "g_json": { + "description": "GJson path expression used to extract a value from a JSON-encoded field. Mutually exclusive with `pattern`.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "override": { + "description": "When `true`, overwrite the label if it already exists. Defaults to `false`.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "pattern": { + "description": "RE2 regular expression applied to the source value. Must contain at least one capture group; the captured groups are joined with a space and written to `result_label`. Mutually exclusive with `g_json`.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "result_label": { + "description": "Destination label key the extracted value is written to. Must match `^[a-zA-Z_][a-zA-Z0-9_]*$`.", + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "source_field": { + "description": "Source field to extract from. Must be `title`, `description`, or a label key prefixed with `labels.` (e.g. `labels.env`).", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DataSourceUpsertRequest" - }, - "example": { - "id": 10, - "type_ident": "prometheus", - "name": "Prometheus Prod v2", - "note": "Updated", - "address": "http://prometheus-v2.example.com:9090", - "edge_cluster_name": "default", - "payload": { - "prometheus": { - "basic_auth_enabled": false - } - } - } - } - } - } - } - }, - "/monit/datasource/delete": { - "post": { - "operationId": "monit-datasource-write-delete", - "summary": "Delete datasource", - "description": "Delete a data source by ID. Alert rules referencing this datasource are not blocked: the datasource is removed from their monitoring scope and their open alerts on it are closed automatically.", - "tags": [ - "Monitors/Data sources" + "required": [ + "source_field", + "result_label" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Datasources Manage** (`monit`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-write-delete", - "metadata": { - "sidebarTitle": "Delete datasource" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "title": "extraction", + "type": "object" + }, + "ErsMapping": { + "properties": { + "api_id": { + "description": "Mapping API ID (MongoDB ObjectID hex). Required when `mapping_type` is `api`.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "mapping_type": { + "default": "schema", + "description": "Mapping source type. `schema` uses a mapping schema table; `api` calls an external HTTP API.", + "enum": [ + "schema", + "api" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "override": { + "description": "When `true`, overwrite labels that already exist. Defaults to `false`.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "result_labels": { + "description": "Label keys to populate from the mapping lookup result. Each must match `^[a-zA-Z_][a-zA-Z0-9_]*$`.", + "items": { + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$", + "type": "string" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "schema_id": { + "description": "Mapping schema ID (MongoDB ObjectID hex). Required when `mapping_type` is `schema`.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/IDRequest" - }, - "example": { - "id": 10 - } - } - } - } - } - }, - "/monit/datasource/sls/projects": { - "post": { - "operationId": "monit-datasource-read-sls-projects", - "summary": "List SLS projects", - "description": "List Alibaba Cloud SLS (Simple Log Service) projects available in the specified SLS datasource.", - "tags": [ - "Monitors/Data sources" + "required": [ + "result_labels" ], - "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`.\n- Use `query` to filter projects by name prefix. Use `offset` and `size` for pagination.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-sls-projects", - "metadata": { - "sidebarTitle": "List SLS projects" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SLSProjectsResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "projects": [ - { - "projectName": "project-a", - "description": "Production logs", - "status": "Normal", - "owner": "", - "region": "cn-shanghai", - "createTime": "1710000000", - "lastModifyTime": "1712000000" - }, - { - "projectName": "project-b", - "description": "Staging logs", - "status": "Normal", - "owner": "", - "region": "cn-shanghai", - "createTime": "1710000000", - "lastModifyTime": "1712000000" - } - ], - "count": 2, - "total": 2 - } - } - } - } + "title": "mapping", + "type": "object" + }, + "EscalateLayer": { + "properties": { + "escalate_window": { + "description": "Wait before moving to the next level, in minutes.", + "maximum": 720, + "minimum": 0, + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "force_escalate": { + "description": "When true, always escalate regardless of acknowledgement.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "max_times": { + "description": "Max repeat notifications within the level.", + "maximum": 6, + "minimum": 0, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "notify_step": { + "description": "Repeat interval in minutes.", + "format": "float", + "maximum": 120, + "minimum": 0.5, + "type": "number" }, - "500": { - "$ref": "#/components/responses/ServerError" + "target": { + "$ref": "#/components/schemas/EscalateTarget" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SLSProjectsRequest" - }, - "example": { - "id": 10, - "query": "", - "offset": 0, - "size": 50 - } - } - } - } - } - }, - "/monit/datasource/sls/logstores": { - "post": { - "operationId": "monit-datasource-read-sls-logstores", - "summary": "List SLS logstores", - "description": "List logstores within an SLS project for the specified SLS datasource.", - "tags": [ - "Monitors/Data sources" + "required": [ + "target" ], - "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`.\n- Supply `project` to select the SLS project whose logstores to list.", - "href": "/en/api-reference/monitors/data-sources/monit-datasource-read-sls-logstores", - "metadata": { - "sidebarTitle": "List SLS logstores" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SLSLogstoresResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - "logstore-1", - "logstore-2" - ] - } - } - } + "type": "object" + }, + "EscalateRuleItem": { + "properties": { + "account_id": { + "description": "Owning account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "aggr_window": { + "description": "Delay window in seconds.", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "channel_id": { + "description": "Channel the rule belongs to.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "channel_name": { + "description": "Channel name, populated for cross-channel listing responses.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "created_at": { + "description": "Creation time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "deleted_at": { + "description": "Deletion time, Unix timestamp in seconds. Omitted unless the rule is soft-deleted; deleted rules are excluded from list responses.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Rule description.", + "type": "string" + }, + "filters": { + "$ref": "#/components/schemas/FilterGroup", + "description": "Incident-level match conditions (OR-of-AND tree): the rule is matched against the incident the alert was grouped into, not against the alert itself. Omit or leave empty to apply the rule to all incidents in the channel." + }, + "layers": { + "description": "Escalation levels in order.", + "items": { + "$ref": "#/components/schemas/EscalateLayer" + }, + "type": "array" + }, + "priority": { + "description": "Evaluation priority. Lower runs first.", + "type": "integer" + }, + "rule_id": { + "description": "Escalation rule ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "rule_name": { + "description": "Rule name.", + "type": "string" + }, + "status": { + "description": "Rule status: `enabled` means active, `disabled` means paused, `deleted` is soft-deleted (possible only from the detail endpoint; lists never return deleted rules).", + "enum": [ + "enabled", + "disabled", + "deleted" + ], + "type": "string" + }, + "template_id": { + "description": "Notification template ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "time_filters": { + "description": "Recurring time windows during which the rule applies.", + "items": { + "$ref": "#/components/schemas/TimeFilter" + }, + "type": "array" + }, + "updated_at": { + "description": "Last update time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Member ID that last updated the rule.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SLSLogstoresRequest" + "required": [ + "account_id", + "channel_id", + "priority", + "aggr_window", + "rule_name", + "description", + "layers", + "time_filters", + "filters", + "status", + "template_id", + "rule_id", + "updated_by", + "created_at", + "updated_at" + ], + "type": "object" + }, + "EscalateTarget": { + "description": "Notification target. At least one of `person_ids`, `team_ids`, `schedule_to_role_ids`, or `emails` must be set, together with either `by` or `webhooks`.", + "properties": { + "by": { + "description": "Per-severity personal notification channels. Required unless `webhooks` is provided.", + "properties": { + "critical": { + "description": "Notify channels used for Critical severity. Personal channels: `sms`, `voice`, `email`, `push`; IM group-chat channels: `feishu_app:`, `dingtalk_app:`, `wecom_app:`, `slack_app:`, `teams_app:`.", + "items": { + "type": "string" + }, + "type": "array" }, - "example": { - "id": 10, - "project": "project-a", - "offset": 0, - "size": 50 + "follow_preference": { + "description": "When true, use each responder's personal preference instead of the lists below.", + "type": "boolean" + }, + "info": { + "description": "Notify channels used for Info severity. Values as for `critical`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "warning": { + "description": "Notify channels used for Warning severity. Values as for `critical`.", + "items": { + "type": "string" + }, + "type": "array" } - } - } - } - } - }, - "/rum/facet/count": { - "post": { - "operationId": "rum-read-facet-count", - "summary": "Count facet value distribution", - "description": "Return the top N values for a facet field within a time range, sorted by occurrence count descending.", - "tags": [ - "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 available `facet_key` values for each scope.\n- The `scope` must be one of: `session`, `view`, `action`, `error`, `resource`, `long_task`, `vital`, `issue`, `sourcemap`.\n- Pass `dql` to further filter events before counting. DQL syntax follows the RUM query language.\n- Pass `sql` with a WHERE-clause only (no SELECT) for SQL-style filtering.\n- Default limit is 100; maximum is 100.\n- Time range is required (`start_time` / `end_time` in Unix epoch **milliseconds**). Maximum span is 31 days.", - "href": "/en/api-reference/rum/facets/rum-read-facet-count", - "metadata": { - "sidebarTitle": "Count facet value distribution" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumFacetCountResponse" - } - } - } - ] + }, + "type": "object" + }, + "emails": { + "description": "Email addresses to notify (push-only scenarios).", + "items": { + "format": "email", + "type": "string" + }, + "type": "array" + }, + "person_ids": { + "description": "Member IDs to notify directly.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "schedule_to_role_ids": { + "additionalProperties": { + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "description": "Map of schedule ID to the role IDs on that schedule to notify.", + "type": "object" + }, + "team_ids": { + "description": "Team IDs to notify.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "webhooks": { + "description": "Group chat / webhook targets. Required unless `by` is provided.", + "items": { + "properties": { + "settings": { + "additionalProperties": true, + "description": "Type-specific settings (chat IDs, URLs, etc.).", + "type": "object" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "facet_value": "TypeError", - "count": 1523 - }, - { - "facet_value": "ReferenceError", - "count": 342 - }, - { - "facet_value": "SyntaxError", - "count": 89 - } - ] - } + "type": { + "description": "Webhook type, one of `feishu`, `feishu_app`, `dingtalk`, `dingtalk_app`, `wecom`, `slack`, `slack_app`, `teams_app`, `telegram`, `zoom`.", + "type": "string" } - } - } + }, + "required": [ + "type", + "settings" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "EventGroup": { + "description": "Alert event merge configuration. When enabled, repeated incoming events of the same alert are merged into the existing alert within the time window instead of creating new alerts.", + "properties": { + "is_enabled": { + "description": "When true, repeated events merge into the existing alert; when false, every event creates a separate alert. Defaults to true.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "time_window": { + "description": "Merge window in minutes, 1-1440 (24 h); accounts with the extended limit may use up to 10080 (7 days). Defaults to 1440.", + "minimum": 1, + "type": "integer" + } + }, + "type": "object" + }, + "EventItem": { + "description": "One persisted session event. content/actions/usage_metadata carry the raw ADK envelope; treat them as opaque structured payloads.", + "properties": { + "actions": { + "additionalProperties": true, + "description": "ADK actions envelope (state deltas, transfers, escalation).", + "type": "object" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "author": { + "description": "Event author (e.g. user, the agent name).", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "branch": { + "description": "ADK branch path for nested agents.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumFacetCountRequest" - }, - "example": { - "scope": "error", - "facet_key": "error.type", - "start_time": 1712620800000, - "end_time": 1712707200000, - "limit": 10 - } - } + "additionalProperties": true, + "description": "ADK content envelope {role, parts:[...]}.", + "type": "object" + }, + "created_at": { + "description": "Unix timestamp in milliseconds when the event was written.", + "format": "int64", + "type": "integer" + }, + "error_code": { + "description": "Error code when the event represents a failure.", + "type": "string" + }, + "error_message": { + "description": "Human-readable error message, when present.", + "type": "string" + }, + "event_id": { + "description": "Event identifier.", + "type": "string" + }, + "invocation_id": { + "description": "ADK invocation id grouping a turn.", + "type": "string" + }, + "partial": { + "description": "True for a streaming partial chunk.", + "type": "boolean" + }, + "session_id": { + "description": "Owning session id.", + "type": "string" + }, + "status": { + "description": "Event status. One of: `normal` (a live event included in the context fed to the model), `compressed` (folded into a compaction summary boundary event; no longer loaded for the model, kept as history only).", + "enum": [ + "normal", + "compressed" + ], + "type": "string" + }, + "turn_complete": { + "description": "True on the terminal event of a turn.", + "type": "boolean" + }, + "usage_metadata": { + "additionalProperties": true, + "description": "Per-turn token usage metadata.", + "type": "object" } - } - } - }, - "/rum/application/webhook/test": { - "post": { - "operationId": "rum-application-webhook-test", - "summary": "Test application webhook", - "description": "Send a sample RUM alert event to verify an application's webhook URL.", - "tags": [ - "RUM/Applications" + }, + "required": [ + "event_id", + "session_id", + "partial", + "turn_complete", + "created_at" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Applications Manage** (`rum`) |\n\n## Usage\n\n- The endpoint validates the URL before sending the sample event.\n- A failed delivery still returns HTTP 200 with `ok=false` and the delivery error in `message`.", - "href": "/en/api-reference/rum/applications/rum-application-webhook-test", - "metadata": { - "sidebarTitle": "Test application webhook" + "type": "object" + }, + "ExportStatusPageSubscribersRequest": { + "description": "Parameters for exporting a status page subscriber list.", + "properties": { + "component_ids": { + "description": "Optional component IDs to filter subscribers by.", + "items": { + "type": "string" + }, + "type": "array" + }, + "page_id": { + "description": "Status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumWebhookTestResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "ok": true, - "status_code": 200, - "message": "ok" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "page_id" + ], + "type": "object" + }, + "ExportedStatusPageSubscriberItem": { + "description": "A status page subscriber, as returned by the subscriber list and export endpoints.", + "properties": { + "all": { + "description": "Whether the subscriber is subscribed to all components.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "components": { + "description": "Components this subscriber has subscribed to.", + "items": { + "$ref": "#/components/schemas/StatusPageComponentItem" + }, + "type": "array" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "locale": { + "description": "Preferred locale for notifications. Omitted when empty.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "method": { + "description": "Subscription notification method. `email` is email subscription (public pages); `im` is IM subscription (internal pages). Determined by the page type.", + "enum": [ + "email", + "im" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "recipient": { + "description": "Subscriber recipient: email address for public pages, user ID for internal pages.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumWebhookTestRequest" - }, - "example": { - "application_id": "rum-app-prod", - "webhook_url": "https://hooks.example.com/rum-alerts" - } - } + "required": [ + "recipient", + "method", + "components", + "all" + ], + "type": "object" + }, + "FacetCountItem": { + "description": "A facet value and its occurrence count.", + "properties": { + "count": { + "description": "Number of events with this facet value in the time range.", + "example": 1523, + "format": "int64", + "type": "integer" + }, + "facet_value": { + "description": "The facet value. Type matches the field's `value_type`." } - } - } - }, - "/rum/issue/info": { - "post": { - "operationId": "rum-issue-read-info", - "summary": "Get issue detail", - "description": "Retrieve full details of a single issue by `issue_id`.", - "tags": [ - "RUM/Issues" + }, + "required": [ + "facet_value", + "count" ], - "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 |", - "href": "/en/api-reference/rum/issues/rum-issue-read-info", - "metadata": { - "sidebarTitle": "Get issue detail" + "type": "object" + }, + "FeedDetailAlertAck": { + "description": "Detail payload for `a_ack` (historical). No fields.", + "properties": {}, + "title": "a_ack", + "type": "object" + }, + "FeedDetailAlertClose": { + "additionalProperties": false, + "description": "Detail payload for `a_close`. No fields.", + "properties": {}, + "title": "a_close", + "type": "object" + }, + "FeedDetailAlertComment": { + "description": "Detail payload for `a_comm`.", + "properties": { + "comment": { + "description": "Comment body.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumIssueItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "team_id": 2477033058131, - "issue_id": "NHEacQHi2DhXqobr9qPQz9", - "application_id": "eWbr4xk3ZRnLabRa6unqwD", - "application_name": "Flashduty DEV", - "service": "fd-console", - "status": "for_review", - "error_count": 752, - "session_count": 381, - "is_crash": false, - "age": 5078684, - "resolved_at": 0, - "resolved_by": 0, - "created_at": 1770883154944, - "updated_at": 1775961914595, - "first_seen": { - "timestamp": 1770883154944, - "version": "1.0.0" - }, - "last_seen": { - "timestamp": 1775961839090, - "version": "1.0.0" - }, - "error": { - "message": "Script error.", - "type": "Error" - }, - "suspected_cause": { - "source": "auto", - "value": "code.exception", - "reason": "The error message 'Script error.' typically indicates an unhandled exception in JavaScript.", - "person_id": 0 - }, - "versions": [ - "1.0.0" - ], - "severity": "Info" - } - } - } - } + "title": "a_comm", + "type": "object" + }, + "FeedDetailAlertMerge": { + "description": "Detail payload for `a_merge`: an alert merged into an incident.", + "properties": { + "comment": { + "description": "Comment recorded with the merge. Omitted when empty.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "owner_id": { + "description": "New owner member ID set on the target incident. Omitted when unchanged.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "source_alerts": { + "description": "Source alerts merged into the target incident. Omitted when empty.", + "items": { + "$ref": "#/components/schemas/AlertShort" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "target_incident": { + "$ref": "#/components/schemas/IncidentShort", + "description": "Incident the alerts were merged into. Omitted when not recorded." }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "New title set on the target incident. Omitted when unchanged.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumIssueIDRequest" - }, - "example": { - "issue_id": "NHEacQHi2DhXqobr9qPQz9" - } - } - } - } - } - }, - "/rum/application/list": { - "post": { - "operationId": "rum-application-read-list", - "summary": "List applications", - "description": "Return a paginated list of RUM applications accessible to the current user.", - "tags": [ - "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- Use `is_my_team` to filter applications belonging to the current user's teams.\n- Default page size is 20, maximum is 100.\n- `orderby` accepts `created_at` or `updated_at`.", - "href": "/en/api-reference/rum/applications/rum-application-read-list", - "metadata": { - "sidebarTitle": "List applications" + "title": "a_merge", + "type": "object" + }, + "FeedDetailAlertMuteByFlapping": { + "description": "Detail payload for `a_m_flapping` (historical): the alert was muted by flapping detection.", + "properties": { + "in_secs": { + "description": "Window in seconds over which the state changes were counted. Omitted when zero.", + "type": "integer" + }, + "max_changes": { + "description": "State-change count threshold that triggered flapping detection. Omitted when zero.", + "type": "integer" + }, + "mute_secs": { + "description": "Mute duration in seconds. Omitted when zero.", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumApplicationListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "has_next_page": true, - "total": 7, - "items": [ - { - "account_id": 2451002751131, - "application_id": "WoyQQ3BohkdtPivubEvE8o", - "application_name": "flashcat-rum", - "type": "browser", - "client_token": "a3cea433a8685a398cdfd68f54a45e06131", - "team_id": 2477033058131, - "is_private": true, - "no_ip": true, - "no_geo": false, - "alerting": { - "enabled": true, - "channel_ids": [ - 2490121812131 - ], - "integration_id": 4759595678131 - }, - "tracing": { - "enabled": false, - "open_type": "", - "endpoint": "" - }, - "status": "enabled", - "created_by": 4441703362131, - "updated_by": 3790925372131, - "created_at": 1746673831462, - "updated_at": 1773398630657, - "links": { - "enabled": true, - "systems": [ - { - "id": "s3-crash-logs", - "name": "S3 Crash Logs", - "icon_text": "S3", - "icon_color": "#0F766E", - "url": "https://s3.example.com/logs?app=${application_id}&trace=${trace_id}", - "event_types": [ - "crash", - "error" - ], - "enabled": true - } - ] - } - }, - { - "account_id": 2451002751131, - "application_id": "eWbr4xk3ZRnLabRa6unqwD", - "application_name": "Flashduty DEV", - "type": "browser", - "client_token": "ce8d1be90fc6534f89ce36ebf526765e131", - "team_id": 2477033058131, - "is_private": false, - "no_ip": false, - "no_geo": false, - "alerting": { - "enabled": true, - "channel_ids": [ - 5962711836131, - 5967875767131 - ], - "integration_id": 4759595678131 - }, - "tracing": { - "enabled": true, - "open_type": "popup", - "endpoint": "https://www.tracing.com/${trace_id}" - }, - "status": "enabled", - "created_by": 2476444212131, - "updated_by": 3122470302131, - "created_at": 1742958482000, - "updated_at": 1772096392711, - "links": { - "enabled": false, - "systems": [] - } - } - ] - } - } - } - } + "title": "a_m_flapping", + "type": "object" + }, + "FeedDetailAlertMuteByInhibit": { + "description": "Detail payload for `a_m_inhibit`: the alert was inhibited by an inhibit rule because of a source alert.", + "properties": { + "rule_id": { + "description": "Inhibit rule ID that muted the alert. Omitted when empty.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "rule_name": { + "description": "Inhibit rule name, resolved at read time. Omitted when empty.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "source_alert_id": { + "description": "ID of the source alert that triggered the inhibition. Omitted when empty.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "source_alert_title": { + "description": "Title of the source alert, resolved at read time. Omitted when empty.", + "type": "string" + } + }, + "title": "a_m_inhibit", + "type": "object" + }, + "FeedDetailAlertMuteBySilence": { + "description": "Detail payload for `a_m_silence`: the alert was muted by a silence rule.", + "properties": { + "rule_id": { + "description": "Silence rule ID that muted the alert. Omitted when empty.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rule_name": { + "description": "Silence rule name, resolved at read time. Omitted when empty.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumApplicationListRequest" - }, - "example": { - "p": 1, - "limit": 20, - "query": "", - "is_my_team": false - } - } - } - } - } - }, - "/sourcemap/stack/enrich": { - "post": { - "operationId": "sourcemap-read-stack-enrich", - "summary": "Enrich a stack trace", - "description": "Symbolicate or deobfuscate a browser, Android, iOS, Mini Program, or HarmonyOS stack trace.", - "tags": [ - "RUM/Sourcemaps" - ], - "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- `type` defaults to `browser` when omitted for backward compatibility.\n- Set `near` from 1 to 20 to include source-code snippets around converted frames.\n- For Android NDK native crashes, provide `arch` and `source_type: ndk` so the backend routes to native symbolication.\n- For iOS crash stacks, pass `binary_images` so addresses can be relocated against the uploaded dSYM files.\n- `no_cache` is intended for debugging and bypasses cached enrich results.", - "href": "/en/api-reference/rum/sourcemaps/sourcemap-read-stack-enrich", - "metadata": { - "sidebarTitle": "Enrich a stack trace" + "title": "a_m_silence", + "type": "object" + }, + "FeedDetailAlertTrigger": { + "description": "Detail payload for `a_new`.", + "properties": { + "severity": { + "$ref": "#/components/schemas/FeedSeverity" + }, + "status": { + "$ref": "#/components/schemas/FeedSeverity" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SourcemapStackEnrichResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "frames": [ - { - "function": "renderCheckout", - "file": "src/pages/checkout.tsx", - "line": 42, - "column": 17, - "converted": true, - "code_snippets": [ - { - "line": 41, - "code": "const cart = props.cart;" - }, - { - "line": 42, - "code": "return cart.items.map(renderItem);" - } - ], - "original_frame": { - "function": "render", - "file": "https://cdn.example.com/app.min.js", - "line": 1, - "column": 2345 - } - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "title": "a_new", + "type": "object" + }, + "FeedDetailAlertUnack": { + "description": "Detail payload for `a_unack` (historical). No fields.", + "properties": {}, + "title": "a_unack", + "type": "object" + }, + "FeedDetailAlertUpdate": { + "description": "Detail payload for `a_update`: severity/status after the update.", + "properties": { + "severity": { + "$ref": "#/components/schemas/FeedSeverity" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "status": { + "$ref": "#/components/schemas/FeedSeverity" + } + }, + "title": "a_update", + "type": "object" + }, + "FeedDetailIncidentAck": { + "description": "Detail payload for `i_ack`.", + "properties": { + "comment": { + "description": "Form summary recorded as a timeline comment. Omitted when no acknowledgement form summary was submitted.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "images": { + "description": "Images from the acknowledgement form, recorded on the timeline entry only. Omitted when none were submitted.", + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "progress": { + "description": "Progress note entered at acknowledgement.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SourcemapStackEnrichRequest" - }, - "example": { - "type": "browser", - "service": "my-web-app", - "version": "1.0.0", - "stack": "TypeError: Cannot read properties of undefined\n at render (https://cdn.example.com/app.min.js:1:2345)", - "near": 3 - } - } - } - } - } - }, - "/rum/data/query": { - "post": { - "operationId": "rum-read-data-query", - "summary": "Query RUM data", - "description": "Run one or more SQL-style RUM data queries over a bounded time range.", - "tags": [ - "RUM/Data query" - ], - "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- Send 1 to 10 queries in one request; each query `id` becomes a key in the response object.\n- `start_time` and `end_time` are required Unix epoch milliseconds. The maximum time range is 31 days.\n- Use `format: table` for tabular results, or `format: time_series` for bucketed time-series results.\n- For `time_series`, `interval` defaults to 3600 seconds and `max_points` defaults to 1226 when omitted.\n- `search_after_ctx` is returned by paginated table queries and can be sent back to continue scanning.", - "href": "/en/api-reference/rum/data-query/rum-read-data-query", - "metadata": { - "sidebarTitle": "Query RUM data" + "title": "i_ack", + "type": "object" + }, + "FeedDetailIncidentAddRspd": { + "description": "Detail payload for `i_a_rspd`.", + "properties": { + "to": { + "description": "Member IDs added as responders.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumDataQueryResponse" - } - } - } - ] + "title": "i_a_rspd", + "type": "object" + }, + "FeedDetailIncidentAssign": { + "allOf": [ + { + "$ref": "#/components/schemas/AssignedTo" + }, + { + "properties": { + "to": { + "description": "Member IDs that received the assignment.", + "items": { + "format": "int64", + "type": "integer" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "errors_by_type": { - "data": { - "fields": [ - { - "name": "error.type", - "type": "String", - "nullable": false - }, - { - "name": "errors", - "type": "UInt64", - "nullable": false - } - ], - "values": [ - [ - "TypeError", - 1523 - ], - [ - "ReferenceError", - 342 - ] - ] - } - } - } - } + "type": "array" } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + }, + "type": "object" + } + ], + "description": "Detail payload for `i_assign`. Extends `AssignedTo` with the set of target member IDs.", + "title": "i_assign", + "type": "object" + }, + "FeedDetailIncidentAutoRefreshCard": { + "additionalProperties": false, + "description": "Detail payload for `i_auto_refresh`. No fields.", + "properties": {}, + "title": "i_auto_refresh", + "type": "object" + }, + "FeedDetailIncidentComment": { + "description": "Detail payload for `i_comm`.", + "properties": { + "comment": { + "description": "Comment body.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "comment_type": { + "$ref": "#/components/schemas/IncidentCommentTypeDisplay" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "comment_type_id": { + "description": "ObjectID of the account-level comment type attached to the comment.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "mute_reply": { + "description": "Whether replies to this comment are muted.", + "type": "boolean" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumDataQueryRequest" - }, - "example": { - "start_time": 1712620800000, - "end_time": 1712707200000, - "queries": [ - { - "id": "errors_by_type", - "sql": "SELECT error.type, count(*) AS errors FROM error GROUP BY error.type ORDER BY errors DESC LIMIT 10", - "format": "table", - "time_zone": "Asia/Shanghai" - } - ] - } - } - } - } - } - }, - "/rum/issue/list": { - "post": { - "operationId": "rum-issue-read-list", - "summary": "List issues", - "description": "Return a paginated list of RUM error tracking issues matching the given filters.", - "tags": [ - "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- `start_time` and `end_time` are millisecond timestamps. Maximum range: 183 days.\n- `statuses` filters by issue status. Valid values: `for_review`, `reviewed`, `ignored`, `resolved`.\n- `orderby` accepts: `created_at`, `updated_at`, `session_count`, `error_count`, `severity`.\n- Use `dql` or `sql` for advanced filtering. Cannot provide both.", - "href": "/en/api-reference/rum/issues/rum-issue-read-list", - "metadata": { - "sidebarTitle": "List issues" + "title": "i_comm", + "type": "object" + }, + "FeedDetailIncidentCustomAction": { + "description": "Detail payload for `i_custom`.", + "properties": { + "integration_id": { + "description": "Integration ID that executed the action.", + "format": "int64", + "type": "integer" + }, + "integration_name": { + "description": "Integration display name.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumIssueListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "team_id": 2477033058131, - "issue_id": "NHEacQHi2DhXqobr9qPQz9", - "application_id": "eWbr4xk3ZRnLabRa6unqwD", - "application_name": "Flashduty DEV", - "service": "fd-console", - "status": "for_review", - "error_count": 752, - "session_count": 381, - "is_crash": false, - "age": 5078684, - "resolved_at": 0, - "resolved_by": 0, - "created_at": 1770883154944, - "updated_at": 1775961914595, - "first_seen": { - "timestamp": 1770883154944, - "version": "1.0.0" - }, - "last_seen": { - "timestamp": 1775961839090, - "version": "1.0.0" - }, - "error": { - "message": "Script error.", - "type": "Error" - }, - "suspected_cause": { - "source": "auto", - "value": "code.exception", - "reason": "The error message 'Script error.' typically indicates an unhandled exception in JavaScript.", - "person_id": 0 - }, - "versions": [ - "1.0.0" - ], - "severity": "Info" - }, - { - "team_id": 2477033058131, - "issue_id": "H8kZSmxiE7EgdyD4fCyyNa", - "application_id": "eWbr4xk3ZRnLabRa6unqwD", - "application_name": "Flashduty DEV", - "service": "fd-console", - "status": "for_review", - "error_count": 3, - "session_count": 1, - "is_crash": false, - "age": 48, - "resolved_at": 0, - "resolved_by": 0, - "created_at": 1775189479566, - "updated_at": 1775191284163, - "first_seen": { - "timestamp": 1775189479566, - "version": "1.0.0" - }, - "last_seen": { - "timestamp": 1775189527762, - "version": "1.0.0" - }, - "error": { - "message": "API ERROR: We encountered an internal error | POST /api/access/logout", - "type": "Error" - }, - "suspected_cause": { - "source": "auto", - "value": "api.failed_request", - "reason": "The error indicates an internal server error during a POST request to /api/access/logout.", - "person_id": 0 - }, - "versions": [ - "1.0.0" - ], - "severity": "Info" - } - ], - "has_next_page": true, - "total": 111 - } - } - } - } + "title": "i_custom", + "type": "object" + }, + "FeedDetailIncidentMerge": { + "description": "Detail payload for `i_merge`.", + "properties": { + "comment": { + "description": "Merge comment.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "owner_id": { + "description": "Member ID that performed the merge.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "remove_source_incidents": { + "description": "True if the source incidents were removed after merging.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "source_incidents": { + "description": "Source incidents that were merged.", + "items": { + "$ref": "#/components/schemas/IncidentShort" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "source_responders": { + "description": "Responder member IDs carried over from the source incidents.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "target_incident": { + "$ref": "#/components/schemas/IncidentShort" + }, + "title": { + "description": "Resulting incident title.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumIssueListRequest" - }, - "example": { - "start_time": 1772611200000, - "end_time": 1775961914595, - "application_ids": [ - "eWbr4xk3ZRnLabRa6unqwD" - ], - "statuses": [ - "for_review" - ], - "p": 1, - "limit": 20, - "orderby": "updated_at" - } - } + "title": "i_merge", + "type": "object" + }, + "FeedDetailIncidentMuteByFlapping": { + "description": "Detail payload for `i_m_flapping`.", + "properties": { + "in_mins": { + "description": "Window length in minutes.", + "type": "integer" + }, + "max_changes": { + "description": "Maximum state changes allowed within the window.", + "type": "integer" + }, + "mute_mins": { + "description": "Mute duration in minutes once flapping is detected.", + "type": "integer" } - } - } - }, - "/rum/issue/export": { - "post": { - "operationId": "rum-issue-read-export", - "summary": "Export issues as CSV", - "description": "Export the filtered RUM error tracking issues as a CSV file. The response is a `text/csv` stream delivered with `Content-Disposition: attachment` — it is not a JSON envelope; non-console callers can read the `X-Export-Total` and `X-Export-Truncated` response headers.", - "tags": [ - "RUM/Issues" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **200 requests/day**; **100 requests/minute**; **10 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- The response is a `text/csv` stream delivered with `Content-Disposition: attachment` — it is not wrapped in the standard envelope. The filename is `rum-issues-.csv`, stamped in the requested `time_zone`. Read `X-Export-Total` and `X-Export-Truncated` response headers instead of a body field.\n- The export reads the first 100 matching rows (`ExportMaxRows`); `X-Export-Truncated` is `true` when more issues match. `p` and `limit` are ignored.\n- The request filters are exactly those of `POST /rum/issue/list` — an export is \"what I am looking at, as a file\".\n- `export_fields` names the CSV columns in the order they appear. Unknown keys are rejected with a parameter error; an empty array uses the default column set.\n- `time_zone` must be a valid IANA zone name (e.g. `Asia/Shanghai`, `UTC`); timestamps are rendered in that zone and time columns carry the zone in their header. Invalid names are rejected.\n- `console_origin` is used to build the `issue_url` column; the service cannot infer it (SaaS, on-premises and dev releases answer on different origins).\n- Every call is recorded in the account's audit log with the caller's member ID, request payload, and resulting error (if any). Do not put secrets in request fields.", - "href": "/en/api-reference/rum/issues/rum-issue-read-export", - "metadata": { - "sidebarTitle": "Export issues as CSV" + }, + "title": "i_m_flapping", + "type": "object" + }, + "FeedDetailIncidentMuteReply": { + "additionalProperties": false, + "description": "Detail payload for `i_m_reply`. No fields.", + "properties": {}, + "title": "i_m_reply", + "type": "object" + }, + "FeedDetailIncidentNew": { + "description": "Detail payload for `i_new`.", + "properties": { + "reporter_email": { + "description": "Email of the reporter when the incident was created externally.", + "type": "string" + }, + "severity": { + "$ref": "#/components/schemas/FeedSeverity" + }, + "title": { + "description": "Initial incident title.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success. CSV attachment, not a JSON envelope.", - "headers": { - "X-Export-Total": { - "description": "Total number of issues matching the filters, before the row cap.", - "schema": { - "type": "integer", - "format": "int64" - } - }, - "X-Export-Truncated": { - "description": "`true` when more issues matched than the 100-row cap and the file was truncated.", - "schema": { - "type": "boolean" - } - } + "title": "i_new", + "type": "object" + }, + "FeedDetailIncidentNotify": { + "description": "Detail payload for `i_notify`.", + "properties": { + "by": { + "description": "Delivery channel or method label.", + "type": "string" + }, + "chats": { + "description": "Per-chat delivery records.", + "items": { + "$ref": "#/components/schemas/NotifyChat" }, - "content": { - "text/csv": { - "schema": { - "type": "string", - "description": "CSV file content. The header row matches the exported columns in order; values are sanitized against spreadsheet formula injection." - }, - "example": "Issue ID,Error type,Error message,Status,Error count,Affected sessions,Last seen (Asia/Shanghai)\nNHEacQHi2DhXqobr9qPQz9,Error,Script error.,for_review,752,381,2026-04-12 10:43:59\nH8kZSmxiE7EgdyD4fCyyNa,Error,\"API ERROR: We encountered an internal error | POST /api/access/logout\",for_review,3,1,2026-04-03 12:41:24" - } - } + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "escalate_rule_id": { + "description": "Escalation rule ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "escalate_rule_name": { + "description": "Escalation rule display name.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "fire_type": { + "description": "Whether this is the first fire or a refire. `fire`: the first notification for this escalation layer; `refire`: a repeat notification to the same layer when the incident remains unhandled, sent at the layer's notify interval and capped by the layer's maximum refire count.", + "enum": [ + "fire", + "refire" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "layer_idx": { + "description": "Escalation level index used for this notification.", + "type": "integer" + }, + "msg_id": { + "description": "Upstream message ID returned by the delivery channel.", + "type": "string" + }, + "persons": { + "description": "Per-person delivery records.", + "items": { + "$ref": "#/components/schemas/NotifyPerson" + }, + "type": "array" + }, + "rid": { + "description": "Notification record ID.", + "type": "string" + }, + "robots": { + "description": "Per-robot delivery records.", + "items": { + "$ref": "#/components/schemas/NotifyRobot" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumIssueExportRequest" - }, - "example": { - "start_time": 1772611200000, - "end_time": 1775961914595, - "application_ids": [ - "eWbr4xk3ZRnLabRa6unqwD" - ], - "statuses": [ - "for_review" - ], - "orderby": "updated_at", - "export_fields": [ - "issue_id", - "error_type", - "error_message", - "status", - "error_count", - "session_count", - "last_seen_at" - ], - "console_origin": "https://console.flashcat.cloud", - "time_zone": "Asia/Shanghai" - } - } - } - } - } - }, - "/rum/issue/update": { - "post": { - "operationId": "rum-issue-write-update", - "summary": "Update issue", - "description": "Update the status or suspected cause of an issue.", - "tags": [ - "RUM/Issues" + "required": [ + "layer_idx" ], - "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- `status` valid values: `for_review`, `reviewed`, `ignored`, `resolved`.\n- `suspected_cause` valid values: `api.failed_request`, `network.error`, `code.exception`, `code.invalid_object_access`, `code.invalid_argument`, `unknown`.\n- Setting `status` to `resolved` also stamps `resolved_at` and `resolved_by` on the issue; moving a resolved issue back to another status clears them.\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" + "title": "i_notify", + "type": "object" + }, + "FeedDetailIncidentReopen": { + "description": "Detail payload for `i_reopen`.", + "properties": { + "reason": { + "description": "Reason why the incident was reopened.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "title": "i_reopen", + "type": "object" + }, + "FeedDetailIncidentResetDescription": { + "additionalProperties": false, + "description": "Detail payload for `i_r_desc`. No fields.", + "properties": {}, + "title": "i_r_desc", + "type": "object" + }, + "FeedDetailIncidentResetField": { + "description": "Detail payload for `i_r_field`.", + "properties": { + "field_name": { + "description": "Name of the custom field that was updated.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "to": { + "description": "New value of the custom field. Type depends on the field definition." } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumIssueUpdateRequest" - }, - "example": { - "issue_id": "NHEacQHi2DhXqobr9qPQz9", - "status": "resolved" - } - } - } - } - } - }, - "/rum/application/infos": { - "post": { - "operationId": "rum-application-read-infos", - "summary": "Batch get applications", - "description": "Retrieve details for multiple RUM applications by their IDs in one request.", - "tags": [ - "RUM/Applications" + "required": [ + "field_name" ], - "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- Maximum 200 IDs per request.", - "href": "/en/api-reference/rum/applications/rum-application-read-infos", - "metadata": { - "sidebarTitle": "Batch get applications" + "title": "i_r_field", + "type": "object" + }, + "FeedDetailIncidentResetImpact": { + "additionalProperties": false, + "description": "Detail payload for `i_r_impact`. No fields.", + "properties": {}, + "title": "i_r_impact", + "type": "object" + }, + "FeedDetailIncidentResetResolution": { + "additionalProperties": false, + "description": "Detail payload for `i_r_rsltn`. No fields.", + "properties": {}, + "title": "i_r_rsltn", + "type": "object" + }, + "FeedDetailIncidentResetRootCause": { + "additionalProperties": false, + "description": "Detail payload for `i_r_rc`. No fields.", + "properties": {}, + "title": "i_r_rc", + "type": "object" + }, + "FeedDetailIncidentResetSeverity": { + "description": "Detail payload for `i_r_severity`.", + "properties": { + "from": { + "$ref": "#/components/schemas/FeedSeverity" + }, + "to": { + "$ref": "#/components/schemas/FeedSeverity" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumApplicationInfosResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "application_id": "eWbr4xk3ZRnLabRa6unqwD", - "application_name": "Flashduty DEV", - "type": "browser", - "client_token": "ce8d1be90fc6534f89ce36ebf526765e131", - "team_id": 2477033058131, - "is_private": false, - "no_ip": false, - "no_geo": false, - "alerting": { - "enabled": true, - "channel_ids": [ - 5962711836131, - 5967875767131 - ], - "integration_id": 4759595678131 - }, - "tracing": { - "enabled": true, - "open_type": "popup", - "endpoint": "https://www.tracing.com/${trace_id}" - }, - "status": "enabled", - "created_by": 2476444212131, - "updated_by": 3122470302131, - "created_at": 1742958482000, - "updated_at": 1772096392711, - "links": { - "enabled": false, - "systems": [] - } - }, - { - "account_id": 2451002751131, - "application_id": "WoyQQ3BohkdtPivubEvE8o", - "application_name": "flashcat-rum", - "type": "browser", - "client_token": "a3cea433a8685a398cdfd68f54a45e06131", - "team_id": 2477033058131, - "is_private": true, - "no_ip": true, - "no_geo": false, - "alerting": { - "enabled": true, - "channel_ids": [ - 2490121812131 - ], - "integration_id": 4759595678131 - }, - "tracing": { - "enabled": false, - "open_type": "", - "endpoint": "" - }, - "status": "enabled", - "created_by": 4441703362131, - "updated_by": 3790925372131, - "created_at": 1746673831462, - "updated_at": 1773398630657, - "links": { - "enabled": true, - "systems": [ - { - "id": "s3-crash-logs", - "name": "S3 Crash Logs", - "icon_text": "S3", - "icon_color": "#0F766E", - "url": "https://s3.example.com/logs?app=${application_id}&trace=${trace_id}", - "event_types": [ - "crash", - "error" - ], - "enabled": true - } - ] - } - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "title": "i_r_severity", + "type": "object" + }, + "FeedDetailIncidentResetTitle": { + "description": "Detail payload for `i_r_title`.", + "properties": { + "from": { + "description": "Previous title.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "to": { + "description": "New title.", + "type": "string" + } + }, + "title": "i_r_title", + "type": "object" + }, + "FeedDetailIncidentResolve": { + "description": "Detail payload for `i_rslv`.", + "properties": { + "comment": { + "description": "Form summary recorded as a timeline comment on resolution. Omitted when no resolve form summary was submitted.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "from": { + "description": "Source that triggered the resolve.\n| Value | Meaning |\n|---|---|\n| `voice` | Phone-call (voice DTMF) action. |\n| `console` | Console (Web UI) action. |\n| `card` | IM notification card button (DingTalk/Feishu/Slack/Teams). |\n| `wcard` | WeCom notification card button. |\n| `event` | Event-driven: auto-close when all related alerts recover to Ok, or a close synced from an external ITSM system. |\n| `autorslv` | Auto-resolve: closed by the system after no new alerts within the channel's auto-resolve timeout. |\n| `autorefresh` | Card auto-refresh (reserved; never appears on resolve feeds). |\n| `escalation` | Escalation flow (reserved; never appears on resolve feeds). |", + "enum": [ + "voice", + "console", + "card", + "wcard", + "event", + "autorslv", + "autorefresh", + "escalation" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "images": { + "description": "Images from the resolve form, recorded on the timeline entry only. Omitted when none were submitted.", + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumApplicationInfosRequest" - }, - "example": { - "application_ids": [ - "eWbr4xk3ZRnLabRa6unqwD", - "WoyQQ3BohkdtPivubEvE8o" - ] - } - } - } - } - } - }, - "/rum/field/list": { - "post": { - "operationId": "rum-read-field-list", - "summary": "List RUM fields", - "description": "Return RUM field definitions, optionally filtered by scope and facet status.", - "tags": [ - "RUM/Facets" + "required": [ + "from" ], - "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- This is the current field-model route for discovering RUM fields.\n- Use returned `field_key` values in RUM data queries and facet-count requests.\n- Set `is_facet: true` to return only fields that support value distribution queries.", - "href": "/en/api-reference/rum/facets/rum-read-field-list", - "metadata": { - "sidebarTitle": "List RUM fields" + "title": "i_rslv", + "type": "object" + }, + "FeedDetailIncidentSnooze": { + "description": "Detail payload for `i_snooze`.", + "properties": { + "minutes": { + "description": "Snooze duration in minutes.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumFieldListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 0, - "field_key": "error.type", - "field_name": "Error type", - "group": "Error", - "description": "The type of the error.", - "value_type": "string", - "show_type": "list", - "unit_family": "", - "unit_name": "", - "edit_able": false, - "is_facet": true, - "enum_values": [], - "scopes": [ - "error" - ], - "status": "active", - "queryable": true - } - ] - } - } - } - } + "title": "i_snooze", + "type": "object" + }, + "FeedDetailIncidentStorm": { + "description": "Detail payload for `i_storm`.", + "properties": { + "threshold": { + "description": "Storm threshold that was reached.", + "type": "integer" + } + }, + "title": "i_storm", + "type": "object" + }, + "FeedDetailIncidentUnack": { + "description": "Detail payload for `i_unack`.", + "properties": { + "progress": { + "description": "Progress note entered when acknowledgement was removed.", + "type": "string" + } + }, + "title": "i_unack", + "type": "object" + }, + "FeedDetailIncidentWake": { + "description": "Detail payload for `i_wake`.", + "properties": { + "snoozedBefore": { + "description": "Unix timestamp at which the prior snooze was scheduled to end.", + "format": "int64", + "type": "integer" + } + }, + "title": "i_wake", + "type": "object" + }, + "FeedDetailIncidentWarRoomCreate": { + "description": "Detail payload for `i_wr_create`.", + "properties": { + "chat_id": { + "description": "Chat group identifier.", + "type": "string" + }, + "chat_name": { + "description": "Chat group display name.", + "type": "string" + }, + "integration_id": { + "description": "Integration ID that hosts the war room chat group.", + "format": "int64", + "type": "integer" + }, + "integration_name": { + "description": "Integration display name.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "plugin_type": { + "description": "Chat integration plugin type.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "share_link": { + "description": "Shareable join link for the war room.", + "type": "string" + } + }, + "title": "i_wr_create", + "type": "object" + }, + "FeedDetailIncidentWarRoomDelete": { + "description": "Detail payload for `i_wr_delete`.", + "properties": { + "chat_id": { + "description": "Chat group identifier.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "chat_name": { + "description": "Chat group display name.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "integration_id": { + "description": "Integration ID that hosted the war room chat group.", + "format": "int64", + "type": "integer" + }, + "integration_name": { + "description": "Integration display name.", + "type": "string" + }, + "plugin_type": { + "description": "Chat integration plugin type.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumFieldListRequest" - }, - "example": { - "scopes": [ - "error" - ], - "is_facet": false - } - } + "title": "i_wr_delete", + "type": "object" + }, + "FeedDetailWorkItemAssigneesChanged": { + "description": "Detail payload for `i_wi_assignees`.", + "properties": { + "added_assignee_ids": { + "description": "Member IDs added as assignees.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "assignee_ids": { + "description": "Assignee member IDs after the change.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "item_type": { + "description": "Work item type. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "removed_assignee_ids": { + "description": "Member IDs removed from assignees.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "title": { + "description": "Work item title.", + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } - } - } - }, - "/rum/application/info": { - "post": { - "operationId": "rum-application-read-info", - "summary": "Get application detail", - "description": "Retrieve full details of a single RUM application by `application_id`.", - "tags": [ - "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 |", - "href": "/en/api-reference/rum/applications/rum-application-read-info", - "metadata": { - "sidebarTitle": "Get application detail" + }, + "title": "i_wi_assignees", + "type": "object" + }, + "FeedDetailWorkItemBound": { + "description": "Detail payload for `i_wi_bound`.", + "properties": { + "item_type": { + "description": "Work item type. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "post_mortem_id": { + "description": "ID of the post-mortem the work item is bound to.", + "type": "string" + }, + "title": { + "description": "Work item title.", + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumApplicationItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 2451002751131, - "application_id": "WoyQQ3BohkdtPivubEvE8o", - "application_name": "flashcat-rum", - "type": "browser", - "client_token": "a3cea433a8685a398cdfd68f54a45e06131", - "team_id": 2477033058131, - "is_private": true, - "no_ip": true, - "no_geo": false, - "alerting": { - "enabled": true, - "channel_ids": [ - 2490121812131 - ], - "integration_id": 4759595678131 - }, - "tracing": { - "enabled": false, - "open_type": "", - "endpoint": "" - }, - "status": "enabled", - "created_by": 4441703362131, - "updated_by": 3790925372131, - "created_at": 1746673831462, - "updated_at": 1773398630657, - "links": { - "enabled": true, - "systems": [ - { - "id": "s3-crash-logs", - "name": "S3 Crash Logs", - "icon_text": "S3", - "icon_color": "#0F766E", - "url": "https://s3.example.com/logs?app=${application_id}&trace=${trace_id}", - "event_types": [ - "crash", - "error" - ], - "enabled": true - } - ] - } - } - } - } - } + "title": "i_wi_bound", + "type": "object" + }, + "FeedDetailWorkItemCompleted": { + "description": "Detail payload for `i_wi_completed`.", + "properties": { + "from_status": { + "description": "Status label before completion.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "item_type": { + "description": "Work item type. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "post_mortem_id": { + "description": "ID of the post-mortem the work item is bound to.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "title": { + "description": "Work item title.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "to_status": { + "description": "Status label after completion.", + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumApplicationIDRequest" - }, - "example": { - "application_id": "WoyQQ3BohkdtPivubEvE8o" - } - } - } - } - } - }, - "/rum/application/delete": { - "post": { - "operationId": "rum-application-write-delete", - "summary": "Delete application", - "description": "Delete a RUM application by `application_id`.", - "tags": [ - "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 | **Applications Manage** (`rum`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/rum/applications/rum-application-write-delete", - "metadata": { - "sidebarTitle": "Delete application" + "title": "i_wi_completed", + "type": "object" + }, + "FeedDetailWorkItemConverted": { + "description": "Detail payload for `i_wi_converted`.", + "properties": { + "from_type": { + "description": "Work item type before the conversion. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem. Conversion currently only supports `action` → `follow_up`, so `from_type` is always `action` in this event.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "post_mortem_id": { + "description": "ID of the post-mortem the work item is bound to.", + "type": "string" + }, + "status": { + "description": "Work item status label after the conversion.", + "type": "string" + }, + "title": { + "description": "Work item title.", + "type": "string" + }, + "to_type": { + "description": "Work item type after the conversion. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem. Conversion currently only supports `action` → `follow_up`, so `to_type` is always `follow_up` in this event, and a successful conversion immediately tries to bind the incident's post-mortem.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "title": "i_wi_converted", + "type": "object" + }, + "FeedDetailWorkItemCreated": { + "description": "Detail payload for `i_wi_created`.", + "properties": { + "assignee_ids": { + "description": "Assignee member IDs.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "item_type": { + "description": "Work item type. `action`: an action item anchored to the incident itself, convertible to `follow_up` later; `follow_up`: an improvement item anchored to a post-mortem, requiring the incident to be linked to that post-mortem at creation.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "post_mortem_id": { + "description": "ID of the post-mortem the work item is bound to.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "status": { + "description": "Work item status label (e.g. `open`, `done`).", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "Work item title.", + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumApplicationIDRequest" - }, - "example": { - "application_id": "qLpu24Dz4CAzWsESPbJYWA" - } - } + "title": "i_wi_created", + "type": "object" + }, + "FeedDetailWorkItemDeleted": { + "description": "Detail payload for `i_wi_deleted`.", + "properties": { + "item_type": { + "description": "Work item type. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "post_mortem_id": { + "description": "ID of the post-mortem the work item is bound to.", + "type": "string" + }, + "title": { + "description": "Work item title.", + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } - } - } - }, - "/rum/application/create": { - "post": { - "operationId": "rum-application-write-create", - "summary": "Create application", - "description": "Create a new RUM application. Returns the generated `application_id` and `client_token`.", - "tags": [ - "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 | **Applications Manage** (`rum`) |\n\n## Usage\n\n- `type` must be one of: `browser`, `ios`, `android`, `react-native`, `flutter`, `kotlin-multiplatform`, `roku`, `unity`, `miniprogram`, `harmony`, `electron`.\n- `links.systems[].url` must start with `http` or `https`; `${var}` tokens are resolved from RUM event context.\n- `links.systems[].event_types` accepts: `crash`, `error`, `view`, `action`, `resource`, `session`, `all`.\n- `client_token` is auto-generated and used to initialize the RUM SDK.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/rum/applications/rum-application-write-create", - "metadata": { - "sidebarTitle": "Create application" + }, + "title": "i_wi_deleted", + "type": "object" + }, + "FeedDetailWorkItemUpdated": { + "description": "Detail payload for `i_wi_updated`. Only the fields that changed carry `from_*`/`to_*` values.", + "properties": { + "from_description": { + "description": "Description before the update.", + "type": "string" + }, + "from_priority": { + "description": "Priority label before the update.", + "type": "string" + }, + "from_status": { + "description": "Status label before the update.", + "type": "string" + }, + "from_title": { + "description": "Title before the update.", + "type": "string" + }, + "item_type": { + "description": "Work item type. `action`: an action item anchored to the incident itself; `follow_up`: an improvement item anchored to a post-mortem.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "title": { + "description": "Work item title.", + "type": "string" + }, + "to_description": { + "description": "Description after the update.", + "type": "string" + }, + "to_priority": { + "description": "Priority label after the update.", + "type": "string" + }, + "to_status": { + "description": "Status label after the update.", + "type": "string" + }, + "work_item_id": { + "description": "Work item ID.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumApplicationCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "application_id": "qLpu24Dz4CAzWsESPbJYWA", - "application_name": "My Web App", - "client_token": "e090078724855a4ca168c3884880dfbc131" - } - } - } - } + "title": "i_wi_updated", + "type": "object" + }, + "FeedItem": { + "description": "A single alert activity feed entry. The `detail` field is discriminated by `type`; see the per-type `FeedDetailAlert*` schemas.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "created_at": { + "description": "Creation timestamp in Unix epoch milliseconds.", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "Member ID of the creator. 0 for system-generated entries.", + "format": "int64", + "type": "integer" + }, + "deleted_at": { + "description": "Soft-delete time, Unix epoch milliseconds. Omitted when not deleted.", + "format": "int64", + "type": "integer" + }, + "detail": { + "description": "Type-specific payload; the concrete shape is determined by `type`. May be `null` for entries stored without detail.", + "discriminator": { + "mapping": { + "a_ack": "#/components/schemas/FeedDetailAlertAck", + "a_close": "#/components/schemas/FeedDetailAlertClose", + "a_comm": "#/components/schemas/FeedDetailAlertComment", + "a_m_flapping": "#/components/schemas/FeedDetailAlertMuteByFlapping", + "a_m_inhibit": "#/components/schemas/FeedDetailAlertMuteByInhibit", + "a_m_silence": "#/components/schemas/FeedDetailAlertMuteBySilence", + "a_merge": "#/components/schemas/FeedDetailAlertMerge", + "a_new": "#/components/schemas/FeedDetailAlertTrigger", + "a_unack": "#/components/schemas/FeedDetailAlertUnack", + "a_update": "#/components/schemas/FeedDetailAlertUpdate" + }, + "propertyName": "type" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/FeedDetailAlertTrigger" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertUpdate" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertComment" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertMerge" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertMuteBySilence" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertMuteByInhibit" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertMuteByFlapping" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertAck" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertUnack" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertClose" + } + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "ref_id": { + "description": "ObjectID of the alert this entry references.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "type": { + "$ref": "#/components/schemas/AlertFeedType" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_at": { + "description": "Last update timestamp in Unix epoch milliseconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumApplicationCreateRequest" - }, - "example": { - "application_name": "My Web App", - "type": "browser", - "team_id": 2477033058131, - "is_private": false, - "links": { - "enabled": true, - "systems": [ - { - "id": "s3-crash-logs", - "name": "S3 Crash Logs", - "icon_text": "S3", - "icon_color": "#0F766E", - "url": "https://s3.example.com/logs?app=${application_id}&trace=${trace_id}", - "event_types": [ - "crash", - "error" - ], - "enabled": true - } - ] - } - } - } - } - } - } - }, - "/rum/application/update": { - "post": { - "operationId": "rum-application-write-update", - "summary": "Update application", - "description": "Update an existing RUM application. All fields except `application_id` are optional — only provided fields are updated.", - "tags": [ - "RUM/Applications" + "required": [ + "ref_id", + "type", + "detail", + "account_id", + "creator_id", + "created_at", + "updated_at" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Applications Manage** (`rum`) |\n\n## Usage\n\n- `links.systems[].url` must start with `http` or `https`; `${var}` tokens are resolved from RUM event context.\n- `links.systems[].event_types` accepts: `crash`, `error`, `view`, `action`, `resource`, `session`, `all`.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/rum/applications/rum-application-write-update", - "metadata": { - "sidebarTitle": "Update application" + "type": "object" + }, + "FeedSeverity": { + "description": "Severity level.", + "enum": [ + "Ok", + "Critical", + "Warning", + "Info" + ], + "type": "string" + }, + "FieldDeleteReference": { + "description": "Custom form that still references the field.", + "properties": { + "href": { + "description": "Console URL for the referencing custom form.", + "type": "string" + }, + "kind": { + "const": "custom_form", + "description": "Referenced resource kind. Always `custom_form` for this response.", + "type": "string" + }, + "name": { + "description": "Human label of the referencing custom form's type (a Chinese label, e.g. `解决故障` for the resolve form).", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] + "required": [ + "kind", + "name", + "href" + ], + "type": "object" + }, + "FieldDeleteReferenceError": { + "description": "Error response returned when a custom form still references the field.", + "properties": { + "data": { + "description": "Supplementary error payload; for this error it always contains the `refs` field.", + "properties": { + "refs": { + "description": "Custom forms that still reference the field, each with `kind`/`name`/`href`; all references must be removed before the field can be deleted.", + "items": { + "$ref": "#/components/schemas/FieldDeleteReference" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } + "type": "array" } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + }, + "required": [ + "refs" + ], + "type": "object" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "error": { + "$ref": "#/components/schemas/DutyError" }, - "500": { - "$ref": "#/components/responses/ServerError" + "request_id": { + "description": "Trace ID of this request, identical to the `Flashcat-Request-Id` response header.", + "example": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumApplicationUpdateRequest" - }, - "example": { - "application_id": "WoyQQ3BohkdtPivubEvE8o", - "application_name": "My Web App v2", - "alerting": { - "enabled": true, - "channel_ids": [ - 2490121812131 - ] - }, - "links": { - "enabled": true, - "systems": [ - { - "id": "s3-crash-logs", - "name": "S3 Crash Logs", - "icon_text": "S3", - "icon_color": "#0F766E", - "url": "https://s3.example.com/logs?app=${application_id}&trace=${trace_id}", - "event_types": [ - "crash", - "error" - ], - "enabled": true - } - ] - } - } - } - } - } - } - }, - "/sourcemap/list": { - "post": { - "operationId": "sourcemap-read-list", - "summary": "List sourcemaps", - "description": "Return a paginated list of uploaded sourcemap files filtered by platform type, service, and version.", - "tags": [ - "RUM/Sourcemaps" + "required": [ + "request_id", + "error", + "data" ], - "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- `start_time` and `end_time` are required — both use Unix epoch **milliseconds**. Maximum window is 365 days.\n- The `type` field selects the platform: `browser` (JavaScript), `android`, or `ios`. Defaults to `browser` when omitted.\n- Default page size is 20; maximum is 100. Default sort is `created_at` descending.\n- For Android, `build_id` matches the Gradle plugin build identifier. For iOS, `uuid` matches the dSYM bundle UUID.", - "href": "/en/api-reference/rum/sourcemaps/sourcemap-read-list", - "metadata": { - "sidebarTitle": "List sourcemaps" + "type": "object" + }, + "FieldInfoRequest": { + "properties": { + "field_id": { + "description": "Field ID — 24-character hex ObjectID.", + "pattern": "^[a-f0-9]{24}$", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SourcemapListResponse" - } - } - } - ] + "required": [ + "field_id" + ], + "type": "object" + }, + "FieldItem": { + "description": "Incident custom field configuration.", + "properties": { + "account_id": { + "description": "Owning account ID.", + "format": "int64", + "type": "integer" + }, + "created_at": { + "description": "Creation timestamp, Unix seconds.", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "Creator member ID.", + "format": "int64", + "type": "integer" + }, + "default_value": { + "description": "Default value. Type depends on `field_type`: `bool` for checkbox; `string` for single_select/text; `string[]` for multi_select; may be `null` if no default.", + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string" + }, + { + "items": { + "type": "string" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 3, - "items": [ - { - "key": "browser/my-web-app/1.0.0/main.js.map", - "type": "browser", - "service": "my-web-app", - "version": "1.0.0", - "size": 204800, - "git_repository_url": "https://github.com/example/my-web-app", - "git_commit_sha": "abc1234def5678", - "created_at": 1712700000, - "updated_at": 1712700000, - "metadata": {} - } - ] - } - } + "type": "array" + }, + { + "type": "null" } - } + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "deleted_at": { + "description": "Deletion timestamp, Unix seconds. Only present for soft-deleted fields.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Optional free-text description.", + "maxLength": 499, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "display_name": { + "description": "Human-readable name shown in the UI.", + "maxLength": 39, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "field_id": { + "description": "Field ID — 24-character hex ObjectID.", + "pattern": "^[a-f0-9]{24}$", + "type": "string" + }, + "field_name": { + "description": "Machine name used in incident payloads under `fields.`. Immutable.", + "maxLength": 39, + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]{0,39}$", + "type": "string" + }, + "field_type": { + "description": "Field type.\n| Value | Meaning |\n|---|---|\n| `checkbox` | Checkbox; value is a bool, options are not supported. |\n| `multi_select` | Multi-select; value is a string array, each element must be one of options. |\n| `single_select` | Single-select; value is a string from options. |\n| `text` | Free text; value is a string. |", + "enum": [ + "checkbox", + "multi_select", + "single_select", + "text" + ], + "type": "string" + }, + "options": { + "description": "Allowed choices for `single_select`/`multi_select` (non-empty unique string array). `null` or empty for `checkbox`/`text`.", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "status": { + "description": "Field status: `enabled` (active), `disabled` (set only via internal helpers, not via the API), or `deleted` (soft-deleted). `/field/list` excludes `deleted`; `/field/info` may return it.", + "enum": [ + "enabled", + "disabled", + "deleted" + ], + "type": "string" + }, + "updated_at": { + "description": "Last update timestamp, Unix seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Last updater member ID.", + "format": "int64", + "type": "integer" + }, + "value_type": { + "description": "Value type. `checkbox` is always `bool`; `single_select`/`multi_select`/`text` are always `string`. `float` is reserved and never occurs today.", + "enum": [ + "string", + "bool", + "float" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SourcemapListRequest" - }, - "example": { - "start_time": 1712000000000, - "end_time": 1712700000000, - "type": "browser", - "services": [ - "my-web-app" - ], - "p": 1, - "limit": 20 - } - } - } - } - } - }, - "/member/info": { - "post": { - "operationId": "memberInfo", - "summary": "Get current member info", - "description": "Return the profile of the member the credential belongs to. Requires a member-scoped credential — calls authenticated as the account principal (e.g. an account-level app key) are rejected with a 400.", - "tags": [ - "Platform/Members" + "required": [ + "account_id", + "field_id", + "field_name", + "display_name", + "field_type", + "value_type", + "status", + "creator_id", + "updated_by", + "created_at", + "updated_at", + "description", + "options", + "default_value" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — but the credential must belong to a member; account-principal credentials (e.g. an account-level app key) are rejected with a 400 |", - "href": "/en/api-reference/platform/members/member-info", - "metadata": { - "sidebarTitle": "Get current member info" + "type": "object" + }, + "FieldListRequest": { + "properties": { + "asc": { + "description": "Sort ascending when `true`; descending otherwise.", + "type": "boolean" + }, + "creator_id": { + "description": "Filter by creator member ID. Omit or send `null` to skip.", + "format": "int64", + "type": [ + "integer", + "null" + ] + }, + "orderby": { + "description": "Sort key. Defaults to `created_at` when omitted.", + "enum": [ + "created_at", + "updated_at" + ], + "type": "string" + }, + "query": { + "description": "Regex filter matched against `field_name` only. An invalid regex is auto-escaped to a literal substring match.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberInfoResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_avatar": "", - "account_email": "alice@example.com", - "account_id": 2451002751131, - "account_locale": "en-US", - "account_name": "Acme Corp", - "account_role_ids": [ - 6 - ], - "account_time_zone": "Asia/Shanghai", - "avatar": "/image/avatar1.png", - "country_code": "CN", - "created_at": 1701399971, - "domain": "acme", - "email": "alice@example.com", - "email_verified": true, - "is_external": false, - "locale": "zh-CN", - "member_id": 2476444212131, - "member_name": "Alice", - "phone": "+86185****0300", - "phone_verified": true, - "time_zone": "Asia/Shanghai" - } - } - } - } + "type": "object" + }, + "FieldListResponse": { + "properties": { + "items": { + "description": "All non-deleted custom fields for the account. No pagination.", + "items": { + "$ref": "#/components/schemas/FieldItem" + }, + "type": "array" + } + }, + "required": [ + "items" + ], + "type": "object" + }, + "FilterCondition": { + "properties": { + "key": { + "description": "Field name to filter on. Use plain names for built-in alert fields (e.g. `alert_severity`, `alert_key`, `check`, `resource`, `service`, `cluster`) or the `labels.` prefix for custom alert labels (e.g. `labels.env`, `labels.region`).", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "oper": { + "description": "Filter operator. `IN` — value must match one of `vals`; `NOTIN` — value must not match any of `vals`. Supports regex patterns wrapped in `/pattern/`.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "List of values to match against. Each entry is a plain string or a `/regex/` pattern.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "oper", + "vals" + ], + "type": "object" + }, + "FilterGroup": { + "$ref": "#/components/schemas/OrFilterGroup" + }, + "Flapping": { + "description": "Flapping detection configuration.", + "properties": { + "in_mins": { + "description": "Observation window in minutes.", + "maximum": 1440, + "minimum": 1, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "is_disabled": { + "description": "Disable flapping detection.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "max_changes": { + "description": "Max state changes allowed within `in_mins`.", + "maximum": 100, + "minimum": 2, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "mute_mins": { + "description": "Mute duration in minutes after flapping is detected.", + "maximum": 1440, + "minimum": 0, + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberInfoRequest" - }, - "example": {} - } - } - } - } - }, - "/member/list": { - "post": { - "operationId": "memberList", - "summary": "List members", - "description": "Return a paginated list of organization members.", - "tags": [ - "Platform/Members" - ], - "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 |", - "href": "/en/api-reference/platform/members/member-list", - "metadata": { - "sidebarTitle": "List members" + "type": "object" + }, + "GetRemoteConfigRequest": { + "description": "Get remote config request", + "properties": { + "application_id": { + "description": "RUM application ID.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "p": 1, - "limit": 5, - "total": 148, - "items": [ - { - "account_id": 2451002751131, - "member_id": 5068740052131, - "member_name": "Bob", - "country_code": "", - "phone": "+86151****6519", - "email": "bob@example.com", - "phone_verified": true, - "email_verified": true, - "avatar": "", - "status": "enabled", - "account_role_ids": [ - 2, - 6 - ], - "created_at": 1752030749, - "updated_at": 1775962064, - "ref_id": "", - "is_external": false - }, - { - "account_id": 2451002751131, - "member_id": 2476444212131, - "member_name": "Alice", - "country_code": "CN", - "phone": "+86185****0300", - "email": "alice@example.com", - "phone_verified": true, - "email_verified": true, - "avatar": "/image/avatar1.png", - "status": "enabled", - "account_role_ids": [ - 6 - ], - "created_at": 1701399971, - "updated_at": 1775809507, - "ref_id": "", - "is_external": false - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "required": [ + "application_id" + ], + "type": "object" + }, + "GetRemoteConfigResponse": { + "description": "Live remote configuration and its version.", + "properties": { + "config": { + "$ref": "#/components/schemas/RemoteConfig" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "updated_at": { + "description": "Unix timestamp in milliseconds - when the current version was published. 0 when never configured.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "version": { + "description": "Version the live configuration is stored under. 0 means the application has never been configured.", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberListRequest" - }, - "example": { - "p": 1, - "limit": 5 - } - } + "type": "object" + }, + "GetWarRoomDefaultObserversRequest": { + "properties": { + "incident_id": { + "description": "Incident ID, a MongoDB ObjectID hex string.", + "type": "string" } - } - } - }, - "/member/delete": { - "post": { - "operationId": "memberDelete", - "summary": "Delete member", - "description": "Remove a member from the organization by ID, email, phone, or name.", - "tags": [ - "Platform/Members" + }, + "required": [ + "incident_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Members Manage** (`organization`) |\n\n## Usage\n\n- By default (`is_force=false`), the system checks whether the member is referenced by other resources (e.g., escalation rules, schedules). If references exist, the API returns error code `ReferenceExist` with the reference list in `data.refs`. Set `is_force=true` to skip the reference check and force delete.\n- Members provisioned via SSO with `sso_user_non_editable=true` cannot be deleted through this API. Disable that SSO restriction first.\n- This operation is recorded in the audit log.", - "href": "/en/api-reference/platform/members/member-delete", - "metadata": { - "sidebarTitle": "Delete member" + "type": "object" + }, + "GetWarRoomDefaultObserversResponse": { + "properties": { + "observers": { + "description": "Historical responders suggested as default war-room observers.", + "items": { + "$ref": "#/components/schemas/WarRoomPersonItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "type": "object" + }, + "GetWarRoomDetailRequest": { + "description": "Parameters for retrieving a war room's live detail.", + "properties": { + "chat_id": { + "description": "Chat ID of the IM group hosting the war room; obtain it from `POST /incident/war-room/list`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "integration_id": { + "description": "IM integration ID that hosts the war room.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberDeleteRequest" - }, - "example": { - "member_id": 5068740052131 - } - } - } - } - } - }, - "/member/invite": { - "post": { - "operationId": "memberInvite", - "summary": "Invite members", - "description": "Batch invite new members to the organization by email or phone.", - "tags": [ - "Platform/Members" + "required": [ + "integration_id", + "chat_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Members Manage** (`organization`) |\n\n## Usage\n\n- `country_code` must be an ISO 3166-1 alpha-2 region code (e.g. \"CN\"). It is validated and normalized to upper case before storage; invalid values are rejected with a 400.\n- When a member's `phone` has no \"+\" prefix, it is parsed with that member's `country_code` as the region hint (defaults to \"CN\" when omitted).", - "href": "/en/api-reference/platform/members/member-invite", - "metadata": { - "sidebarTitle": "Invite members" + "type": "object" + }, + "GetWebhookHistoryDetailRequest": { + "description": "Lookup parameters for a single webhook delivery record.", + "properties": { + "event_id": { + "description": "Event ID returned by `ListWebhookHistory`.", + "type": "string" + }, + "integration_id": { + "description": "Integration ID the event belongs to; available in the items returned by `POST /webhook/history/list`.", + "format": "int64", + "minimum": 1, + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberInviteResponse" - } - } - } - ] + "required": [ + "event_id", + "integration_id" + ], + "type": "object" + }, + "Group": { + "description": "Alert grouping configuration.", + "properties": { + "all_equals_required": { + "description": "When true, all listed keys must be present for grouping.", + "type": "boolean" + }, + "cases": { + "description": "Per-filter grouping overrides.", + "items": { + "description": "Conditional grouping override: stored alerts matching `if` are grouped by `equals` instead of the top-level grouping keys.", + "properties": { + "equals": { + "description": "Grouping keys for matching alerts. Supported values: `title`, `description`, `severity`, or any `labels.`.", + "items": { + "type": "string" + }, + "maxItems": 5, + "minItems": 1, + "type": "array" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "member_id": 5068740052131, - "member_name": "Charlie" - }, - { - "member_id": 5068740052132, - "member_name": "Dave" - } - ] - } + "if": { + "description": "AND-ed match conditions evaluated against stored alert fields.", + "items": { + "$ref": "#/components/schemas/FilterCondition" + }, + "type": "array" } - } - } + }, + "required": [ + "if", + "equals" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "equals": { + "description": "Groups of label keys whose equality defines a bucket.", + "items": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxItems": 5, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "i_keys": { + "description": "Label keys used for intelligent grouping embeddings.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "i_score_threshold": { + "description": "Intelligent grouping similarity threshold.", + "format": "float", + "maximum": 1, + "minimum": 0.5, + "type": "number" }, - "500": { - "$ref": "#/components/responses/ServerError" + "method": { + "description": "Grouping method: `i` intelligent, `p` pattern, `n` none.", + "enum": [ + "i", + "p", + "n" + ], + "type": "string" + }, + "storm_threshold": { + "description": "Alert storm threshold.", + "maximum": 10000, + "minimum": 0, + "type": "integer" + }, + "storm_thresholds": { + "description": "Multi-level storm thresholds.", + "items": { + "type": "integer" + }, + "maxItems": 5, + "type": "array" + }, + "time_window": { + "description": "Grouping time window in minutes. Default max is 1440 minutes (24 h); extended accounts may allow up to 43200 minutes (30 days).", + "minimum": 0, + "type": "integer" + }, + "window_type": { + "description": "Window type, default `tumbling`. `tumbling` is a fixed window counted from incident creation — once it expires, new alerts open a new incident; `sliding` is a sliding window counted from the incident's most recent alert, extended each time a new alert merges in.", + "enum": [ + "tumbling", + "sliding" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberInviteRequest" - }, - "example": { - "members": [ - { - "member_name": "Charlie", - "email": "charlie@example.com", - "locale": "en-US", - "time_zone": "Asia/Shanghai", - "role_ids": [ - 6 - ] - }, - { - "member_name": "Dave", - "phone": "13800138000", - "country_code": "CN", - "locale": "zh-CN", - "time_zone": "Asia/Shanghai" - } - ] - } - } + "required": [ + "method" + ], + "type": "object" + }, + "IDRequest": { + "description": "Request with a single numeric ID.", + "properties": { + "id": { + "description": "Numeric ID of the target resource; the exact meaning depends on the API being called (e.g. datasource ID, ruleset ID).", + "format": "uint64", + "type": "integer" } - } - } - }, - "/member/role/grant": { - "post": { - "operationId": "memberGrantRole", - "summary": "Grant role to member", - "description": "Add role assignments to a member. Role IDs that do not exist are silently ignored; if none resolve, the call is a no-op success.", - "tags": [ - "Platform/Members" + }, + "required": [ + "id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Members Manage** (`organization`) |", - "href": "/en/api-reference/platform/members/member-grant-role", - "metadata": { - "sidebarTitle": "Grant role to member" + "type": "object" + }, + "Image": { + "description": "Image or attachment reference.", + "properties": { + "alt": { + "description": "Alt text.", + "type": "string" + }, + "href": { + "description": "Optional link the image points to.", + "type": "string" + }, + "src": { + "description": "Image source. Either an `img_` upload token or an `http(s)` URL.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "src" + ], + "type": "object" + }, + "ImportStatusPageSubscriberItem": { + "description": "A single subscriber to import.", + "properties": { + "all": { + "description": "When true, the subscriber receives notifications for all components. Must be true when `component_ids` and `change_ids` are both empty.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "change_ids": { + "description": "Specific event IDs the subscriber should receive notifications for.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "component_ids": { + "description": "Component IDs the subscriber should receive notifications for.", + "items": { + "type": "string" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "locale": { + "description": "Preferred locale for notifications. Defaults to the request locale when omitted.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "recipient": { + "description": "Email address (for public pages) or user ID (for internal pages).", + "maxLength": 255, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberRoleGrantRequest" - }, - "example": { - "member_id": 5068740052131, - "role_ids": [ - 6 - ] - } - } - } - } - } - }, - "/member/role/revoke": { - "post": { - "operationId": "memberRevokeRole", - "summary": "Revoke role from member", - "description": "Remove role assignments from a member. Role IDs that do not exist are silently ignored; if none resolve, the call is a no-op success.", - "tags": [ - "Platform/Members" + "required": [ + "recipient" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Members Manage** (`organization`) |", - "href": "/en/api-reference/platform/members/member-revoke-role", - "metadata": { - "sidebarTitle": "Revoke role from member" + "type": "object" + }, + "ImportStatusPageSubscribersRequest": { + "description": "Parameters for bulk-importing subscribers. Each subscriber must have a non-empty `recipient` (≤255 chars) and subscribe to at least one component, change, or set `all: true`.", + "properties": { + "method": { + "description": "Subscription method. `email` is only valid for public pages; `im` is only valid for internal pages.", + "enum": [ + "email", + "im" + ], + "type": "string" + }, + "page_id": { + "description": "Target status page ID; obtain it from `GET /status-page/list`.", + "format": "int64", + "type": "integer" + }, + "subscribers": { + "description": "Subscribers to import.", + "items": { + "$ref": "#/components/schemas/ImportStatusPageSubscriberItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "page_id", + "method" + ], + "type": "object" + }, + "IncProgressCnts": { + "properties": { + "Processing": { + "description": "Count of processing incidents in the last 30 days.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "Triggered": { + "description": "Count of triggered incidents in the last 30 days.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "Triggered", + "Processing" + ], + "type": "object" + }, + "IncidentActionImage": { + "description": "Image attached to an acknowledgement or resolution timeline entry.", + "properties": { + "alt": { + "description": "Alternative text for the image.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "href": { + "description": "Optional link that the image points to.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "src": { + "description": "Image source. Accepts an `img_` upload token, an `http(s)` URL, or an object-storage key beginning with `/`.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberRoleRevokeRequest" - }, - "example": { - "member_id": 5068740052131, - "role_ids": [ - 6 - ] - } - } - } - } - } - }, - "/member/role/update": { - "post": { - "operationId": "memberUpdateRole", - "summary": "Update member roles", - "description": "Replace all role assignments for a member at once. Role IDs that do not exist are silently dropped; an empty `role_ids` resets the member to the built-in Viewer role (ID 8).", - "tags": [ - "Platform/Members" + "required": [ + "src" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Members Manage** (`organization`) |", - "href": "/en/api-reference/platform/members/member-update-role", - "metadata": { - "sidebarTitle": "Update member roles" + "type": "object" + }, + "IncidentCardHiddenFields": { + "additionalProperties": { + "description": "Incident-card field names to hide for this IM app.", + "items": { + "enum": [ + "channel", + "snoozed_before", + "severity", + "responders", + "aggregate_alert_count", + "detail", + "ai_analysis" + ], + "type": "string" + }, + "type": "array" + }, + "description": "Incident-card fields to hide, keyed by IM app type. Only supported IM app types and field names are accepted.", + "propertyNames": { + "enum": [ + "feishu_app", + "dingtalk_app", + "slack_app", + "teams_app", + "wecom_app" + ], + "type": "string" + }, + "type": "object" + }, + "IncidentCommentTypeDisplay": { + "description": "Resolved display of an account-level comment type, populated at read time from the current type definition.", + "properties": { + "color": { + "description": "Badge color in #RRGGBB format.", + "pattern": "^#[0-9A-Fa-f]{6}$", + "type": "string" + }, + "id": { + "description": "Comment type ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "name": { + "description": "Display name of the comment type.", + "maxLength": 40, + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "id", + "name", + "color" + ], + "type": "object" + }, + "IncidentCommentTypeItem": { + "description": "An account-level comment type that can be attached to incident comments.", + "properties": { + "account_id": { + "description": "Account ID that owns the comment type.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "color": { + "description": "Label color as a hex value in #RRGGBB format (stored uppercase).", + "pattern": "^#[0-9A-F]{6}$", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "comment_type_id": { + "description": "Comment type ID (24-character hex ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_at": { + "description": "Creation time as a Unix timestamp in seconds.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "creator_id": { + "description": "ID of the user who created the comment type.", + "format": "int64", + "type": "integer" + }, + "name": { + "description": "Display name of the comment type. Unique within the account (case-insensitive, trimmed).", + "maxLength": 40, + "type": "string" + }, + "position": { + "description": "1-based display position of the comment type.", + "format": "int64", + "type": "integer" + }, + "updated_at": { + "description": "Last update time as a Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "ID of the user who last updated the comment type.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberRoleUpdateRequest" - }, - "example": { - "member_id": 5068740052131, - "role_ids": [ - 2, - 6 - ] - } - } - } - } - } - }, - "/member/info/reset": { - "post": { - "operationId": "memberResetInfo", - "summary": "Reset member info", - "description": "Identify a member and reset the specified profile fields.", - "tags": [ - "Platform/Members" + "required": [ + "comment_type_id", + "account_id", + "name", + "color", + "position", + "creator_id", + "updated_by", + "created_at", + "updated_at" ], - "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- Identify the member with one of `member_id`, `member_name`, `email`, `phone`, or `ref_id`. If multiple identifiers are present, the server checks them in that order.\n- `updates.country_code` is an ISO 3166-1 alpha-2 region code (e.g. \"CN\", \"US\"). It is an independently updatable field: `updates.phone` is not required, and the new region is stored even when the phone is unchanged. An explicit empty string is rejected with a 400.\n- When `updates.phone` has no \"+\" prefix, it is parsed with `updates.country_code` as the region hint, falling back to the member's stored region and then to \"CN\". Legacy digit calling codes such as \"86\" remain accepted only as parsing hints — stored values are always ISO region codes.\n- The top-level `country_code` is only a parsing hint for the identifying `phone`; it is never stored.\n- Put the profile fields to write under `updates`: `member_name`, `password`, `phone`, `country_code`, `email`, `avatar`, `locale`, `time_zone`, or `ref_id`.\n- Members provisioned by SSO cannot be changed when SSO marks them as externally managed.\n- `updates` must carry at least one field; an object with every field omitted is rejected.", - "href": "/en/api-reference/platform/members/member-reset-info", - "metadata": { - "sidebarTitle": "Reset member info" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MemberEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "IncidentFeedItem": { + "description": "Single incident timeline entry. The `detail` field is discriminated by `type`; see the per-type `FeedDetail*` schemas.", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "created_at": { + "description": "Creation timestamp in milliseconds.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "creator_id": { + "description": "User ID of the actor. `0` means system-generated.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "deleted_at": { + "description": "Soft-delete timestamp (ms). Zero if not deleted.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemberResetInfoRequest" + "detail": { + "description": "Type-specific payload. The concrete shape is determined by `type`; `null` when the entry has no structured detail.", + "discriminator": { + "mapping": { + "a_merge": "#/components/schemas/FeedDetailAlertMerge", + "i_a_rspd": "#/components/schemas/FeedDetailIncidentAddRspd", + "i_ack": "#/components/schemas/FeedDetailIncidentAck", + "i_assign": "#/components/schemas/FeedDetailIncidentAssign", + "i_auto_refresh": "#/components/schemas/FeedDetailIncidentAutoRefreshCard", + "i_comm": "#/components/schemas/FeedDetailIncidentComment", + "i_custom": "#/components/schemas/FeedDetailIncidentCustomAction", + "i_m_flapping": "#/components/schemas/FeedDetailIncidentMuteByFlapping", + "i_m_reply": "#/components/schemas/FeedDetailIncidentMuteReply", + "i_merge": "#/components/schemas/FeedDetailIncidentMerge", + "i_new": "#/components/schemas/FeedDetailIncidentNew", + "i_notify": "#/components/schemas/FeedDetailIncidentNotify", + "i_r_desc": "#/components/schemas/FeedDetailIncidentResetDescription", + "i_r_field": "#/components/schemas/FeedDetailIncidentResetField", + "i_r_impact": "#/components/schemas/FeedDetailIncidentResetImpact", + "i_r_rc": "#/components/schemas/FeedDetailIncidentResetRootCause", + "i_r_rsltn": "#/components/schemas/FeedDetailIncidentResetResolution", + "i_r_severity": "#/components/schemas/FeedDetailIncidentResetSeverity", + "i_r_title": "#/components/schemas/FeedDetailIncidentResetTitle", + "i_reopen": "#/components/schemas/FeedDetailIncidentReopen", + "i_rslv": "#/components/schemas/FeedDetailIncidentResolve", + "i_snooze": "#/components/schemas/FeedDetailIncidentSnooze", + "i_storm": "#/components/schemas/FeedDetailIncidentStorm", + "i_unack": "#/components/schemas/FeedDetailIncidentUnack", + "i_wake": "#/components/schemas/FeedDetailIncidentWake", + "i_wi_assignees": "#/components/schemas/FeedDetailWorkItemAssigneesChanged", + "i_wi_bound": "#/components/schemas/FeedDetailWorkItemBound", + "i_wi_completed": "#/components/schemas/FeedDetailWorkItemCompleted", + "i_wi_converted": "#/components/schemas/FeedDetailWorkItemConverted", + "i_wi_created": "#/components/schemas/FeedDetailWorkItemCreated", + "i_wi_deleted": "#/components/schemas/FeedDetailWorkItemDeleted", + "i_wi_updated": "#/components/schemas/FeedDetailWorkItemUpdated", + "i_wr_create": "#/components/schemas/FeedDetailIncidentWarRoomCreate", + "i_wr_delete": "#/components/schemas/FeedDetailIncidentWarRoomDelete" + }, + "propertyName": "type" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/FeedDetailIncidentNew" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentAssign" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentAddRspd" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentNotify" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentStorm" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentSnooze" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentWake" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentAck" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentUnack" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentComment" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResolve" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentReopen" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentMerge" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetTitle" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetDescription" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetImpact" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetRootCause" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetResolution" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetSeverity" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentResetField" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentMuteByFlapping" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentMuteReply" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentCustomAction" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentWarRoomCreate" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentWarRoomDelete" + }, + { + "$ref": "#/components/schemas/FeedDetailIncidentAutoRefreshCard" + }, + { + "$ref": "#/components/schemas/FeedDetailWorkItemCreated" + }, + { + "$ref": "#/components/schemas/FeedDetailWorkItemUpdated" + }, + { + "$ref": "#/components/schemas/FeedDetailWorkItemAssigneesChanged" + }, + { + "$ref": "#/components/schemas/FeedDetailWorkItemCompleted" + }, + { + "$ref": "#/components/schemas/FeedDetailWorkItemConverted" }, - "example": { - "member_id": 2476444212131, - "updates": { - "member_name": "Alice Chen", - "locale": "zh-CN", - "time_zone": "Asia/Shanghai" - } - } - } - } - } - } - }, - "/person/infos": { - "post": { - "operationId": "personInfos", - "summary": "Batch get persons", - "description": "Return profile information for a batch of person IDs (members or accounts).", - "tags": [ - "Platform/Members" - ], - "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 |", - "href": "/en/api-reference/platform/members/person-infos", - "metadata": { - "sidebarTitle": "Batch get persons" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PersonInfosResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 2451002751131, - "person_id": 2476444212131, - "person_name": "Alice", - "avatar": "/image/avatar1.png", - "locale": "zh-CN", - "time_zone": "Asia/Shanghai", - "email": "alice@example.com", - "phone_verified": false, - "email_verified": true, - "as": "member", - "status": "enabled" - }, - { - "account_id": 2451002751131, - "person_id": 3790925372131, - "person_name": "Bob", - "email": "bob@example.com", - "phone_verified": false, - "email_verified": true, - "as": "member", - "status": "enabled" - } - ] - } - } + { + "$ref": "#/components/schemas/FeedDetailWorkItemBound" + }, + { + "$ref": "#/components/schemas/FeedDetailWorkItemDeleted" + }, + { + "$ref": "#/components/schemas/FeedDetailAlertMerge" } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "ref_id": { + "description": "ObjectID of the source alert or incident this entry references.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "type": { + "$ref": "#/components/schemas/IncidentFeedType" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_at": { + "description": "Last update timestamp in milliseconds.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PersonInfosRequest" - }, - "example": { - "person_ids": [ - 2476444212131, - 3790925372131 - ] - } - } - } - } - } - }, - "/team/info": { - "post": { - "operationId": "team-read-info", - "summary": "Get team detail", - "description": "Return a single team by ID, name, or external reference ID.", - "tags": [ - "Platform/Teams" + "required": [ + "ref_id", + "type", + "detail", + "account_id", + "creator_id", + "created_at", + "updated_at" ], - "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- At least one of `team_id`, `team_name`, or `ref_id` must be provided.", - "href": "/en/api-reference/platform/teams/team-read-info", - "metadata": { - "sidebarTitle": "Get team detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TeamItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 10023, - "team_id": 1001, - "team_name": "Backend SRE", - "description": "Backend reliability engineering team", - "status": "enabled", - "updated_by_name": "alice", - "updated_by": 80011, - "creator_id": 80011, - "creator_name": "alice", - "created_at": 1710000000, - "updated_at": 1712000000, - "person_ids": [ - 80011, - 80012 - ], - "ref_id": "" - } - } - } - } + "type": "object" + }, + "IncidentFeedType": { + "description": "Incident timeline entry type. Each value identifies one lifecycle event; the matching `detail` payload shape is determined by this field. Incident types are prefixed with `i_`.\n\n| Type | Meaning |\n|---|---|\n| `i_new` | Incident Created: A new incident was created automatically or manually. |\n| `i_assign` | Assigned: Incident was assigned to responders. |\n| `i_a_rspd` | Responder Added: Additional responders joined the incident. |\n| `i_notify` | Notification dispatched through a channel at a specific escalation level. |\n| `i_storm` | Alert storm threshold reached on the incident. |\n| `i_snooze` | Notifications snoozed for a given duration. |\n| `i_wake` | Snooze cancelled and notifications resumed. |\n| `i_ack` | Acknowledged: Responder confirmed they are working on the incident. |\n| `i_unack` | Acknowledgement removed. |\n| `i_comm` | Comment: Responder logged progress or key information. |\n| `i_rslv` | Resolved: Incident was marked as resolved. |\n| `i_reopen` | Reopened: Resolved incident was reopened, possibly due to recurrence. |\n| `i_merge` | Merged: Multiple related incidents were merged into one. |\n| `i_r_title` | Title updated. |\n| `i_r_desc` | Description updated. |\n| `i_r_impact` | Impact updated. |\n| `i_r_rc` | Root cause updated. |\n| `i_r_rsltn` | Resolution updated. |\n| `i_r_severity` | Severity Changed: Incident severity level was adjusted. |\n| `i_r_field` | Custom field value updated. |\n| `i_m_flapping` | Incident muted by flapping detection. |\n| `i_m_reply` | Mute reply marker on a comment. |\n| `i_custom` | Action: Automated action or script was triggered. |\n| `i_wr_create` | War Room Created: Chat group was created for collaborative response. |\n| `i_wr_delete` | War room chat group deleted. |\n| `i_auto_refresh` | Card auto-refresh event posted back to the timeline. |\n| `i_wi_created` | Work Item Created: An Action or Follow-up was created. |\n| `i_wi_updated` | Work Item Updated: Title, description, status, or priority was changed. |\n| `i_wi_assignees` | Work Item Assignees Changed: Assignees were updated. |\n| `i_wi_completed` | Work Item Completed: An assignee marked the work item complete. |\n| `i_wi_converted` | Work Item Converted: An Action was converted to a Follow-up. |\n| `i_wi_bound` | Work Item Bound: A converted Follow-up was bound to a post-mortem. |\n| `i_wi_deleted` | Work Item Deleted: An Action or Follow-up was soft-deleted. |\n| `a_merge` | Alert Merged: An alert was merged into an existing incident. |", + "enum": [ + "i_new", + "i_assign", + "i_a_rspd", + "i_notify", + "i_storm", + "i_snooze", + "i_wake", + "i_ack", + "i_unack", + "i_comm", + "i_rslv", + "i_reopen", + "i_merge", + "i_r_title", + "i_r_desc", + "i_r_impact", + "i_r_rc", + "i_r_rsltn", + "i_r_severity", + "i_r_field", + "i_m_flapping", + "i_m_reply", + "i_custom", + "i_wr_create", + "i_wr_delete", + "i_auto_refresh", + "i_wi_created", + "i_wi_updated", + "i_wi_assignees", + "i_wi_completed", + "i_wi_converted", + "i_wi_bound", + "i_wi_deleted", + "a_merge" + ], + "type": "string" + }, + "IncidentInfo": { + "description": "Detailed incident record.", + "properties": { + "account_id": { + "description": "Account ID that owns the incident.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "account_locale": { + "description": "Account locale.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "account_name": { + "description": "Account name.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "account_time_zone": { + "description": "Account time zone.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamInfoRequest" - }, - "example": { - "team_id": 1001 - } - } - } - } - } - }, - "/team/infos": { - "post": { - "operationId": "team-read-infos", - "summary": "Batch get teams", - "description": "Return basic info for multiple teams by their IDs in a single request.", - "tags": [ - "Platform/Teams" - ], - "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 deduplicated; IDs that match no team are ignored.", - "href": "/en/api-reference/platform/teams/team-read-infos", - "metadata": { - "sidebarTitle": "Batch get teams" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TeamInfosResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "team_id": 1001, - "team_name": "Backend SRE", - "person_ids": [ - 80011, - 80012 - ] - }, - { - "team_id": 1002, - "team_name": "Frontend", - "person_ids": [ - 80013 - ] - } - ] - } - } - } - } + "ack_time": { + "description": "Unix timestamp (seconds) when the incident was first acknowledged. 0 if unacknowledged.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "active_alert_cnt": { + "description": "Count of alerts currently in Critical/Warning/Info state.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "ai_summary": { + "description": "AI-generated summary of the incident.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "alert_cnt": { + "description": "Total count of alerts merged into this incident.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamInfosRequest" - }, - "example": { - "team_ids": [ - 1001, - 1002 - ] - } - } - } - } - } - }, - "/team/list": { - "post": { - "operationId": "team-read-list", - "summary": "List teams", - "description": "Return a paginated list of teams in the current account.", - "tags": [ - "Platform/Teams" - ], - "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- Filter by `person_id` to return teams that a specific person belongs to.\n- Defaults: p=1, limit=20.", - "href": "/en/api-reference/platform/teams/team-read-list", - "metadata": { - "sidebarTitle": "List teams" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TeamListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "p": 1, - "limit": 20, - "total": 5, - "items": [ - { - "account_id": 10023, - "team_id": 1001, - "team_name": "Backend SRE", - "status": "enabled", - "creator_id": 80011, - "created_at": 1710000000, - "updated_at": 1712000000, - "person_ids": [ - 80011 - ], - "description": "", - "updated_by_name": "", - "updated_by": 0, - "creator_name": "alice", - "ref_id": "" - } - ] - } - } - } - } + "alert_event_cnt": { + "description": "Total raw alert event count across all merged alerts.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "alerts": { + "description": "Embedded alerts, only populated for notification templates and custom actions.", + "items": { + "$ref": "#/components/schemas/AlertInfo" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "assigned_to": { + "$ref": "#/components/schemas/AssignedTo", + "description": "Current assignment target for the incident." }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "channel_id": { + "description": "Channel ID. 0 for standalone incidents.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamListRequest" - }, - "example": { - "p": 1, - "limit": 20, - "orderby": "created_at", - "asc": false - } - } - } - } - } - }, - "/team/upsert": { - "post": { - "operationId": "team-write-upsert", - "summary": "Create or update a team", - "description": "Create a new team or update an existing one. Pass `team_id` to update.", - "tags": [ - "Platform/Teams" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Teams Manage** (`organization`) |\n\n## Usage\n\n- Omit `team_id` (or set to 0) to create a new team; pass an existing ID to update.\n- `team_name` must be 1–39 characters and unique within the account.\n- Pass `person_ids` to set team membership; this replaces the entire member list.\n- Pass `emails` or `phones` to add existing members by contact; contacts that match no member are ignored — nobody is invited.\n- `ref_id` is an external identifier for integration with third-party HR systems.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/platform/teams/team-write-upsert", - "metadata": { - "sidebarTitle": "Create or update a team" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TeamUpsertResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "team_id": 1001, - "team_name": "Backend SRE" - } - } - } - } + "channel_name": { + "description": "Channel display name.", + "type": "string" + }, + "channel_status": { + "description": "Channel status.", + "type": "string" + }, + "close_time": { + "description": "Unix timestamp (seconds) when the incident was closed. 0 if still open.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "closer": { + "$ref": "#/components/schemas/PersonShort", + "description": "Closer member info." }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "closer_id": { + "description": "Member ID that closed the incident. 0 if auto-closed.", + "format": "int64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "created_at": { + "description": "Creation timestamp (seconds).", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "creator": { + "$ref": "#/components/schemas/PersonShort", + "description": "Creator member info." }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamUpsertRequest" - }, - "example": { - "team_name": "Backend SRE", - "description": "Backend reliability engineering team", - "person_ids": [ - 80011, - 80012 - ] - } - } - } - } - } - }, - "/team/delete": { - "post": { - "operationId": "team-write-delete", - "summary": "Delete a team", - "description": "Permanently delete a team by ID, name, or external reference ID.", - "tags": [ - "Platform/Teams" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Teams Manage** (`organization`) |\n\n## Usage\n\n- At least one of `team_id`, `team_name`, or `ref_id` must be provided.\n- Fails with `400 ReferenceExist` if the team is still referenced by schedules, escalation rules, or other resources.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/platform/teams/team-write-delete", - "metadata": { - "sidebarTitle": "Delete a team" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PlatformEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "creator_id": { + "description": "Member ID that created the incident. 0 if auto-created by the system.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "data_source_id": { + "deprecated": true, + "description": "Deprecated. Use `integration_id` instead.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "data_source_ids": { + "deprecated": true, + "description": "Deprecated. Use `integration_ids` instead.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "data_source_type": { + "deprecated": true, + "description": "Deprecated. Use `integration_type` instead.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "data_source_types": { + "deprecated": true, + "description": "Deprecated. Use `integration_types` instead.", + "items": { + "type": "string" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TeamDeleteRequest" - }, - "example": { - "team_id": 1001 - } - } - } - } - } - }, - "/role/info": { - "post": { - "operationId": "role-read-info", - "summary": "Get role detail", - "description": "Return the detail of a single role by its ID.", - "tags": [ - "Platform/Roles & permissions" - ], - "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 |", - "href": "/en/api-reference/platform/roles-permissions/role-read-info", - "metadata": { - "sidebarTitle": "Get role detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RoleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "role_id": 2, - "role_name": "Account Admin", - "description": "Account admin with all permissions.", - "status": "enabled", - "permission_ids": [ - 101, - 102, - 201 - ], - "editable": false, - "created_at": 1700000000, - "updated_at": 1700000000 - } - } - } - } + "dedup_key": { + "description": "Deduplication key used to coalesce alerts.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "deleted_at": { + "description": "Soft-delete timestamp (seconds). Zero if not deleted.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Incident description.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "detail_url": { + "description": "Web console URL for the incident.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleInfoRequest" - }, - "example": { - "role_id": 2 - } - } - } - } - } - }, - "/role/list": { - "post": { - "operationId": "role-read-list", - "summary": "List roles", - "description": "Return all custom and built-in roles for the current account.", - "tags": [ - "Platform/Roles & permissions" - ], - "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- Built-in roles (`editable: false`) cannot be modified or deleted.", - "href": "/en/api-reference/platform/roles-permissions/role-read-list", - "metadata": { - "sidebarTitle": "List roles" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RoleListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 3, - "items": [ - { - "role_id": 2, - "role_name": "Account Admin", - "description": "", - "status": "enabled", - "permission_ids": [], - "editable": false, - "created_at": 1700000000, - "updated_at": 1700000000 - } - ] - } - } - } - } + "end_time": { + "description": "Unix timestamp (seconds) when the incident ended. 0 if still active.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "equals_md5": { + "description": "MD5 hash used for content-equality checks.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "ever_muted": { + "description": "Whether the incident has ever been silenced.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "fields": { + "additionalProperties": true, + "description": "Custom field values keyed by field name.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleListRequest" - }, - "example": { - "orderby": "created_at", - "asc": false - } - } - } - } - } - }, - "/role/upsert": { - "post": { - "operationId": "role-write-upsert", - "summary": "Create or update a role", - "description": "Create a new custom role or update an existing one. Pass `role_id` to update.", - "tags": [ - "Platform/Roles & permissions" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Omit `role_id` (or set to 0) to create; pass an existing ID to update.\n- `role_name` must be 1–39 characters and unique within the account.\n- `permission_ids` sets the full permission set for the role, replacing any previous assignment.\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" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RoleUpsertResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "role_id": 150, - "role_name": "On-call Manager" - } - } - } - } + "frequency": { + "description": "Frequency bucket for recurrence analysis: `frequent` or `rare`.", + "enum": [ + "frequent", + "rare" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "group_method": { + "description": "Alert grouping method: `i` intelligent, `p` pattern, `n` none.", + "enum": [ + "i", + "p", + "n" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "images": { + "description": "Attached images.", + "items": { + "$ref": "#/components/schemas/Image" + }, + "type": "array" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "impact": { + "description": "Impact description.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleUpsertRequest" - }, - "example": { - "role_name": "On-call Manager", - "description": "Manage on-call rotations and incidents.", - "permission_ids": [ - 501, - 502 - ] - } - } - } - } - } - }, - "/role/enable": { - "post": { - "operationId": "role-write-enable", - "summary": "Enable a role", - "description": "Re-enable a previously disabled custom role.", - "tags": [ - "Platform/Roles & permissions" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Built-in roles always remain enabled; enabling or disabling them is a silent no-op.\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" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PlatformEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "incident_severity": { + "description": "Configured incident severity.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "incident_status": { + "description": "Current incident status, derived from alert statuses.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "integration_id": { + "description": "First integration associated with the incident.", + "format": "int64", + "type": "integer" + }, + "integration_ids": { + "description": "All integration IDs contributing alerts to this incident.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "integration_type": { + "description": "First alert's integration type string, used by the detail page for label mappings.", + "type": "string" + }, + "integration_types": { + "description": "Integration type strings for all contributing integrations.", + "items": { + "type": "string" + }, + "type": "array" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Labels propagated from alerts.", + "type": "object" + }, + "last_time": { + "description": "Unix timestamp (seconds) of the most recent update.", + "format": "int64", + "type": "integer" + }, + "links": { + "description": "Channel-level link integrations rendered for this incident.", + "items": { + "$ref": "#/components/schemas/LinkItem" + }, + "type": "array" + }, + "manual_overrides": { + "description": "Fields that were manually overridden after auto-population.", + "items": { + "type": "string" + }, + "type": "array" + }, + "num": { + "description": "Short display identifier; not guaranteed unique.", + "type": "string" + }, + "owner": { + "$ref": "#/components/schemas/PersonShort", + "deprecated": true, + "description": "Owner member info. May be deprecated." }, - "403": { - "$ref": "#/components/responses/Forbidden" + "owner_id": { + "description": "Primary owner member ID. 0 if none.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "post_mortem_id": { + "description": "Associated post-mortem ID, if any. One incident can only link to a single post-mortem.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleIDRequest" - }, - "example": { - "role_id": 150 - } - } - } - } - } - }, - "/role/disable": { - "post": { - "operationId": "role-write-disable", - "summary": "Disable a role", - "description": "Disable a custom role to prevent it from granting permissions.", - "tags": [ - "Platform/Roles & permissions" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Members who held this role lose its permissions immediately.\n- Built-in roles always remain enabled; enabling or disabling them is a silent no-op.\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" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PlatformEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "progress": { + "description": "Incident progress. `Triggered` means fired and unacknowledged; `Processing` means acknowledged and being handled (un-acknowledging moves it back to `Triggered`); `Closed` means resolved.", + "enum": [ + "Triggered", + "Processing", + "Closed" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "reporter_email": { + "description": "Reporter email for manually created incidents.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "resolution": { + "description": "Resolution notes.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "responders": { + "description": "Current responders with assignment/acknowledgement state.", + "items": { + "$ref": "#/components/schemas/Responder" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "root_cause": { + "description": "Root cause analysis.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleIDRequest" - }, - "example": { - "role_id": 150 - } - } - } - } - } - }, - "/role/delete": { - "post": { - "operationId": "role-write-delete", - "summary": "Delete a role", - "description": "Delete a custom role. While members still hold the role, the call fails with `ReferenceExist` unless `is_force` is true.", - "tags": [ - "Platform/Roles & permissions" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Built-in roles are synthetic and are never deleted; the call is a no-op for them.\n- While any member still holds the role, the default (`is_force=false`) call fails with error code `ReferenceExist` and the holders listed in `data.refs`. Set `is_force=true` to revoke the role from all holders and delete it in one call.\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" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PlatformEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "silence_url": { + "description": "Quick-silence URL for this incident.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "snoozed_before": { + "description": "Unix timestamp (seconds) until which notifications are snoozed. 0 if not snoozed.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "start_time": { + "description": "Unix timestamp (seconds) when the incident started.", + "format": "int64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "team_id": { + "description": "ID of the team that owns the incident's channel. 0 when the channel has no team.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "title": { + "description": "Incident title.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_at": { + "description": "Last update timestamp (seconds).", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleDeleteRequest" - }, - "example": { - "role_id": 150 - } - } - } - } - } - }, - "/role/permission/list": { - "post": { - "operationId": "role-read-list-permission", - "summary": "List permissions", - "description": "Return all available permissions, optionally filtered to those granted to specific roles.", - "tags": [ - "Platform/Roles & permissions" + "required": [ + "incident_id", + "account_id", + "channel_id", + "team_id", + "integration_id", + "integration_ids", + "integration_types", + "dedup_key", + "equals_md5", + "start_time", + "end_time", + "last_time", + "ack_time", + "close_time", + "creator_id", + "closer_id", + "owner_id", + "incident_status", + "incident_severity", + "progress", + "title", + "description", + "ai_summary", + "impact", + "root_cause", + "resolution", + "num", + "created_at", + "updated_at", + "snoozed_before", + "group_method", + "ever_muted", + "labels", + "fields", + "assigned_to", + "alert_cnt", + "active_alert_cnt", + "alert_event_cnt", + "responders", + "account_name", + "account_locale", + "account_time_zone", + "channel_name", + "channel_status", + "detail_url", + "silence_url", + "post_mortem_id", + "images", + "manual_overrides" ], - "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- Pass `role_ids` to filter permissions to those granted to those roles.\n- Pass `with_all: true` to include all permissions regardless of role filter, with `is_granted` set to indicate which are granted to the specified roles.", - "href": "/en/api-reference/platform/roles-permissions/role-read-list-permission", - "metadata": { - "sidebarTitle": "List permissions" + "type": "object" + }, + "IncidentInfoRequest": { + "description": "Lookup parameters for a single incident. Supply either incident_id or num.", + "properties": { + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "num": { + "description": "Short incident ID (the 6-character uppercased id shown in the UI). Not unique — resolves to the most recent match. Supply either incident_id or num.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RolePermissionListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "id": 501, - "permission_name": "Templates Read", - "permission_type": "read", - "description": "View notification templates", - "class": "On-call", - "scope": "on-call", - "status": "enabled", - "is_granted": true, - "source": "system" - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "type": "object" + }, + "IncidentListResponse": { + "description": "Paginated list of incidents.", + "properties": { + "has_next_page": { + "description": "True when more results are available beyond this page.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "items": { + "description": "Incident list for the current page.", + "items": { + "$ref": "#/components/schemas/IncidentInfo" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "search_after_ctx": { + "description": "Opaque cursor to pass as `search_after_ctx` on the next request.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "total": { + "description": "Total number of matching incidents.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RolePermissionListRequest" - }, - "example": { - "role_ids": [ - 150 - ], - "with_all": true - } - } - } - } - } - }, - "/role/permission/factor/list": { - "post": { - "operationId": "role-read-list-permission-factor", - "summary": "List permission factors", - "description": "Return all permission factors (API, button, menu, URL, visit) granted to the calling member, optionally filtered by type. Requires a member-scoped credential — calls authenticated as the account principal (e.g. an account-level app key) are rejected with a 400, because the account principal implicitly holds every permission.", - "tags": [ - "Platform/Roles & permissions" + "required": [ + "items", + "total", + "has_next_page" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | None — but the credential must belong to a member; account-principal credentials (e.g. an account-level app key) are rejected with a 400 |\n\n## Usage\n\n- Permission factors are the fine-grained controls that make up each permission.\n- `factor_types` accepts: `api`, `button`, `visit`, `menu`, `url`.", - "href": "/en/api-reference/platform/roles-permissions/role-read-list-permission-factor", - "metadata": { - "sidebarTitle": "List permission factors" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PermissionFactorListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": [ - { - "factor_name": "template:read:info", - "factor_type": "api", - "source": "system" - } - ] - } - } - } + "type": "object" + }, + "IncidentRawItem": { + "description": "Raw incident row returned by the analytics incident list, with per-incident handling metrics attached.", + "properties": { + "acknowledgements": { + "description": "Number of acknowledgements.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "active_alert_cnt": { + "description": "Number of alerts still active (not recovered).", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "alert_cnt": { + "description": "Total number of alerts aggregated into the incident.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "alert_event_cnt": { + "description": "Total number of alert events associated with the incident; each report of an alert counts as one event.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PermissionFactorListRequest" + "assigned_to": { + "description": "Current assignment target for the incident; `null` when the incident has no assignment record.", + "properties": { + "assigned_at": { + "description": "Unix timestamp (seconds) when this assignment was made.", + "format": "int64", + "type": "integer" }, - "example": { - "factor_types": [ - "api" - ] - } - } - } - } - } - }, - "/role/member/grant": { - "post": { - "operationId": "role-write-grant-role", - "summary": "Grant role to members", - "description": "Assign a role to one or more members, giving them its permissions.", - "tags": [ - "Platform/Roles & permissions" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Members who already have the role are silently skipped.\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" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PlatformEmptyObject" - } - } - } - ] + "escalate_rule_id": { + "description": "Escalation rule ID (MongoDB ObjectID) driving the assignment.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "escalate_rule_name": { + "description": "Display name of the escalation rule.", + "type": "string" + }, + "id": { + "description": "Internal assignment record ID.", + "type": "string" + }, + "layer_idx": { + "description": "Current level index within the escalation rule.", + "type": "integer" + }, + "person_ids": { + "description": "Member IDs assigned directly to this incident.", + "items": { + "format": "int64", + "type": "integer" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } + "type": "array" + }, + "type": { + "description": "Assignment type.\n| Value | Meaning |\n|---|---|\n| `assign` | Initial assignment when the incident is created manually. |\n| `reassign` | Re-assignment of an existing incident. |\n| `escalate` | Assignment triggered by escalation policy advancement. |\n| `reopen` | Assignment restarted from the first layer after the incident is reopened. |", + "enum": [ + "assign", + "reassign", + "escalate", + "reopen" + ], + "type": "string" } - } + }, + "type": [ + "object", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "assignments": { + "description": "Number of assignments.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "channel_id": { + "description": "ID of the channel the incident belongs to.", + "format": "int64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "channel_name": { + "description": "Name of the channel the incident belongs to.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "closed_by": { + "description": "How the incident was closed: `auto`, `timeout`, or `manually`. Empty string while the incident is still open.", + "enum": [ + "", + "auto", + "timeout", + "manually" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleGrantRequest" - }, - "example": { - "member_ids": [ - 80011, - 80012 - ], - "role_id": 150 - } - } - } - } - } - }, - "/role/member/revoke": { - "post": { - "operationId": "role-write-revoke-role", - "summary": "Revoke role from members", - "description": "Remove a role from one or more members, revoking the permissions it granted.", - "tags": [ - "Platform/Roles & permissions" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Roles Manage** (`organization`) |\n\n## Usage\n\n- Members who don't have the role are silently skipped.\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-revoke-role", - "metadata": { - "sidebarTitle": "Revoke role from members" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PlatformEmptyObject" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "closer_id": { + "description": "Member ID of the person who closed the incident. Omitted when 0 (not closed manually).", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "closer_name": { + "description": "Display name of the person who closed the incident. Omitted when empty.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "created_at": { + "description": "Incident creation time, as a Unix timestamp in seconds.", + "format": "int64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "creator_id": { + "description": "Person ID of the incident creator.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "creator_name": { + "description": "Display name of the incident creator.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleGrantRequest" - }, - "example": { - "member_ids": [ - 80011 - ], - "role_id": 150 - } - } - } - } - } - }, - "/audit/search": { - "post": { - "operationId": "audit-read-search", - "summary": "Search audit logs", - "description": "Return a cursor-paginated list of audit log entries within a time range.", - "tags": [ - "Platform/Audit logs" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Audit Read** (`organization`) |\n\n## Usage\n\n- Time range is required. Maximum span is 90 days. Both `start_time` and `end_time` are Unix epoch **seconds**.\n- Use `search_after_ctx` from the previous response to fetch the next page. The token is opaque — do not construct it manually.\n- The retention window depends on the account's license. Queries beyond the retention boundary silently return an empty result rather than an error.\n- `limit` accepts 0–99; omitting it (or 0) returns all matching rows in the window with no page-size cap. Rows are returned newest first.", - "href": "/en/api-reference/platform/audit-logs/audit-read-search", - "metadata": { - "sidebarTitle": "Search audit logs" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AuditSearchResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 2, - "search_after_ctx": "", - "docs": [ - { - "created_at": 1712700123456, - "account_id": 10023, - "member_id": 80011, - "member_name": "Alice", - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "ip": "203.0.113.42", - "operation": "template:write:create", - "operation_name": "创建模板", - "body": "{\"template_name\":\"Prod default\"}", - "params": [], - "is_dangerous": false, - "is_write": true, - "principal_kind": "member", - "credential_type": "", - "credential_id": 0 - } - ] - } - } - } - } + "description": { + "description": "Incident description. Omitted when empty.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "engaged_seconds": { + "description": "Total engaged time in seconds across acknowledged responders, each contributing close time minus their acknowledgement time; 0 if not closed.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "escalations": { + "description": "Total escalations, the sum of `timeout_escalations` and `manual_escalations`.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "ever_muted": { + "description": "Whether the incident was ever muted by noise reduction. Omitted when false.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AuditSearchRequest" - }, - "example": { - "start_time": 1712620800, - "end_time": 1712707200, - "limit": 20, - "operations": [ - "template:write:create", - "template:write:delete" - ] - } - } - } - } - } - }, - "/audit/operation/list": { - "post": { - "operationId": "audit-read-operation-list", - "summary": "List auditable operation types", - "description": "Return all operation names that are recorded in the audit log, for use as `operations` filter values.", - "tags": [ - "Platform/Audit logs" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Audit Read** (`organization`) |\n\n## Usage\n\n- Use the `name` values from this response as `operations` filter values in `POST /audit/search`.\n- `name_cn` is the human-readable Chinese label shown in the console; `name` is the stable wire value to filter on.", - "href": "/en/api-reference/platform/audit-logs/audit-read-operation-list", - "metadata": { - "sidebarTitle": "List auditable operation types" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AuditOperationListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "name": "template:write:create", - "name_cn": "创建模板" - }, - { - "name": "template:write:delete", - "name_cn": "删除模板" - }, - { - "name": "incident:write:acknowledge", - "name_cn": "认领故障" - } - ] - } - } - } - } + "fields": { + "additionalProperties": true, + "description": "Custom fields of the incident. Always omitted in this response (reserved for export).", + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "frequency": { + "description": "Frequency classification: `frequent` or `rare`. Omitted when not classified.", + "enum": [ + "frequent", + "rare" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "hours": { + "description": "Time-of-day bucket of the creation time in the account timezone: `work` = Mon–Fri 08:00–19:00, `sleep` = 23:00–08:00 daily, `off` = all other times.", + "enum": [ + "work", + "off", + "sleep" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "incident_id": { + "description": "Incident ID, unique within the account.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AuditOperationListRequest" - }, - "example": {} - } - } - } - } - }, - "/field/info": { - "post": { - "operationId": "field-read-info", - "summary": "Get field detail", - "description": "Return the configuration of a single incident custom field by ID.", - "tags": [ - "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 | **Incidents Read** (`on-call`) or **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- An unknown `field_id` yields a 400 error. A soft-deleted field is still returned, with `status` = `deleted` and `deleted_at` set.\n- The shape of `options` and `default_value` varies by `field_type` — see the `FieldItem` schema.", - "href": "/en/api-reference/on-call/alert-enrichment/field-read-info", - "metadata": { - "sidebarTitle": "Get field detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/FieldItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 80001, - "field_id": "66e9d3a4f7c2b04a1c8a91b3", - "field_name": "severity_class", - "display_name": "Severity Class", - "description": "Business severity tier.", - "field_type": "single_select", - "value_type": "string", - "options": [ - "Critical", - "High", - "Medium", - "Low" - ], - "default_value": "Medium", - "status": "enabled", - "creator_id": 80011, - "updated_by": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - } - } - } + "interruptions": { + "description": "Number of interruptions: notifications sent via app push, SMS, or voice call; consecutive notifications to the same responder within 60 seconds count as one.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Incident labels as key-value pairs. Always omitted in this response (reserved for export).", + "type": "object" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "manual_escalations": { + "description": "Manually triggered escalations.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "notifications": { + "description": "Total number of notifications sent.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FieldInfoRequest" - }, - "example": { - "field_id": "66e9d3a4f7c2b04a1c8a91b3" - } - } - } - } - } - }, - "/field/list": { - "post": { - "operationId": "field-read-list", - "summary": "List fields", - "description": "Return all incident custom fields configured for the account.", - "tags": [ - "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 | **Incidents Read** (`on-call`) or **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- All non-deleted fields are returned in a single response — there is no pagination and no `total` counter.\n- `query` matches against `field_name` only; invalid regular expressions are auto-escaped to a literal substring match.", - "href": "/en/api-reference/on-call/alert-enrichment/field-read-list", - "metadata": { - "sidebarTitle": "List fields" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/FieldListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "account_id": 80001, - "field_id": "66e9d3a4f7c2b04a1c8a91b3", - "field_name": "severity_class", - "display_name": "Severity Class", - "description": "Business severity tier.", - "field_type": "single_select", - "value_type": "string", - "options": [ - "Critical", - "High", - "Medium", - "Low" - ], - "default_value": "Medium", - "status": "enabled", - "creator_id": 80011, - "updated_by": 80011, - "created_at": 1710000000, - "updated_at": 1710000000 - } - ] - } + "owner_id": { + "description": "Member ID of the incident owner. Omitted when 0 (no owner).", + "format": "int64", + "type": "integer" + }, + "owner_name": { + "description": "Display name of the incident owner. Omitted when empty.", + "type": "string" + }, + "progress": { + "description": "Incident progress state — one of `Triggered`, `Processing`, `Closed`.", + "enum": [ + "Triggered", + "Processing", + "Closed" + ], + "type": "string" + }, + "reassignments": { + "description": "Number of reassignments.", + "format": "int64", + "type": "integer" + }, + "responders": { + "description": "Responders with per-person assignment and acknowledgement times.", + "items": { + "properties": { + "acknowledged_at": { + "description": "Acknowledgement time, as a Unix timestamp in seconds; 0 if not acknowledged.", + "format": "int64", + "type": "integer" + }, + "as": { + "description": "Responder's identity in an external chat tool (e.g. Slack); only present when backfilled by an external system.", + "type": "string" + }, + "assigned_at": { + "description": "Assignment time, as a Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "email": { + "description": "Responder email. Omitted when empty.", + "type": "string" + }, + "person_id": { + "description": "Person ID of the responder.", + "format": "int64", + "type": "integer" + }, + "person_name": { + "description": "Responder display name. Omitted when empty.", + "type": "string" } - } - } + }, + "type": "object" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "seconds_to_ack": { + "description": "Seconds from incident creation to the first acknowledgement; 0 if never acknowledged.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "seconds_to_close": { + "description": "Seconds from incident creation to close; 0 if not closed.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "severity": { + "description": "Incident severity.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/FieldListRequest" - }, - "example": { - "orderby": "updated_at", - "asc": false, - "query": "severity" - } - } - } - } - } - }, - "/field/create": { - "post": { - "operationId": "field-write-create", - "summary": "Create field", - "description": "Create a new incident custom field on the account.", - "tags": [ - "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 | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Maximum **15** custom fields per account.\n- `field_name` must match `^[a-zA-Z_][a-zA-Z0-9_]{0,39}$` and is immutable after creation; `display_name` must also be unique within the account.\n- Type-specific rules: `checkbox` requires `value_type=bool` and no `options`; `single_select`/`multi_select` require `value_type=string` and a non-empty unique `options` list; `text` requires `value_type=string` and no `options`.\n- Response contains only `field_id` and `field_name`; use `/field/info` to fetch the full object.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/alert-enrichment/field-write-create", - "metadata": { - "sidebarTitle": "Create field" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CreateFieldResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "field_id": "66e9d3a4f7c2b04a1c8a91b3", - "field_name": "severity_class" - } - } - } - } + "snoozed_before": { + "description": "Unix timestamp in seconds until which the incident is snoozed. Omitted when the incident is not snoozed.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "team_id": { + "description": "ID of the team that owns the incident.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "team_name": { + "description": "Name of the team that owns the incident.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "timeout_escalations": { + "description": "Escalations triggered by timeout.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "Incident title.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateFieldRequest" - }, - "example": { - "field_name": "severity_class", - "display_name": "Severity Class", - "description": "Business severity tier.", - "field_type": "single_select", - "value_type": "string", - "options": [ - "Critical", - "High", - "Medium", - "Low" - ], - "default_value": "Medium" - } - } - } - } - } - }, - "/field/update": { - "post": { - "operationId": "field-write-update", - "summary": "Update field", - "description": "Update mutable attributes of an existing incident custom field.", - "tags": [ - "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 | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Only `display_name`, `description`, `options`, and `default_value` can be changed; `field_name`, `field_type`, and `value_type` are immutable.\n- `options` and `default_value` must remain consistent with the field's existing type — same rules as create.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/alert-enrichment/field-write-update", - "metadata": { - "sidebarTitle": "Update field" + "type": "object" + }, + "IncidentShort": { + "description": "Brief incident reference embedded in an alert.", + "properties": { + "incident_id": { + "description": "Incident ID (ObjectID hex string).", + "type": "string" + }, + "progress": { + "description": "Incident progress — one of `Triggered`, `Processing`, `Closed`.", + "type": "string" + }, + "title": { + "description": "Incident title.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "object" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "InhibitRuleItem": { + "properties": { + "account_id": { + "description": "ID of the account the rule belongs to.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_id": { + "description": "ID of the channel the rule belongs to.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "created_at": { + "description": "Creation time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "deleted_at": { + "description": "Deletion time, Unix timestamp in seconds. Omitted unless the rule is soft-deleted; deleted rules are excluded from list responses.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateFieldRequest" - }, - "example": { - "field_id": "66e9d3a4f7c2b04a1c8a91b3", - "display_name": "Severity Class", - "description": "Business severity tier.", - "options": [ - "Critical", - "High", - "Medium", - "Low" - ], - "default_value": "Medium" - } - } - } - } - } - }, - "/field/delete": { - "post": { - "operationId": "field-write-delete", - "summary": "Delete field", - "description": "Delete an incident custom field and asynchronously strip it from existing incidents.", - "tags": [ - "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 | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- The field is marked deleted synchronously; clearing its values from historical incidents runs in the background and may take time on large datasets.\n- Re-creating a field with the same `field_name` is only allowed if `field_type` and `value_type` match the deleted entry.\n- Deletion is rejected with `ReferenceExist` and the referencing custom forms in `data.refs` until no form uses the field.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/alert-enrichment/field-write-delete", - "metadata": { - "sidebarTitle": "Delete field" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "object" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "description": { + "description": "Rule description.", + "type": "string" }, - "400": { - "description": "Invalid request or the field is still referenced by a custom form.", - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/ErrorResponse" - }, - { - "$ref": "#/components/schemas/FieldDeleteReferenceError" - } - ] - }, - "examples": { - "fieldStillReferenced": { - "value": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "error": { - "code": "ReferenceExist", - "message": "There still are associated resources, deletion is blocked." - }, - "data": { - "refs": [ - { - "kind": "custom_form", - "name": "Resolve incident", - "href": "https://console.flashcat.cloud/forms/resolve" - } - ] - } - } - } - } - } - } + "equals": { + "description": "Field keys whose values must be equal between the source (inhibiting) alert and the target (suppressed) alert, e.g. `data_source_id` or `labels.cluster`.", + "items": { + "type": "string" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "is_directly_discard": { + "description": "When true, matching alert events are discarded entirely; when false, alerts are still recorded but marked as muted by this rule.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "rule_id": { + "description": "Rule ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rule_name": { + "description": "Rule name.", + "type": "string" + }, + "source_filters": { + "$ref": "#/components/schemas/FilterGroup", + "description": "Conditions the source alert must match, evaluated against stored active alerts. Supported keys: `status`, `incident_status`, `alert_status`, `severity`, `incident_severity`, `alert_severity`, `title`, `description`, or any `labels.`. Empty makes the rule inert." + }, + "status": { + "description": "Rule status: `enabled` or `disabled`; deleted rules never appear in the list.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "target_filters": { + "$ref": "#/components/schemas/FilterGroup", + "description": "Conditions the incoming target alert event must match to be suppressed; empty means every event is a target." + }, + "updated_at": { + "description": "Last update time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "ID of the user who last updated the rule.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteFieldRequest" - }, - "example": { - "field_id": "66e9d3a4f7c2b04a1c8a91b3" - } - } + "required": [ + "account_id", + "channel_id", + "rule_name", + "description", + "source_filters", + "target_filters", + "equals", + "is_directly_discard", + "status", + "rule_id", + "updated_by", + "created_at", + "updated_at" + ], + "type": "object" + }, + "InitPostMortemRequest": { + "description": "Parameters for initializing a post-mortem report from incidents.", + "properties": { + "incident_ids": { + "description": "Incident IDs to link to the report. 1-10 incidents.", + "items": { + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" + }, + "template_id": { + "description": "Template ID used to initialize the report.", + "type": "string" } - } - } - }, - "/monit/query/data": { - "post": { - "operationId": "monit-read-query-data", - "summary": "Query structured data", - "description": "Run a synchronous ad-hoc query against a configured data source and return a stable `query_result.v1` result whose natural shape is frames, records, or samples. This public API requires monit-edge v0.65.0 or later.", - "tags": [ - "Monitors/Diagnostics" + }, + "required": [ + "incident_ids", + "template_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/minute**; **5 requests/second** per account |\n| Permissions | Any valid `app_key` (read-only; not gated by a specific permission class) |\n| Edge requirement | Supported deployments require **monit-edge v0.65.0 or later** |\n\n## Usage\n\n- Treat **monit-edge v0.65.0** as the minimum supported Edge version for this public API. WebAPI retains migration adapters for older Edge versions: query.v2 results may still preserve frames, records, or samples, while legacy rows can expose only the information they retained. These adapters do not change the support floor; older protocols lack query.v3 cancellation and error-lifecycle semantics, and data already lost by legacy rows cannot be recovered.\n- The public response format is always `query_result.v1` and is independent of the internal Edge query protocol. Dispatch on `result.kind` (`frames`, `records`, or `samples`); do not infer the result shape from `ds_type` or the Edge version.\n- A `frames` result may contain multiple table or time-series frames. Field values are columnar and all fields in one frame have the same length.\n- A `records` result may contain nested JSON and null records. Integer literals outside JavaScript's safe integer range are returned as decimal strings.\n- A `samples` result contains label sets and instant values. A value may be a number or one of the strings `NaN`, `+Inf`, and `-Inf`.\n- The final success response is limited to 8 MiB and query results are limited to 1,000 rows. Narrow the time range, reduce fields, or aggregate at the source when a request exceeds a limit.\n- Query failures use non-2xx HTTP status codes and the standard error envelope. Do not transparently fall back to the deprecated `/monit/query/rows` endpoint.\n- Query execution may take up to 35 seconds across WebAPI forwarding and Edge execution. Configure client timeouts to at least 40 seconds and propagate cancellation when the caller abandons a query.", - "href": "/en/api-reference/monitors/diagnostics/monit-read-query-data", - "metadata": { - "sidebarTitle": "Query structured data" + "type": "object" + }, + "InsightAlertByLabelItem": { + "properties": { + "hours": { + "description": "Hour bucket when `split_hours` is enabled: `work`, `sleep`, or `off`. Omitted when `split_hours` is false.", + "enum": [ + "work", + "sleep", + "off" + ], + "type": "string" + }, + "label": { + "description": "Aggregation key value (check name or resource identifier).", + "type": "string" + }, + "total_alert_cnt": { + "description": "Total number of alerts in this label-value bucket.", + "format": "int64", + "type": "integer" + }, + "total_alert_event_cnt": { + "description": "Total number of raw alert events in this label-value bucket.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/QueryDataRequest" - }, - "example": { - "ds_type": "prometheus", - "ds_name": "prod-prom", - "expr": "sum by (job) (rate(http_requests_total[5m]))", - "delay_seconds": 0, - "args": {} - } - } + "type": "object" + }, + "InsightAlertByLabelResponse": { + "properties": { + "items": { + "description": "Top-K statistic rows aggregated by the requested label's values.", + "items": { + "$ref": "#/components/schemas/InsightAlertByLabelItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/QueryDataResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "format": "query_result.v1", - "result": { - "kind": "samples", - "samples": [ - { - "labels": { - "job": "api" - }, - "value": 1.25 - } - ] - } - } - } - } - } + "type": "object" + }, + "InsightFilter": { + "description": "Shared filter envelope for insight and export endpoints. Severities accept up to 3 values; team/channel/responder/incident filters accept up to 100 IDs each. The time range cannot exceed one year.", + "properties": { + "asc": { + "description": "Sort ascending when `true`, descending otherwise. Only used by `/insight/incident/list`.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_ids": { + "description": "Filter by channel IDs. At most 100 entries.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 100, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description_html_to_text": { + "description": "Strip HTML markup from the description column when exporting.", + "type": "boolean" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "end_time": { + "description": "End time, Unix seconds. Must be greater than `start_time`.", + "format": "int64", + "type": "integer" }, - "413": { - "description": "The request or final response exceeds its size limit.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "export_fields": { + "description": "CSV column keys to include in the export, in the given order; unknown or duplicate keys are rejected. The valid key set differs per export endpoint — see each export operation's description. Only used by the export endpoints; at most 50 entries.", + "items": { + "type": "string" + }, + "maxItems": 50, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "fields": { + "additionalProperties": true, + "description": "Custom-field filters (exact match).", + "type": "object" }, - "499": { - "description": "The client canceled the query.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } + "incident_ids": { + "description": "Filter by incident IDs (MongoDB ObjectIDs). At most 100 entries.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "include_ever_muted": { + "description": "Include incidents that have ever been muted. By default, they are excluded.", + "type": "boolean" }, - "503": { - "$ref": "#/components/responses/ServiceUnavailable" + "is_my_team": { + "description": "Restrict results to teams the caller belongs to. When true and the caller has no teams, the result set is empty.", + "type": "boolean" }, - "504": { - "description": "The query timed out.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/change/list": { - "post": { - "operationId": "change-read-list", - "summary": "List changes", - "description": "Query change records within a time window, with filtering, search, and pagination.", - "tags": [ - "On-call/Changes" - ], - "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", - "href": "/en/api-reference/on-call/changes/change-read-list", - "metadata": { - "sidebarTitle": "List changes" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListChangeResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "has_next_page": false, - "items": [ - { - "change_id": "664a1b2c3d4e5f6a7b8c9d0e", - "account_id": 10001, - "channel_id": 5001, - "channel_name": "Production", - "channel_status": "enabled", - "integration_id": 362, - "integration_name": "GitHub Deploy", - "title": "Deploy api-server v2.3.1", - "description": "Rolling deploy to production cluster", - "change_key": "deploy-api-server-2311", - "change_status": "Done", - "start_time": 1716962400, - "last_time": 1716962700, - "end_time": 1716963000, - "labels": { - "service": "api-server", - "env": "prod" - }, - "link": "https://github.com/acme/api-server/actions/runs/123" - } - ] - } - } - } - } + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Label filters (exact match).", + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "orderby": { + "description": "Sort field of the incident list; only `created_at` (incident creation time) is supported. Used by `/insight/incident/list` only.", + "enum": [ + "created_at" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "query": { + "description": "Substring match on the incident title (SQL `LIKE %query%`).", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "responder_ids": { + "description": "Filter by responder person IDs. At most 100 entries.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 100, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListChangeRequest" - }, - "example": { - "start_time": 1716960000, - "end_time": 1717046400, - "p": 1, - "limit": 10, - "integration_ids": [ - 362 - ], - "orderby": "start_time", - "asc": false, - "include_events": false - } - } - } - } - } - }, - "/incident/war-room/default-observers": { - "post": { - "operationId": "incident-read-get-war-room-default-observers", - "summary": "Get war-room default observers", - "description": "Return historical responders suggested as default observers when opening a war room.", - "tags": [ - "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 | None — any valid `app_key` can call this operation |\n", - "href": "/en/api-reference/on-call/incidents/incident-read-get-war-room-default-observers", - "metadata": { - "sidebarTitle": "Get war-room default observers" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/GetWarRoomDefaultObserversResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "observers": [ - { - "account_id": 10001, - "person_id": 20001, - "person_name": "Alice Chen", - "avatar": "https://cdn.flashcat.cloud/avatar/20001.png", - "email": "alice@acme.com", - "phone": "+8613800000000", - "locale": "zh-CN", - "time_zone": "Asia/Shanghai", - "as": "responder", - "status": "active" - } - ] - } - } - } - } + "seconds_to_ack_from": { + "description": "Lower bound (inclusive) on time-to-acknowledge, in seconds.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "seconds_to_ack_to": { + "description": "Upper bound (exclusive) on time-to-acknowledge, in seconds. Must be greater than `seconds_to_ack_from` when both are set.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "seconds_to_close_from": { + "description": "Lower bound (inclusive) on time-to-close, in seconds.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "seconds_to_close_to": { + "description": "Upper bound (exclusive) on time-to-close, in seconds. Must be greater than `seconds_to_close_from` when both are set.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "severities": { + "description": "Filter by severity. At most 3 entries.", + "items": { + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" + }, + "start_time": { + "description": "Start time, Unix seconds. Must be greater than 0.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" + }, + "team_ids": { + "description": "Filter by team IDs. At most 100 entries.", + "items": { + "format": "int64", + "type": "integer" + }, + "maxItems": 100, + "type": "array" + }, + "time_zone": { + "description": "IANA time zone name used to cut day/week/month buckets (e.g. `Asia/Shanghai`). Optional; defaults to UTC, except that `/insight/incident/export` falls back to the account time zone and then `Asia/Shanghai`.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetWarRoomDefaultObserversRequest" + "required": [ + "start_time", + "end_time" + ], + "type": "object" + }, + "InsightIncidentExportRequest": { + "$ref": "#/components/schemas/InsightFilter" + }, + "InsightIncidentListRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/InsightFilter" + }, + { + "description": "Paged incident list request. Extends InsightFilter with pagination.", + "properties": { + "limit": { + "default": 20, + "description": "Page size, max 100, default 20.", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "example": { - "incident_id": "664a1b2c3d4e5f6a7b8c9d0e" + "p": { + "default": 1, + "description": "Page number, starting at 1. Used when `search_after_ctx` is not provided; `p * limit` must stay within 10,000 records.", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "search_after_ctx": { + "description": "Cursor token returned by a previous page (the incident ID of its last row). Pass it back to fetch the next page.", + "type": [ + "string", + "null" + ] } - } - } - } - } - }, - "/incident/war-room/add-member": { - "post": { - "operationId": "incident-write-add-war-room-member", - "summary": "Add war-room member", - "description": "Add one or more members to the IM war room bound to an incident integration.", - "tags": [ - "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 | None — any valid `app_key` can call this operation |\n", - "href": "/en/api-reference/on-call/incidents/incident-write-add-war-room-member", - "metadata": { - "sidebarTitle": "Add war-room member" + }, + "type": "object" } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "string", - "description": "Returns the literal \"ok\" on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": "ok" - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + ] + }, + "InsightIncidentListResponse": { + "properties": { + "has_next_page": { + "description": "Whether another page of results is available.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "items": { + "description": "Incident items.", + "items": { + "$ref": "#/components/schemas/IncidentRawItem" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "search_after_ctx": { + "description": "Cursor token to fetch the next page — the incident ID of the last row on this page. Present only when `has_next_page` is true.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "total": { + "description": "Total matching incidents.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddWarRoomMemberRequest" + "type": "object" + }, + "InsightQueryRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/InsightFilter" + }, + { + "description": "Insight dimension-aggregation request. Extends InsightFilter with aggregation controls.", + "properties": { + "aggregate_unit": { + "description": "Aggregates metrics by time granularity. When set, the time range must be at least 24 hours; with `day` granularity the range must not exceed 31 days. `day` buckets by calendar day, `week` by calendar week, and `month` by calendar month, with boundaries aligned to `time_zone`.", + "enum": [ + "day", + "week", + "month" + ], + "type": "string" }, - "example": { - "integration_id": 362, - "chat_id": "oc_5ce6d572455d361153b7cb51da133945", - "member_ids": [ - 20001, - 20002 - ] + "split_hours": { + "description": "When true, metrics are split into `work`/`sleep`/`off` hour buckets.", + "type": "boolean" } - } - } - } - } - }, - "/template/preview": { - "post": { - "operationId": "template-read-preview", - "summary": "Preview template", - "description": "Render a notification template against incident data or mock data and return the output.", - "tags": [ - "On-call/Notification templates" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **60 requests/minute**; **10 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- `incident_card_hidden_fields` applies only to supported IM-card previews; unsupported app types or field names return `InvalidParameter`.\n- `fixed_fields` is returned only when the selected IM preview has a non-empty fixed incident-card value.", - "href": "/en/api-reference/on-call/notification-templates/template-read-preview", - "metadata": { - "sidebarTitle": "Preview template" + }, + "type": "object" } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PreviewTemplateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "success": true, - "content": "Incident Database latency spike is Critical", - "message": "", - "fixed_fields": [ - { - "field": "channel", - "value": "Payment Alerts" - } - ] - } - } + ] + }, + "InsightTopkAlertByLabelRequest": { + "allOf": [ + { + "$ref": "#/components/schemas/InsightQueryRequest" + }, + { + "properties": { + "asc": { + "description": "Sort ascending when `true`, descending otherwise.", + "type": "boolean" + }, + "k": { + "default": 20, + "description": "Number of top entries to return, between 1 and 100. Defaults to 20.", + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "label": { + "description": "Aggregation dimension. `check` aggregates by the event's `labels.check` label (monitoring check); `resource` aggregates by the `labels.resource` label (monitored resource identifier).", + "enum": [ + "check", + "resource" + ], + "type": "string" + }, + "orderby": { + "description": "Sort field. `total_alert_cnt` sorts by alert count; `total_alert_event_cnt` sorts by raw alert event count (default).", + "enum": [ + "total_alert_cnt", + "total_alert_event_cnt" + ], + "type": "string" } - } + }, + "required": [ + "label" + ], + "type": "object" + } + ] + }, + "InviteMemberItem": { + "description": "A member to invite. Identify the invitee by `email` alone, or by `member_name` + `phone` together.", + "properties": { + "country_code": { + "description": "ISO 3166-1 alpha-2 region code for `phone` (e.g. \"CN\"). Validated and normalized to upper case before storage; invalid values are rejected with a 400. Also the parsing hint when `phone` has no \"+\" prefix (defaults to \"CN\").", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "email": { + "description": "Email address. Required when `phone` is not provided.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "locale": { + "description": "Locale. One of: `zh-CN` (Simplified Chinese), `en-US` (English); other values are rejected with a 400.", + "enum": [ + "zh-CN", + "en-US" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "member_name": { + "description": "Display name, 2–39 characters. Required when `email` is not provided; derived from the email prefix when omitted.", + "maxLength": 39, + "minLength": 2, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "phone": { + "description": "Phone number. Required when `email` is not provided.", + "type": "string" + }, + "ref_id": { + "description": "External reference ID", + "type": "string" + }, + "role_ids": { + "description": "Role IDs to assign", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" + }, + "time_zone": { + "description": "Time zone", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PreviewTemplateRequest" - }, - "example": { - "content": "Incident {{.Title}} is {{.Status}}", - "type": "feishu_app", - "incident_id": "664a1b2c3d4e5f6a7b8c9d0e", - "incident_card_hidden_fields": { - "feishu_app": [ - "responders" - ] - } - } - } + "type": "object" + }, + "KnowledgeFileDeleteRequest": { + "description": "File to remove from a knowledge pack.", + "properties": { + "force": { + "description": "Delete even when other pack files reference this file; the referrers are then returned as warnings instead of blocking the delete.", + "type": "boolean" + }, + "pack_id": { + "description": "Knowledge pack ID; defaults to the caller's account-scope pack.", + "type": "string" + }, + "rel_path": { + "description": "Path of the file relative to the pack root.", + "type": "string" } - } - } - }, - "/datasource/im/war-room-enabled/list": { - "post": { - "operationId": "im-war-room-enabled-list", - "summary": "List war-room-enabled IM integrations", - "description": "List IM integrations that have the war-room feature enabled for the account.", - "tags": [ - "On-call/IM integrations" + }, + "required": [ + "rel_path" ], - "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", - "href": "/en/api-reference/on-call/integrations/im-war-room-enabled-list", - "metadata": { - "sidebarTitle": "List war-room-enabled IM integrations" + "type": "object" + }, + "KnowledgeFileDeleteResponse": { + "description": "Deletion result; empty unless warnings were raised.", + "properties": { + "warnings": { + "description": "Non-blocking warnings after deletion; `code=still_referenced_by` means the (force-)deleted file is still @ref-referenced by other files in the pack (`refs` lists the referrers). Absent when there are no warnings (omitempty).", + "items": { + "$ref": "#/components/schemas/KnowledgeWarning" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListWarRoomEnabledResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "data_source_id": 362, - "account_id": 10001, - "team_id": 0, - "plugin_id": 101, - "name": "Feishu Ops", - "status": "enabled", - "category": "im", - "plugin_type": "feishu", - "plugin_type_name": "Feishu", - "description": "Feishu war-room integration", - "integration_key": "ik_8f3a2b1c9d0e", - "ref_id": "", - "settings": { - "war_room_enabled": true - }, - "no_editable": false, - "creator_id": 20001, - "updated_by": 20001, - "created_at": 1716962400, - "updated_at": 1716962700, - "last_time": 0, - "exclusive_data_source_id": 0, - "integration_id": 362 - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "type": "object" + }, + "KnowledgeFileGetRequest": { + "description": "Which file to fetch.", + "properties": { + "pack_id": { + "description": "Knowledge pack ID; defaults to the caller's account-scope pack.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rel_path": { + "description": "Path of the file relative to the pack root.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object" - }, - "example": {} - } - } - } - } - }, - "/status-page/list": { - "get": { - "operationId": "status-page-read-page-list", - "summary": "List status pages", - "description": "List all status pages owned by the account, including their components and sections.", - "tags": [ - "On-call/Status pages" + "required": [ + "rel_path" ], - "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", - "href": "/en/api-reference/on-call/status-pages/status-page-read-page-list", - "metadata": { - "sidebarTitle": "List status pages" + "type": "object" + }, + "KnowledgeFileGetResponse": { + "description": "File metadata plus its base64-encoded content.", + "properties": { + "content_b64": { + "description": "Base64-encoded file content; decodes to UTF-8 text.", + "type": "string" + }, + "file": { + "$ref": "#/components/schemas/KnowledgeFileItem" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListStatusPageResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "page_id": 7001, - "name": "Acme Status", - "url_name": "acme", - "type": "public", - "custom_domain": "status.acme.com", - "logo_url": "https://acme.com", - "page_header": "Acme System Status", - "date_view": "calendar", - "display_uptime_mode": "chart_and_percentage", - "custom_links": [ - { - "name": "Home", - "url": "https://acme.com" - } - ], - "contact_info": "mailto:support@acme.com", - "components": [ - { - "component_id": "cmp_001", - "section_id": "sec_001", - "name": "API", - "description": "Core API service", - "available_since_seconds": 1716962400, - "order_id": 1, - "hide_uptime": false, - "hide_all": false - } - ], - "sections": [ - { - "section_id": "sec_001", - "name": "Core Services", - "order_id": 1, - "hide_uptime": false, - "hide_all": false - } - ], - "subscription": { - "email": true, - "im": false - } - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "file", + "content_b64" + ], + "type": "object" + }, + "KnowledgeFileItem": { + "description": "Metadata of one file inside a knowledge pack. Content is fetched separately via file/get.", + "properties": { + "checksum": { + "description": "SHA-256 hex digest of the file content.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "content_type": { + "description": "MIME type; inferred from the file extension when not set on upload.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "file_id": { + "description": "File ID (`kfl_` prefix).", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - } - } - }, - "/account/info": { - "post": { - "summary": "Get account detail", - "description": "Return the current account's profile and settings.", - "operationId": "account-read-info", - "tags": [ - "Platform/Account" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object" - }, - "example": {} - } - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AccountInfo" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 1001, - "account_name": "acme", - "domain": "acme", - "extra_domains": [ - "acme-corp" - ], - "phone": "138****8000", - "country_code": "CN", - "email": "ops@acme.example", - "avatar": "https://cdn.flashcat.cloud/avatar/acme.png", - "locale": "zh-CN", - "time_zone": "Asia/Shanghai", - "created_at": 1716960000, - "restrictions": { - "ips": [ - "203.0.113.0/24" - ], - "email_domains": [ - "acme.example" - ], - "allow_subdomain": true - } - } - } - } - } + "pack_id": { + "description": "ID of the knowledge pack that contains the file.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "rel_path": { + "description": "Path relative to the pack root, e.g. `runbooks/restart.md`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "size_bytes": { + "description": "File size in bytes.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "updated_at_ms": { + "description": "Unix timestamp in milliseconds when the file was last modified.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_by": { + "description": "Person ID of the member who last modified the file.", + "format": "int64", + "type": "integer" } }, - "x-mint": { - "metadata": { - "sidebarTitle": "Get account detail" - }, - "content": "| Permission | Description |\n| --- | --- |\n| None | None — any valid app_key can call this operation. |\n\nFind this operation in the [Platform API reference](/en/api-reference/platform/account/account-read-info).", - "href": "/en/api-reference/platform/account/account-read-info" - } - } - }, - "/datasource/im/person/try-link": { - "post": { - "operationId": "datasourceImPersonTryLink", - "summary": "Attempt IM person linking", - "description": "Try to automatically link unbound members to their IM accounts for one integration.", - "tags": [ - "On-call/Integrations" + "required": [ + "file_id", + "pack_id", + "rel_path", + "content_type", + "size_bytes", + "checksum", + "updated_by", + "updated_at_ms" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Integrations Manage** (`on-call`) |\n\n## Usage\n\n- The server uses member email and phone values to find matching users in DingTalk, Feishu, or WeCom.\n- When no member can be linked, the response either carries an empty `new_linked_person_ids` array or omits the `data` field entirely.", - "href": "/en/api-reference/on-call/integrations/datasource-im-person-try-link", - "metadata": { - "sidebarTitle": "Attempt IM person linking" + "type": "object" + }, + "KnowledgeFileListRequest": { + "description": "Which pack's files to list.", + "properties": { + "limit": { + "description": "Page size. Accepted but currently ignored — the response always contains the full file list.", + "type": "integer" + }, + "p": { + "description": "Page number, 1-based. Accepted but currently ignored — the response always contains the full file list.", + "type": "integer" + }, + "pack_id": { + "description": "Knowledge pack ID; defaults to the caller's account-scope pack.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/TryLinkPersonResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "new_linked_person_ids": [ - 5348648172131 - ] - } - } - } - } + "type": "object" + }, + "KnowledgeFileListResponse": { + "description": "Files in the pack.", + "properties": { + "files": { + "description": "Array of files in the specified knowledge pack; empty array when the pack has no files.", + "items": { + "$ref": "#/components/schemas/KnowledgeFileItem" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "total": { + "description": "Total number of files in the pack.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "files", + "total" + ], + "type": "object" + }, + "KnowledgeFilePutRequest": { + "description": "File to create or overwrite. The body is base64 text in `content_b64`, not a multipart upload.", + "properties": { + "content_b64": { + "description": "Base64-encoded file content; must decode to valid UTF-8 text (binary is rejected). Per-file limit 1 MiB.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "content_type": { + "description": "MIME type; inferred from the file extension when omitted.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "pack_id": { + "description": "Knowledge pack ID; defaults to the caller's account-scope pack.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "rel_path": { + "description": "Destination path relative to the pack root; existing files are overwritten.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TryLinkPersonRequest" - }, - "example": { - "integration_id": 6113996590131 - } - } - } - } - } - }, - "/incident/post-mortem/init": { - "post": { - "operationId": "postmortem-write-init", - "summary": "Initialize post-mortem", - "description": "Create a post-mortem draft from one or more incidents and a template.", - "tags": [ - "On-call/Incidents" + "required": [ + "rel_path" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Links at most 10 incidents to one post-mortem report.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-init", - "metadata": { - "sidebarTitle": "Initialize post-mortem" + "type": "object" + }, + "KnowledgeFilePutResponse": { + "description": "The written file plus any non-blocking warnings.", + "properties": { + "file": { + "$ref": "#/components/schemas/KnowledgeFileItem" + }, + "warnings": { + "description": "Non-blocking warnings after a successful write; `code=unresolved_reference` means an @ref in the file content points to a file that does not exist in the pack. Absent when there are no warnings (omitempty).", + "items": { + "$ref": "#/components/schemas/KnowledgeWarning" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PostMortemItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "meta": { - "account_id": 2451002751131, - "title": "Postmortem1", - "status": "published", - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "template_id": "post_mortem_default_tmpl_en-us", - "incident_ids": [ - "69bb9233331067560c718ecd" - ], - "media_count": 0, - "author_ids": [ - 2477273692131 - ], - "team_id": 2477033058131, - "channel_id": 3047621227131, - "is_private": false, - "channel_name": "Ops Channel", - "created_at_seconds": 1773900354, - "updated_at_seconds": 1773909012 - }, - "basics": { - "incidents_highest_severity": "Warning", - "incidents_earliest_start_seconds": 1761133512, - "incidents_latest_close_seconds": 1761133632, - "incidents_total_duration_seconds": 120, - "responders": [ - { - "person_id": 3790925372131, - "assigned_at": 1761133515, - "acknowledged_at": 0 - } - ] - }, - "content": { - "content": "{\"type\":\"doc\",\"content\":[]}" - }, - "follow_ups": "" - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "required": [ + "file" + ], + "type": "object" + }, + "KnowledgeGetRequest": { + "description": "No request fields — the account-scope pack is always targeted.", + "properties": {}, + "type": "object" + }, + "KnowledgeGetResponse": { + "description": "Account-scope pack metadata plus its file list.", + "properties": { + "files": { + "description": "Array of files in this knowledge pack; empty array when the pack has no files.", + "items": { + "$ref": "#/components/schemas/KnowledgeFileItem" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "pack": { + "$ref": "#/components/schemas/KnowledgePackItem" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InitPostMortemRequest" - }, - "example": { - "incident_ids": [ - "69bb9233331067560c718ecd" - ], - "template_id": "post_mortem_default_tmpl_en-us" - } - } + "required": [ + "pack", + "files" + ], + "type": "object" + }, + "KnowledgePackDeleteRequest": { + "description": "Pack to delete.", + "properties": { + "pack_id": { + "description": "Knowledge pack ID to delete.", + "type": "string" } - } - } - }, - "/incident/post-mortem/basics/reset": { - "post": { - "operationId": "postmortem-write-reset-basics", - "summary": "Update post-mortem basics", - "description": "Replace the incident facts stored in a post-mortem report.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "pack_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-reset-basics", - "metadata": { - "sidebarTitle": "Update post-mortem basics" + "type": "object" + }, + "KnowledgePackDeleteResponse": { + "description": "Deletion result.", + "properties": { + "ok": { + "description": "True when the pack was deleted.", + "type": "boolean" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "ok" + ], + "type": "object" + }, + "KnowledgePackEnsureRequest": { + "description": "Scope at which to ensure a knowledge pack exists.", + "properties": { + "scope": { + "description": "Scope of the pack to ensure. One of: `account` (account-level pack; scope_id is forced to the caller's account ID and only account admins may create it; first creation seeds a default DUTY.md), `team` (team-level pack; the `scope_id` team ID is required and the caller must belong to that team).", + "enum": [ + "account", + "team" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "scope_id": { + "description": "Team ID; required for `team` scope, ignored for `account` scope.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "scope" + ], + "type": "object" + }, + "KnowledgePackItem": { + "description": "A knowledge pack — a versioned file tree staged into every AI SRE sandbox at session start. One pack exists per (account, scope, scope_id).", + "properties": { + "account_id": { + "description": "Account that owns the pack.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "can_edit": { + "description": "Whether the caller can edit this pack.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_at_ms": { + "description": "Unix timestamp in milliseconds when the pack was created.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "created_by": { + "description": "Person ID of the member who created the pack.", + "format": "int64", + "type": "integer" + }, + "duty_version": { + "description": "Pack version at which DUTY.md was last authored or re-affirmed. When `version` is greater, DUTY.md no longer reflects every file in the pack.", + "type": "integer" + }, + "file_count": { + "description": "Number of files in the pack.", + "type": "integer" + }, + "pack_id": { + "description": "Knowledge pack ID (`kpk_` prefix).", + "type": "string" + }, + "scope": { + "description": "Pack scope. `channel` is a legacy scope; new packs are `account` or `team`.", + "enum": [ + "account", + "team", + "channel" + ], + "type": "string" + }, + "scope_id": { + "description": "Scope owner: the account ID for `account` scope, the team ID for `team` scope.", + "format": "int64", + "type": "integer" + }, + "team_name": { + "description": "Display name of the owning team (team scope only). Omitted when empty (account scope, or the team name could not be resolved).", + "type": "string" + }, + "total_bytes": { + "description": "Total size of all files in bytes.", + "format": "int64", + "type": "integer" + }, + "updated_at_ms": { + "description": "Unix timestamp in milliseconds when the pack was last modified.", + "format": "int64", + "type": "integer" + }, + "version": { + "description": "Pack version, incremented on every file change.", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResetPostMortemBasicsRequest" - }, - "example": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "incidents_highest_severity": "Warning", - "incidents_earliest_start_seconds": 1761133512, - "incidents_latest_close_seconds": 1761133632, - "incidents_total_duration_seconds": 120, - "responder_ids": [ - 3790925372131 - ] - } - } - } - } - } - }, - "/incident/post-mortem/content/reset": { - "post": { - "operationId": "incident-post-mortem-write-reset-content", - "summary": "Reset post-mortem content", - "description": "Replace the body of a drafting post-mortem report with Markdown.", - "tags": [ - "On-call/Incidents" + "required": [ + "pack_id", + "account_id", + "scope", + "scope_id", + "file_count", + "total_bytes", + "version", + "duty_version", + "created_by", + "created_at_ms", + "updated_at_ms", + "can_edit" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | Edit access to the target report is required. |\n\n## Usage\n\n- The report must be drafting and its current revision must equal `expected_revision`; otherwise the API returns `409 Conflict`.\n- Reuse an `idempotency_key` only for the same report, revision, and Markdown content; different reuse returns `409 Conflict`.\n- A successful reset disconnects the previous collaboration (Yjs) room. Reconnect to the new generation room `post-mortem-{accountId}-{postMortemId}-g{N}` (generation 0 has no `-g` suffix). The reset cannot be rolled back.\n- Markdown content is limited to 4 MiB.\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/incident-post-mortem-write-reset-content", - "metadata": { - "sidebarTitle": "Reset post-mortem content" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PostMortemContentResetResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "generation": 2, - "revision": 12, - "previous_generation": 1, - "previous_revision": 11, - "markdown_bytes": 88, - "markdown_sha256": "70d764e77e68f8fbfa14d72a235ac07b0110768b8380c8e3436459ebaf02a7c0" - } - } - } - } + "type": "object" + }, + "KnowledgePackListRequest": { + "description": "Filter and pagination for the pack list.", + "properties": { + "include_account": { + "description": "Include the account-scope pack; defaults to true.", + "type": [ + "boolean", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "description": "Page size.", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "p": { + "description": "Page number, 1-based; returns all results when both `p` and `limit` are unset.", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "query": { + "description": "Case-insensitive substring filter over pack ID, scope, scope ID/account ID, and team name.", + "maxLength": 128, + "type": "string" }, - "409": { - "description": "The report is not drafting, the revision is stale, or the idempotency key was reused for a different request.", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "request_id", - "error" - ], - "properties": { - "request_id": { - "type": "string" - }, - "error": { - "type": "object", - "required": [ - "code", - "message" - ], - "properties": { - "code": { - "type": "string", - "enum": [ - "Conflict" - ] - }, - "message": { - "type": "string" - } - } - } - } - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "error": { - "code": "Conflict", - "message": "expected_revision conflict: request has 11 but current revision is 12" - } - } - } - } + "scope": { + "description": "Restrict to one scope; `all` (default) overrides `include_account`. One of: `all` (account scope plus visible team scopes), `account` (account-level packs only), `team` (team-level packs only, can be combined with `team_ids`).", + "enum": [ + "all", + "account", + "team" + ], + "type": "string" }, - "413": { - "description": "Markdown content exceeds the 4 MiB limit.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "error": { - "code": "EntityTooLarge", - "message": "markdown exceeds maximum size" - } - } - } - } + "team_ids": { + "description": "Restrict to these team IDs; for non-admins the list is intersected with their own teams.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + } + }, + "type": "object" + }, + "KnowledgePackListResponse": { + "description": "Visible packs and the total after filtering.", + "properties": { + "packs": { + "description": "Array of visible knowledge packs after filtering (current page), used with `total` for pagination.", + "items": { + "$ref": "#/components/schemas/KnowledgePackItem" + }, + "type": "array" + }, + "total": { + "description": "Total number of packs after filtering, before pagination.", + "format": "int64", + "type": "integer" + } + }, + "required": [ + "packs", + "total" + ], + "type": "object" + }, + "KnowledgePackUpdateRequest": { + "description": "Move a knowledge pack to a different scope.", + "properties": { + "pack_id": { + "description": "Knowledge pack ID to update.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "scope": { + "description": "Destination scope; omit for a no-op that returns the current pack.", + "enum": [ + "account", + "team" + ], + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "scope_id": { + "description": "Destination team ID; required when `scope` is `team`, set automatically for `account`.", + "format": "int64", + "type": [ + "integer", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResetPostMortemContentRequest" - }, - "example": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "markdown": "# Database saturation incident\n\nThe database pool was exhausted; added saturation alert.", - "expected_revision": 11, - "idempotency_key": "postmortem-reset-8104935102-11" - } - } - } - } - } - }, - "/incident/post-mortem/status/reset": { - "post": { - "operationId": "postmortem-write-reset-status", - "summary": "Update post-mortem status", - "description": "Set a post-mortem report to drafting or published.", - "tags": [ - "On-call/Incidents" + "required": [ + "pack_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-reset-status", - "metadata": { - "sidebarTitle": "Update post-mortem status" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "type": "object" + }, + "KnowledgeWarning": { + "description": "Non-blocking annotation returned by file uploads and deletions, e.g. references that point at a removed file.", + "properties": { + "code": { + "description": "Warning code. One of: `unresolved_reference` (an @ref in the written file's content points to a file that does not exist in the pack; `ref` carries it), `still_referenced_by` (the deleted file is still @ref-referenced by other files in the pack; `refs` lists the referrers).", + "enum": [ + "unresolved_reference", + "still_referenced_by" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "ref": { + "description": "Single reference related to the warning.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "refs": { + "description": "Multiple references related to the warning.", + "items": { + "type": "string" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResetPostMortemStatusRequest" - }, - "example": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "status": "published" - } - } - } - } - } - }, - "/incident/post-mortem/title/reset": { - "post": { - "operationId": "postmortem-write-reset-title", - "summary": "Update post-mortem title", - "description": "Replace the title of a post-mortem report.", - "tags": [ - "On-call/Incidents" + "required": [ + "code" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-reset-title", - "metadata": { - "sidebarTitle": "Update post-mortem title" + "type": "object" + }, + "LicenseListResponse": { + "description": "People with active fixed or temporary On-call licenses.", + "properties": { + "items": { + "description": "People holding an active license.", + "items": { + "$ref": "#/components/schemas/LicensePersonItem" + }, + "type": "array" + }, + "total": { + "description": "Number of people holding an active license.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "total", + "items" + ], + "type": "object" + }, + "LicensePersonItem": { + "description": "One person with an active On-call license.", + "properties": { + "created_at": { + "description": "Unix timestamp when a fixed license was assigned. `0` for temporary licenses.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "person_id": { + "description": "ID of the licensed person.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "person_name": { + "description": "Display name of the licensed person.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "type": { + "description": "License assignment type. `fixed` is explicitly assigned; `temporary` is held from the active license window.", + "enum": [ + "fixed", + "temporary" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_at": { + "description": "Unix timestamp when a fixed license was last changed. `0` for temporary licenses.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Person ID that last changed a fixed license. `0` for temporary licenses.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResetPostMortemTitleRequest" - }, - "example": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "title": "Production API latency incident" - } - } - } - } - } - }, - "/incident/post-mortem/follow-ups/reset": { - "post": { - "operationId": "postmortem-write-reset-follow-ups", - "summary": "Update post-mortem follow-ups", - "description": "Replace the follow-up action items on a post-mortem report.", - "tags": [ - "On-call/Incidents" + "required": [ + "person_id", + "person_name", + "type", + "updated_by", + "created_at", + "updated_at" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-reset-follow-ups", - "metadata": { - "sidebarTitle": "Update post-mortem follow-ups" + "type": "object" + }, + "LinkItem": { + "description": "Channel-level link integration reference rendered from a template.", + "properties": { + "endpoint": { + "description": "Rendered URL for the link.", + "type": "string" + }, + "name": { + "description": "Display name of the link.", + "type": "string" + }, + "open_type": { + "description": "How the link opens. `popup` opens it in a popup within the incident detail page; `tab` opens it in a new browser tab.", + "enum": [ + "popup", + "tab" + ], + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "name", + "endpoint", + "open_type" + ], + "type": "object" + }, + "ListChangeRequest": { + "properties": { + "asc": { + "description": "Sort in ascending order when true; default is descending.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_ids": { + "description": "Filter by channel IDs.", + "items": { + "description": "", + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "data_source_id": { + "deprecated": true, + "description": "Deprecated: use `integration_ids` instead. Single integration ID to filter by.", + "format": "int64", + "minimum": 1, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "data_source_ids": { + "deprecated": true, + "description": "Deprecated: use `integration_ids` instead. At least 1 entry when provided.", + "items": { + "description": "Integration ID.", + "format": "int64", + "type": "integer" + }, + "minItems": 1, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "end_time": { + "description": "End of the query window, Unix epoch seconds. See `start_time` for defaults and constraints.", + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "filters": { + "description": "Structured filters ANDed onto the query (e.g. on labels). Keys prefixed with `incident` are ignored.", + "items": { + "$ref": "#/components/schemas/FilterCondition" + }, + "type": "array" + }, + "include_events": { + "description": "Include the underlying change events for each change when true.", + "type": "boolean" + }, + "integration_id": { + "deprecated": true, + "description": "Deprecated: use `integration_ids` instead. Single integration ID to filter by.", + "format": "int64", + "minimum": 1, + "type": "integer" + }, + "integration_ids": { + "description": "Filter by reporting integration IDs. At least 1 entry when provided.", + "items": { + "description": "", + "format": "int64", + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "limit": { + "default": 10, + "description": "Number of items per page.", + "format": "int64", + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "orderby": { + "description": "Sort field: `start_time` or `last_time`. Defaults to `start_time`.", + "enum": [ + "start_time", + "last_time" + ], + "type": "string" + }, + "p": { + "description": "Page number, starting at 1.", + "format": "int64", + "minimum": 1, + "type": "integer" + }, + "query": { + "description": "Case-insensitive substring or regular-expression match over the change title, change_key, and description. An invalid regular expression falls back to a literal match.", + "type": "string" + }, + "start_time": { + "description": "Start of the query window, Unix epoch seconds. Optional — when both `start_time` and `end_time` are omitted or 0, the window defaults to the last hour. Must be less than `end_time`, with a span of at most 31 days. A change matches when its [start_time, last_time] window overlaps the query window.", + "format": "int64", + "minimum": 0, + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResetPostMortemFollowUpsRequest" - }, - "example": { - "post_mortem_id": "8104935102bf89dc01ac638a5261fe7e", - "follow_ups": "- Add database saturation alert\n- Review cache TTL rollout" - } - } - } - } - } - }, - "/incident/post-mortem/template/upsert": { - "post": { - "operationId": "postmortem-write-upsert-template", - "summary": "Create or update post-mortem template", - "description": "Create a custom post-mortem template or update an existing one.", - "tags": [ - "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 Manage** (`on-call`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-upsert-template", - "metadata": { - "sidebarTitle": "Create or update post-mortem template" + "type": "object" + }, + "ListChangeResponse": { + "properties": { + "has_next_page": { + "description": "Whether more pages are available after this one.", + "type": "boolean" + }, + "items": { + "description": "Changes on the current page.", + "items": { + "$ref": "#/components/schemas/ChangeItem" + }, + "type": "array" + }, + "total": { + "description": "Total number of matching changes.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PostMortemTemplate" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 2451002751131, - "template_id": "post_mortem_default_tmpl_en-us", - "name": "Default post-mortem report", - "description": "Default sections for post-mortem reports.", - "content": "[{\"type\":\"heading\",\"content\":\"Summary\"}]", - "content_markdown": "## Summary\nDescribe what happened.", - "team_id": 2477033058131, - "created_at_seconds": 1773900000, - "updated_at_seconds": 1773903600 - } - } - } - } + "type": "object" + }, + "ListChannelsRequest": { + "properties": { + "asc": { + "description": "When true, sort ascending; defaults to false (descending).", + "type": "boolean" + }, + "channel_ids": { + "description": "Filter by explicit channel IDs.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "channel_name": { + "description": "Exact-match filter on channel name. Takes priority over `query` for name filtering.", + "type": "string" + }, + "is_brief": { + "description": "When true, return only `channel_id`, `channel_name`, `description` and `status`, and return all matches without pagination.", + "type": "boolean" + }, + "is_my_managed": { + "description": "When true, return only channels the caller manages.", + "type": "boolean" + }, + "is_my_starred": { + "description": "When true, return only channels the caller has starred. Mutually exclusive with `is_my_team`.", + "type": "boolean" + }, + "is_my_team": { + "description": "When true, return channels owned by the caller's teams. Mutually exclusive with `is_my_starred`.", + "type": "boolean" + }, + "limit": { + "default": 100, + "description": "Page size. Defaults to 100 when omitted.", + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "orderby": { + "description": "Field used to order results. Defaults to `created_at`.", + "enum": [ + "ranking", + "created_at", + "updated_at", + "channel_name", + "last_incident_at" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "p": { + "description": "Page number (1-based).", + "minimum": 1, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "query": { + "description": "Case-insensitive regular expression matched against channel name and description; invalid regex syntax falls back to a literal match.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "team_ids": { + "description": "Filter by team IDs.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + } + }, + "type": "object" + }, + "ListChannelsResponse": { + "properties": { + "has_next_page": { + "description": "Whether more pages are available.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" + "items": { + "description": "Channels on the current page.", + "items": { + "$ref": "#/components/schemas/ChannelItem" + }, + "type": "array" + }, + "total": { + "description": "Total matching channels.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertPostMortemTemplateRequest" - }, - "example": { - "team_id": 2477033058131, - "name": "Production incident template", - "description": "Template for production incident reviews.", - "content": "[{\"type\":\"heading\",\"content\":\"Summary\"}]", - "content_markdown": "## Summary\nDescribe what happened." - } - } + "required": [ + "items", + "total", + "has_next_page" + ], + "type": "object" + }, + "ListDropRulesResponse": { + "properties": { + "items": { + "description": "All drop (unsubscribe) rules of the channel, excluding deleted ones, ordered by creation time ascending.", + "items": { + "$ref": "#/components/schemas/UnsubscribeRuleItem" + }, + "type": "array" } - } - } - }, - "/incident/post-mortem/template/delete": { - "post": { - "operationId": "postmortem-write-delete-template", - "summary": "Delete post-mortem template", - "description": "Delete a custom post-mortem template.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "items" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Every call is recorded in the account audit log. Don't put secrets in request fields.", - "href": "/en/api-reference/on-call/incidents/postmortem-write-delete-template", - "metadata": { - "sidebarTitle": "Delete post-mortem template" + "type": "object" + }, + "ListEscalationRulesResponse": { + "properties": { + "items": { + "description": "All escalation rules of the channel, excluding deleted ones, ordered by priority ascending.", + "items": { + "$ref": "#/components/schemas/EscalateRuleItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "ListIncidentAlertsRequest": { + "description": "Filters for alerts belonging to an incident.", + "properties": { + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "include_events": { + "description": "When true, include at most the 20 newest raw events in each alert item as a preview.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "is_active": { + "description": "When true return only active alerts (Critical/Warning/Info); when false return only recovered alerts (Ok). Omit to include all.", + "type": [ + "boolean", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "limit": { + "default": 1000, + "description": "Page size, at most 1000.", + "format": "int64", + "maximum": 1000, + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "p": { + "default": 1, + "description": "Page number starting at 1.", + "format": "int64", + "minimum": 0, + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeletePostMortemTemplateRequest" - }, - "example": { - "template_id": "post_mortem_custom_tmpl_01" - } - } + "required": [ + "incident_id" + ], + "type": "object" + }, + "ListIncidentAlertsResponse": { + "description": "Paginated list of alerts merged into an incident.", + "properties": { + "items": { + "description": "Alert list.", + "items": { + "$ref": "#/components/schemas/AlertInfo" + }, + "type": "array" + }, + "total": { + "description": "Total matching alerts.", + "format": "int64", + "type": "integer" } - } - } - }, - "/incident/post-mortem/template/list": { - "post": { - "operationId": "postmortem-read-list-templates", - "summary": "List post-mortem templates", - "description": "Return built-in and custom post-mortem templates for the account.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "items", + "total" ], - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/postmortem-read-list-templates", - "metadata": { - "sidebarTitle": "List post-mortem templates" + "type": "object" + }, + "ListIncidentCommentTypesRequest": { + "description": "No parameters. The operation always returns every comment type of the calling account.", + "properties": {}, + "type": "object" + }, + "ListIncidentCommentTypesResponse": { + "description": "Full list of the account's comment types, ordered by position.", + "properties": { + "items": { + "description": "All comment types of the account, ordered by position.", + "items": { + "$ref": "#/components/schemas/IncidentCommentTypeItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListPostMortemTemplatesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 2, - "has_next_page": false, - "items": [ - { - "account_id": 2451002751131, - "template_id": "post_mortem_default_tmpl_en-us", - "name": "Default post-mortem report", - "description": "Default sections for post-mortem reports.", - "content": "[{\"type\":\"heading\",\"content\":\"Summary\"}]", - "content_markdown": "## Summary\nDescribe what happened.", - "team_id": 2477033058131, - "created_at_seconds": 1773900000, - "updated_at_seconds": 1773903600 - } - ] - } - } - } - } + "type": "object" + }, + "ListIncidentFeedRequest": { + "description": "Filters for the incident timeline query.", + "properties": { + "asc": { + "description": "Ascending chronological order when true.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "limit": { + "default": 20, + "description": "Page size, at most 100.", + "format": "int64", + "maximum": 100, + "minimum": 1, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "p": { + "description": "Page number starting at 1.", + "format": "int64", + "minimum": 1, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "types": { + "description": "Optional filter restricting the returned entries to specific types.", + "items": { + "$ref": "#/components/schemas/IncidentFeedType" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListPostMortemTemplatesRequest" - }, - "example": { - "p": 1, - "limit": 20, - "order_by": "created_at_seconds", - "asc": false - } - } + "required": [ + "incident_id" + ], + "type": "object" + }, + "ListIncidentFeedResponse": { + "description": "Page of incident timeline entries.", + "properties": { + "has_next_page": { + "description": "True when more entries are available.", + "type": "boolean" + }, + "items": { + "description": "Timeline entries for the current page.", + "items": { + "$ref": "#/components/schemas/IncidentFeedItem" + }, + "type": "array" } - } - } - }, - "/incident/post-mortem/template/info": { - "get": { - "operationId": "postmortem-read-template-info", - "summary": "Get post-mortem template detail", - "description": "Return one post-mortem template by ID.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "has_next_page", + "items" ], - "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** (`on-call`) |", - "href": "/en/api-reference/on-call/incidents/postmortem-read-template-info", - "metadata": { - "sidebarTitle": "Get post-mortem template detail" + "type": "object" + }, + "ListIncidentsByIdsRequest": { + "description": "Batch lookup parameters for incidents.", + "properties": { + "incident_ids": { + "description": "Incident IDs to query; obtain them from `POST /incident/list`.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/PostMortemTemplate" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "account_id": 2451002751131, - "template_id": "post_mortem_default_tmpl_en-us", - "name": "Default post-mortem report", - "description": "Default sections for post-mortem reports.", - "content": "[{\"type\":\"heading\",\"content\":\"Summary\"}]", - "content_markdown": "## Summary\nDescribe what happened.", - "team_id": 2477033058131, - "created_at_seconds": 1773900000, - "updated_at_seconds": 1773903600 - } - } - } - } + "required": [ + "incident_ids" + ], + "type": "object" + }, + "ListIncidentsRequest": { + "description": "Filters for the incident list query. `start_time` and `end_time` are required; the window must not exceed 31 days.", + "properties": { + "acker_ids": { + "description": "Filter by acker member IDs; obtain member IDs from `POST /member/list`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "asc": { + "description": "Ascending order when true.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "channel_ids": { + "description": "Channel IDs to filter by. Use 0 for standalone (global) incidents.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "closer_ids": { + "description": "Closer member IDs. Use 0 for automatically closed incidents.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "creator_ids": { + "description": "Creator member IDs. Use 0 for automatically created incidents.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "end_time": { + "description": "Window end, Unix seconds. Must be greater than `start_time` and within 31 days.", + "format": "int64", + "type": "integer" + }, + "ever_muted": { + "description": "When true, include only incidents that were ever silenced.", + "type": "boolean" + }, + "incident_ids": { + "description": "Restrict to the given incident IDs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "incident_severity": { + "description": "Comma-separated list of severities (`Critical,Warning,Info`).", + "type": "string" + }, + "is_my_channel": { + "description": "When true, restrict to incidents in channels the user personally owns.", + "type": "boolean" + }, + "is_my_team": { + "description": "When true, restrict to incidents in channels owned by the user's teams.", + "type": "boolean" + }, + "is_rare": { + "description": "When true, include only outlier (rare) incidents.", + "type": "boolean" + }, + "is_snoozed": { + "description": "When true, include only snoozed incidents.", + "type": "boolean" + }, + "limit": { + "default": 20, + "description": "Page size, at most 100.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "nums": { + "description": "Filter by incident short numbers (the numbers shown before incident titles in the console).", + "items": { + "type": "string" + }, + "type": "array" + }, + "p": { + "description": "Page number starting at 1.", + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "progress": { + "description": "Comma-separated list of progress states to match (e.g. `Triggered,Processing`).", + "type": "string" + }, + "query": { + "description": "Full-text search query.", + "type": "string" + }, + "responder_ids": { + "description": "Filter by responder member IDs; obtain member IDs from `POST /member/list`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor from a previous response for forward pagination.", + "type": "string" + }, + "start_time": { + "description": "Start of the time window (Unix timestamp in seconds). The window with `end_time` may span at most 31 days and filters by incident start time.", + "format": "int64", + "type": "integer" + }, + "team_ids": { + "description": "Team IDs; resolved to channels via channel ownership.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" + } + }, + "required": [ + "start_time", + "end_time" + ], + "type": "object" + }, + "ListInhibitRulesResponse": { + "properties": { + "items": { + "description": "All inhibit rules of the channel, excluding deleted ones, ordered by creation time ascending.", + "items": { + "$ref": "#/components/schemas/InhibitRuleItem" + }, + "type": "array" + } + }, + "required": [ + "items" + ], + "type": "object" + }, + "ListPastIncidentsRequest": { + "description": "Parameters for the similar-past-incidents query.", + "properties": { + "incident_id": { + "description": "Reference incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "limit": { + "default": 5, + "description": "Maximum number of similar incidents to return.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] } }, - "parameters": [ - { - "name": "template_id", - "in": "query", - "required": true, - "schema": { - "type": "string" - }, - "description": "Template ID." - } - ] - } - }, - "/status-page/info": { - "get": { - "operationId": "statusPageInfo", - "summary": "Get status page detail", - "description": "Retrieve detailed configuration for a specific status page.", - "tags": [ - "On-call/Status pages" + "required": [ + "incident_id" ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-info", - "metadata": { - "sidebarTitle": "Get status page detail" + "type": "object" + }, + "ListPastIncidentsResponse": { + "description": "List of similar historical incidents, ranked by relevance.", + "properties": { + "items": { + "description": "Similar past incidents with similarity scores.", + "items": { + "$ref": "#/components/schemas/PastIncidentItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/StatusPageInfoResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "page_id": 5750613685214, - "name": "Flashduty Status Page", - "url_name": "flashduty-statuspage", - "type": "public", - "custom_domain": "status.example.com", - "logo": "https://cdn.example.com/logo.png", - "favicon": "https://cdn.example.com/favicon.png", - "page_header": "Welcome to our status page", - "page_footer": "2025 Example Corp", - "date_view": "list", - "display_uptime_mode": "chart_and_percentage", - "custom_links": [ - { - "key": "Documentation", - "value": "https://docs.example.com" - } - ], - "contact_info": "mailto:support@example.com", - "components": [ - { - "component_id": "01KC3GAZ6ZJE40H55GM31RPWZE", - "section_id": "01KC3FKKX5TSVG6Z3X1QNGF6V2", - "name": "Web Console", - "available_since_seconds": 1765349358, - "order_id": 1 - } - ], - "sections": [ - { - "section_id": "01KC3FKKX5TSVG6Z3X1QNGF6V2", - "name": "Core Services", - "description": "Our core services", - "order_id": 1, - "hide_uptime": false, - "hide_all": false - } - ], - "subscription": { - "email": true, - "im": false - }, - "template_preference": "message", - "managed_domain_feature_enabled": true - } - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "ListPostMortemTemplatesRequest": { + "description": "Pagination and ordering options for post-mortem templates.", + "properties": { + "asc": { + "description": "Ascending order when true.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "default": 20, + "description": "Page size, at most 100.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "order_by": { + "description": "Field used to order results.", + "enum": [ + "created_at_seconds" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "p": { + "description": "Page number starting at 1.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "search_after_ctx": { + "description": "Cursor from a previous response for forward pagination.", + "type": "string" } }, - "parameters": [ - { - "name": "page_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" + "type": "object" + }, + "ListPostMortemTemplatesResponse": { + "description": "Paginated list of post-mortem templates.", + "properties": { + "has_next_page": { + "description": "True when another page is available.", + "type": "boolean" + }, + "items": { + "description": "Templates in the current page.", + "items": { + "$ref": "#/components/schemas/PostMortemTemplate" }, - "description": "Status page ID." - } - ] - } - }, - "/status-page/create": { - "post": { - "operationId": "statusPageCreate", - "summary": "Create status page", - "description": "Create a new status page.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-create", - "metadata": { - "sidebarTitle": "Create status page" + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor for forward pagination.", + "type": "string" + }, + "total": { + "description": "Total matching templates.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CreateStatusPageResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "page_id": 6294565612043, - "page_name": "My Status Page", - "page_url_name": "my-status-page" - } - } - } - } + "required": [ + "items", + "total", + "has_next_page" + ], + "type": "object" + }, + "ListPostMortemsRequest": { + "description": "Filters for the post-mortem report list.", + "properties": { + "asc": { + "description": "Ascending order when true.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_ids": { + "description": "Channel IDs to restrict the query to.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "created_at_end_seconds": { + "description": "Upper bound of post-mortem creation time (Unix timestamp in seconds).", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_at_start_seconds": { + "description": "Lower bound of post-mortem creation time (Unix timestamp in seconds).", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "limit": { + "default": 20, + "description": "Page size, at most 100.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": "integer" + }, + "order_by": { + "description": "Field used to order results.", + "enum": [ + "created_at_seconds", + "updated_at_seconds" + ], + "type": "string" + }, + "p": { + "description": "Page number starting at 1.", + "format": "int64", + "minimum": 0, + "type": "integer" + }, + "search_after_ctx": { + "description": "Cursor from a previous response for forward pagination.", + "type": "string" + }, + "status": { + "description": "Optional status filter: `drafting` returns only drafts, `published` returns only published post-mortems. When omitted, post-mortems in all statuses are returned.", + "enum": [ + "drafting", + "published" + ], + "type": "string" + }, + "team_ids": { + "description": "Team IDs to restrict the query to.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateStatusPageRequest" - }, - "example": { - "name": "My Status Page", - "url_name": "my-status-page", - "type": "public", - "page_header": "Welcome to our status page", - "contact_info": "mailto:support@example.com" - } - } - } - } - } - }, - "/status-page/update": { - "post": { - "operationId": "statusPageUpdate", - "summary": "Update status page", - "description": "Update an existing status page configuration.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-update", - "metadata": { - "sidebarTitle": "Update status page" + "type": "object" + }, + "ListPostMortemsResponse": { + "description": "Paginated list of post-mortem reports.", + "properties": { + "has_next_page": { + "description": "True when more results are available beyond this page.", + "type": "boolean" + }, + "items": { + "description": "Post-mortem metadata for the current page.", + "items": { + "$ref": "#/components/schemas/PostMortemMeta" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor for forward pagination.", + "type": "string" + }, + "total": { + "description": "Total matching reports.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "items", + "total", + "has_next_page" + ], + "type": "object" + }, + "ListRemoteConfigHistoryRequest": { + "description": "Remote configuration history request. Newest first by default.", + "properties": { + "application_id": { + "description": "RUM application ID.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "asc": { + "description": "Ascending order. Default: false (descending).", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "limit": { + "default": 20, + "description": "Page size. Default 20, max 100.", + "maximum": 100, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "orderby": { + "default": "updated_at", + "description": "Sort field. Default: `updated_at`.", + "enum": [ + "updated_at", + "version" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "p": { + "default": 0, + "description": "Zero-based page index; offset is p multiplied by limit.", + "maximum": 100000, + "minimum": 0, + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateStatusPageRequest" - }, - "example": { - "page_id": 5750613685214, - "name": "Flashduty Status Page (Updated)", - "page_header": "Updated status page header", - "contact_info": "mailto:support@example.com" - } - } + "required": [ + "application_id" + ], + "type": "object" + }, + "ListRemoteConfigHistoryResponse": { + "description": "Remote configuration history page.", + "properties": { + "has_next_page": { + "description": "Whether more pages remain.", + "type": "boolean" + }, + "items": { + "description": "Version items, newest first by default.", + "items": { + "$ref": "#/components/schemas/RemoteConfigHistoryItem" + }, + "type": "array" + }, + "total": { + "description": "Total number of versions.", + "type": "integer" } - } - } - }, - "/status-page/delete": { - "post": { - "operationId": "statusPageDelete", - "summary": "Delete status page", - "description": "Delete a status page.", - "tags": [ - "On-call/Status pages" + }, + "type": "object" + }, + "ListRoutesRequest": { + "description": "Parameters for listing routing rules across multiple integrations.", + "properties": { + "integration_ids": { + "description": "Integration IDs to fetch routing rules for.", + "items": { + "format": "int64", + "type": "integer" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "integration_ids" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-delete", - "metadata": { - "sidebarTitle": "Delete status page" + "type": "object" + }, + "ListRoutesResponse": { + "description": "Response wrapper for the routing rule list.", + "properties": { + "items": { + "description": "Routing rules of the requested integrations. Integrations without a configured rule are omitted.", + "items": { + "$ref": "#/components/schemas/RouteItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" + "required": [ + "items" + ], + "type": "object" + }, + "ListSilenceRulesResponse": { + "properties": { + "items": { + "description": "All silence rules of the channel, excluding deleted ones, ordered by creation time ascending.", + "items": { + "$ref": "#/components/schemas/SilenceRuleItem" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteStatusPageRequest" - }, - "example": { - "page_id": 5750613685214 - } - } - } - } - } - }, - "/status-page/component/upsert": { - "post": { - "operationId": "statusPageComponentUpsert", - "summary": "Upsert status page component", - "description": "Create or update a service component on a status page.", - "tags": [ - "On-call/Status pages" + "required": [ + "items" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-component-upsert", - "metadata": { - "sidebarTitle": "Upsert status page component" + "type": "object" + }, + "ListStatusPageResponse": { + "properties": { + "items": { + "description": "Status pages owned by the account.", + "items": { + "$ref": "#/components/schemas/StatusPageItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/UpsertStatusPageComponentResponse" - } - } - } - ] + "required": [ + "items" + ], + "type": "object" + }, + "ListStatusPageTemplatesResponse": { + "description": "Event template list. Item shape depends on the requested `type`: predefined event templates for `pre_defined`, message templates for `message`.", + "properties": { + "items": { + "description": "Templates of the requested category.", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/StatusPagePreDefinedTemplate" }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "component_ids": [ - "01KP032KMN9YFBMPWANJMFZFG1" - ] - } + { + "$ref": "#/components/schemas/StatusPageMessageTemplate" } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" - }, - "500": { - "$ref": "#/components/responses/ServerError" + ] + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertStatusPageComponentRequest" - }, - "example": { - "page_id": 5750613685214, - "components": [ - { - "name": "Web Console", - "description": "Main web interface", - "section_id": "01KC3FKKX5TSVG6Z3X1QNGF6V2", - "order_id": 1 - } - ] - } - } - } - } - } - }, - "/status-page/component/delete": { - "post": { - "operationId": "statusPageComponentDelete", - "summary": "Delete status page component", - "description": "Delete a service component from a status page.", - "tags": [ - "On-call/Status pages" + "required": [ + "items" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-component-delete", - "metadata": { - "sidebarTitle": "Delete status page component" + "type": "object" + }, + "ListWarRoomEnabledResponse": { + "description": "War-room-enabled IM integration list response.", + "properties": { + "items": { + "description": "IM integrations with the war-room feature enabled.", + "items": { + "$ref": "#/components/schemas/WarRoomDataSourceItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" - }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "required": [ + "items" + ], + "type": "object" + }, + "ListWarRoomsRequest": { + "description": "Parameters for listing war rooms linked to an incident.", + "properties": { + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "integration_id": { + "description": "Optional filter: only return war rooms for this IM integration.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteStatusPageComponentRequest" - }, - "example": { - "page_id": 5750613685214, - "component_ids": [ - "01KP032KMN9YFBMPWANJMFZFG1" - ] - } - } - } - } - } - }, - "/status-page/section/upsert": { - "post": { - "operationId": "statusPageSectionUpsert", - "summary": "Upsert status page section", - "description": "Create or update a section on a status page.", - "tags": [ - "On-call/Status pages" + "required": [ + "incident_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-section-upsert", - "metadata": { - "sidebarTitle": "Upsert status page section" + "type": "object" + }, + "ListWarRoomsResponse": { + "description": "List of war rooms associated with the incident.", + "properties": { + "items": { + "description": "War room records.", + "items": { + "$ref": "#/components/schemas/WarRoomItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/UpsertStatusPageSectionResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "section_ids": [ - "01KP032J1FV2H8DDGN0QSJ1CAR" - ] - } - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "ListWebhookHistoryRequest": { + "description": "Filter parameters for listing outbound webhook delivery history. The query is bounded by a required millisecond time window; use `search_after_ctx` for cursor-based pagination.", + "properties": { + "asc": { + "description": "Ascending order by `event_time` when true; otherwise descending.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "end_time": { + "description": "Window end time in Unix milliseconds. Must be greater than `start_time`.", + "format": "int64", + "maximum": 9999999999999, + "minimum": 1000000000000, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "event_types": { + "description": "Filter by event type codes (e.g. `i_new` incident created, `a_new` alert triggered).", + "items": { + "type": "string" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "integration_id": { + "description": "Filter by webhook integration ID.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "limit": { + "description": "Page size.", + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + "orderby": { + "description": "Sort field. Currently only `event_time` is supported.", + "enum": [ + "event_time" + ], + "type": "string" + }, + "ref_id": { + "description": "Reference ID filter (incident or alert ID).", + "maxLength": 128, + "type": "string" + }, + "search_after_ctx": { + "description": "Opaque cursor returned by a previous call for fetching the next page.", + "type": "string" + }, + "start_time": { + "description": "Window start time in Unix milliseconds.", + "format": "int64", + "maximum": 9999999999999, + "minimum": 1000000000000, + "type": "integer" + }, + "status": { + "description": "Filter by delivery status: `success` or `failed`.", + "enum": [ + "success", + "failed" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertStatusPageSectionRequest" - }, - "example": { - "page_id": 5750613685214, - "sections": [ - { - "name": "Core Services", - "description": "Our core services", - "order_id": 1 - } - ] - } - } + "required": [ + "limit", + "start_time", + "end_time" + ], + "type": "object" + }, + "ListWebhookHistoryResponse": { + "description": "Paginated webhook delivery history.", + "properties": { + "items": { + "description": "Webhook delivery records on the current page.", + "items": { + "$ref": "#/components/schemas/WebhookHistoryItem" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor to pass as `search_after_ctx` to fetch the next page. Empty when no further pages are available.", + "type": "string" + }, + "total": { + "description": "Total number of matching records.", + "format": "int64", + "type": "integer" } - } - } - }, - "/status-page/section/delete": { - "post": { - "operationId": "statusPageSectionDelete", - "summary": "Delete status page section", - "description": "Delete a section from a status page.", - "tags": [ - "On-call/Status pages" + }, + "required": [ + "items", + "total", + "search_after_ctx" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-section-delete", - "metadata": { - "sidebarTitle": "Delete status page section" + "type": "object" + }, + "ListWorkItemRequest": { + "description": "Filters for listing work items. At least one of `incident_id`, `post_mortem_id`, or `assignee_id` is required.", + "properties": { + "assignee_id": { + "description": "Restrict results to items assigned to this member ID. Listing by assignee alone requires being that assignee or an account admin.", + "format": "int64", + "type": "integer" + }, + "cursor": { + "description": "Pagination cursor from a previous response's `next_cursor`.", + "type": "string" + }, + "incident_id": { + "description": "Incident ID (MongoDB ObjectID). Also returns follow-ups anchored on the incident's post-mortem.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "item_type": { + "description": "Filter by work item type: `action` action item, `follow_up` post-mortem follow-up.", + "enum": [ + "action", + "follow_up" + ], + "type": "string" + }, + "limit": { + "default": 50, + "description": "Page size, at most 200. Defaults to 50.", + "format": "int64", + "maximum": 200, + "minimum": 0, + "type": "integer" + }, + "post_mortem_id": { + "description": "Post-mortem ID (32-character hex string). Returns follow-ups bound to this post-mortem.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "MCPServerCreateRequest": { + "description": "Configuration for a new MCP server.", + "properties": { + "allow_insecure_oauth_http": { + "description": "Allow this server's OAuth token exchange over plaintext HTTP. Testing use only; defaults to false.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "allow_insecure_tls_skip_verify": { + "description": "Skip TLS certificate verification when connecting to this server. Testing use only; defaults to false.", + "type": "boolean" + }, + "args": { + "description": "Command arguments (stdio transport).", + "items": { + "type": "string" + }, + "type": "array" + }, + "auth_mode": { + "description": "Authentication mode: shared (default), per_user_secret, or per_user_oauth.", + "type": "string" + }, + "call_timeout": { + "description": "Tool-call timeout in seconds. 0 = default (60s).", + "type": "integer" + }, + "command": { + "description": "Executable command (stdio transport).", + "type": "string" + }, + "connect_timeout": { + "description": "Connection timeout in seconds. 0 = default (10s).", + "type": "integer" + }, + "description": { + "description": "Server description.", + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "env": { + "additionalProperties": { + "type": "string" + }, + "description": "Environment variables (stdio transport).", + "type": "object" + }, + "environments": { + "description": "Execution environments this server is callable from: `cloud` and/or BYOC runner environment IDs. Omitted or empty means all environments.", + "items": { + "type": "string" + }, + "type": "array" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "HTTP headers (sse / streamable-http).", + "type": "object" + }, + "oauth_metadata": { + "description": "JSON OAuth metadata; reserved for per_user_oauth.", + "type": "string" + }, + "secret_schema": { + "description": "JSON secret schema; required when auth_mode=per_user_secret.", + "type": "string" + }, + "server_name": { + "description": "MCP server name: must start with a letter and contain only letters, digits, `-`, or `_` (`@` is reserved); unique within its scope (account-wide or one team), case-insensitive.", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "source_template_name": { + "description": "Marketplace template name when created from a connector template.", + "type": "string" + }, + "status": { + "default": "enabled", + "description": "Initial status: `enabled` (default) or `disabled` (created but kept off).", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "team_id": { + "description": "Team scope: 0 = account-wide; >0 = team.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "transport": { + "description": "Transport protocol: `stdio` launches a local process via `command`/`args`/`env`, `sse` / `streamable-http` connects to a remote service via `url`/`headers`.", + "enum": [ + "stdio", + "sse", + "streamable-http" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "url": { + "description": "Server URL (sse / streamable-http transport).", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteStatusPageSectionRequest" - }, - "example": { - "page_id": 5750613685214, - "section_ids": [ - "01KP032J1FV2H8DDGN0QSJ1CAR" - ] - } - } + "required": [ + "server_name", + "description", + "transport" + ], + "type": "object" + }, + "MCPServerDeleteRequest": { + "description": "MCP server deletion by ID.", + "properties": { + "server_id": { + "description": "Target MCP server ID, from the list returned by `POST /safari/mcp/server/list`.", + "type": "string" } - } - } - }, - "/status-page/template/upsert": { - "post": { - "operationId": "statusPageTemplateUpsert", - "summary": "Upsert status page template", - "description": "Create or update an event template for a status page.", - "tags": [ - "On-call/Status pages" + }, + "required": [ + "server_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-template-upsert", - "metadata": { - "sidebarTitle": "Upsert status page template" + "type": "object" + }, + "MCPServerGetRequest": { + "description": "MCP server lookup by ID.", + "properties": { + "server_id": { + "description": "Target MCP server ID, from the list returned by `POST /safari/mcp/server/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/UpsertStatusPageTemplateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "template_id": "01KP0339G5XDEPM4R86T2B23EP" - } - } - } - } + "required": [ + "server_id" + ], + "type": "object" + }, + "MCPServerItem": { + "description": "An MCP server (connector) registered on the account.", + "properties": { + "account_id": { + "description": "Owning account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "ai_description": { + "description": "LLM-generated description, preferred over `description` when present. Omitted when not yet generated.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "allow_insecure_oauth_http": { + "description": "Allow this server's OAuth token exchange over plaintext HTTP; testing use only. Omitted when false.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "allow_insecure_tls_skip_verify": { + "description": "Skip TLS certificate verification when connecting to this server; testing use only. Omitted when false.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpsertStatusPageTemplateRequest" - }, - "example": { - "page_id": 5720156736380, - "type": "pre_defined", - "template": { - "title": "Service Disruption", - "status": "investigating", - "description": "We are investigating a service disruption affecting some users.", - "type": "incident" - } - } - } - } - } - } - }, - "/status-page/template/delete": { - "post": { - "operationId": "statusPageTemplateDelete", - "summary": "Delete status page template", - "description": "Delete an event template from a status page.", - "tags": [ - "On-call/Status pages" - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Status Pages Manage** (`on-call`) |", - "href": "/en/api-reference/on-call/status-pages/status-page-template-delete", - "metadata": { - "sidebarTitle": "Delete status page template" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "args": { + "description": "Command arguments (stdio transport).", + "items": { + "type": "string" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "auth_mode": { + "description": "Authentication mode. One of: `shared` (a single static credential saved on the resource and shared by all callers in the account; the default — an empty value behaves the same), `per_user_secret` (each user stores their own secret per `secret_schema`, injected per user at runtime), `per_user_oauth` (each user completes their own OAuth grant; discovery and registration run lazily on first use).", + "enum": [ + "shared", + "per_user_secret", + "per_user_oauth" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "call_timeout": { + "description": "Tool-call timeout in seconds (0 = server default, 60s).", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "can_edit": { + "description": "Whether the caller may edit this server.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteStatusPageTemplateRequest" - }, - "example": { - "page_id": 5720156736380, - "type": "pre_defined", - "template_id": "01KP0339G5XDEPM4R86T2B23EP" - } - } - } - } - } - }, - "/status-page/template/list": { - "get": { - "operationId": "statusPageTemplateList", - "summary": "List status page templates", - "description": "List all event templates for a status page.", - "tags": [ - "On-call/Status pages" - ], - "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 |", - "href": "/en/api-reference/on-call/status-pages/status-page-template-list", - "metadata": { - "sidebarTitle": "List status page templates" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListStatusPageTemplatesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "template_id": "01KC8KP6PHVPSCAB0BTKZBN2HR", - "title": "Service Disruption", - "type": "incident", - "status": "identified", - "description": "We have identified the root cause." - } - ] - } - } - } - } + "command": { + "description": "Executable command (stdio transport only).", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "connect_timeout": { + "description": "Connection timeout in seconds (0 = server default, 10s).", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "created_at": { + "description": "Creation time. Unix timestamp in milliseconds.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_by": { + "description": "Member ID that created the server.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "parameters": [ - { - "name": "page_id", - "in": "query", - "required": true, - "schema": { - "type": "integer", - "format": "int64" + "description": { + "description": "Server description.", + "type": "string" + }, + "env": { + "additionalProperties": { + "type": "string" }, - "description": "Status page ID." + "description": "Environment variables (stdio transport). Secret values are masked.", + "type": "object" }, - { - "name": "type", - "in": "query", - "required": true, - "schema": { - "type": "string", - "enum": [ - "pre_defined", - "message" - ] + "environments": { + "description": "Execution environments this server is callable from (`cloud` and/or BYOC runner environment IDs). Always present; `[]` means all environments (also the value on legacy rows created before this field).", + "items": { + "type": "string" }, - "description": "Template category. `pre_defined` returns predefined event templates; `message` returns message notification templates." - } - ] - } - }, - "/safari/a2a-agent/create": { - "post": { - "operationId": "remote-agent-write-create", - "summary": "Create A2A agent", - "description": "Register a new A2A remote agent from its agent-card URL.", - "tags": [ - "AI SRE/A2A agents" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Agent Manage** (`ai-sre`) |\n\n## Usage\n\n- `instructions` is required; a deprecated `description` field is still accepted for legacy clients and, if both are sent, must exactly match `instructions`.\n- `card_url` must be an absolute `http`/`https` URL with a non-empty host (reachability is enforced by the execution environment, not here); `auth_type` accepts only `none`, `api_key`, or `bearer`.\n- `environments` restricts where the agent can run: a list of `cloud` and/or BYOC runner environment IDs; omitted or empty means all environments, and each runner must be visible to the caller.\n- Creating into a team (`team_id > 0`) requires the caller to actually belong to that team; only the account owner/admin may create at account scope (`team_id=0`).\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-write-create", - "metadata": { - "sidebarTitle": "Create A2A agent" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/A2AAgentCreateResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D" - } - } - } - } + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "HTTP headers (sse / streamable-http). Secret values are masked.", + "type": "object" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "oauth_metadata": { + "description": "JSON-encoded OAuth metadata (per_user_oauth mode).", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "proxy_url": { + "description": "Outbound proxy URL used to reach the server.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "secret_schema": { + "description": "JSON-encoded secret schema (per_user_secret mode).", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentCreateRequest" - }, - "example": { - "agent_name": "deploy-bot", - "instructions": "Inspect deployment pipelines and propose rollbacks when a canary fails health checks.", - "card_url": "https://agents.example.com/deploy-bot/card", - "auth_type": "bearer", - "streaming": true, - "team_id": 0, - "environments": [ - "env_8s7Hn2kLpQ3xYbVc4Wd2m" - ] - } - } - } - } - } - }, - "/safari/a2a-agent/delete": { - "post": { - "operationId": "remote-agent-write-delete", - "summary": "Delete A2A agent", - "description": "Soft-delete an A2A agent by ID.", - "tags": [ - "AI SRE/A2A agents" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Agent Manage** (`ai-sre`) |\n\n## Usage\n\n- Delete is a soft delete; the agent stops appearing in list/get and can no longer be dispatched once removed.\n- Requires edit permission (`access.CanEdit`) on the agent's team.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-write-delete", - "metadata": { - "sidebarTitle": "Delete A2A agent" + "server_id": { + "description": "Unique MCP server ID (prefix `mcp_`).", + "type": "string" + }, + "server_name": { + "description": "MCP server name, unique within its scope (account-wide or one team), case-insensitive.", + "type": "string" + }, + "source_template_name": { + "description": "Marketplace template this connector was installed from; empty for user-authored.", + "type": "string" + }, + "status": { + "description": "Server status.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "team_id": { + "description": "Team scope: 0 = account-wide; >0 = the owning team.", + "format": "int64", + "type": "integer" + }, + "transport": { + "description": "Transport protocol. One of: `stdio` (standard I/O to a local subprocess), `sse` (standalone SSE, the legacy MCP transport), `streamable-http` (the newer HTTP streaming transport).", + "enum": [ + "stdio", + "sse", + "streamable-http" + ], + "type": "string" + }, + "updated_at": { + "description": "Last update time. Unix timestamp in milliseconds.", + "format": "int64", + "type": "integer" + }, + "url": { + "description": "Server URL (sse / streamable-http transport).", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "required": [ + "server_id", + "account_id", + "team_id", + "can_edit", + "server_name", + "description", + "transport", + "status", + "connect_timeout", + "call_timeout", + "created_by", + "created_at", + "updated_at", + "environments" + ], + "type": "object" + }, + "MCPServerListRequest": { + "description": "Pagination, scope, and search filters for listing MCP servers.", + "properties": { + "include_account": { + "description": "Include account-scoped (team_id=0) rows. Defaults to true.", + "type": [ + "boolean", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "default": 20, + "description": "Page size.", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "p": { + "default": 1, + "description": "Page number, 1-based.", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "query": { + "description": "Case-insensitive substring search across name, description, AI-generated description, server ID, transport, URL, command, and source template name.", + "maxLength": 128, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "scope": { + "description": "Restrict results to a scope: `account` for account-wide rows only, `team` for the caller's own visible team rows only, or omit (defaults to `all`) for both, subject to team_ids/include_account.", + "enum": [ + "all", + "account", + "team" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "team_ids": { + "description": "Filter to these team IDs; empty = the caller's visible set.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentIDRequest" - }, - "example": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D" - } - } - } - } - } - }, - "/safari/a2a-agent/disable": { - "post": { - "operationId": "remote-agent-write-disable", - "summary": "Disable A2A agent", - "description": "Disable an enabled A2A agent.", - "tags": [ - "AI SRE/A2A agents" - ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MCPServerListResponse": { + "description": "Paginated MCP server list.", + "properties": { + "servers": { + "description": "MCP servers on this page.", + "items": { + "$ref": "#/components/schemas/MCPServerItem" + }, + "type": "array" + }, + "total": { + "description": "Total number of matching servers.", + "format": "int64", + "type": "integer" } + }, + "required": [ + "total", + "servers" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Agent Manage** (`ai-sre`) |\n\n## Usage\n\n- Requires edit permission (`access.CanEdit`) on the agent's team.\n- Returns `InvalidParameter` if the agent is already disabled.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-write-disable", - "metadata": { - "sidebarTitle": "Disable A2A agent" + "type": "object" + }, + "MCPServerStatusRequest": { + "description": "MCP server enable/disable by ID.", + "properties": { + "server_id": { + "description": "Target MCP server ID, from the list returned by `POST /safari/mcp/server/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "required": [ + "server_id" + ], + "type": "object" + }, + "MCPServerUpdateRequest": { + "description": "Partial update of an MCP server. Omit a field to leave it unchanged.", + "properties": { + "allow_insecure_oauth_http": { + "description": "Allow OAuth token exchange over plaintext HTTP. Omit to leave unchanged.", + "type": [ + "boolean", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "allow_insecure_tls_skip_verify": { + "description": "Skip TLS certificate verification. Omit to leave unchanged.", + "type": [ + "boolean", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "args": { + "description": "Command arguments (`stdio` transport); replaces the whole list — pass `[]` to clear, omit to leave unchanged.", + "items": { + "type": "string" + }, + "type": "array" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "auth_mode": { + "description": "Authentication mode: shared (default), per_user_secret, or per_user_oauth.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "call_timeout": { + "description": "Tool-call timeout in seconds. 0 = default (60s).", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "command": { + "description": "Executable command (stdio transport).", + "type": "string" + }, + "connect_timeout": { + "description": "Connection timeout in seconds. 0 = default (10s).", + "type": "integer" + }, + "description": { + "description": "New description; omitted or empty leaves it unchanged.", + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + "env": { + "additionalProperties": { + "type": "string" + }, + "description": "Environment variables (`stdio` transport); replaces the whole map, but a sensitive key sent back masked or as an empty string keeps its stored value; omit to leave unchanged.", + "type": "object" + }, + "environments": { + "description": "Execution environments this server is callable from: `cloud` and/or BYOC runner environment IDs. Omit (null) to leave unchanged; send a list to set it — an empty list clears the restriction back to all environments.", + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "HTTP headers (`sse` / `streamable-http` transport); replaces the whole map, with the same masked/empty-value preservation as `env`; omit to leave unchanged.", + "type": "object" + }, + "oauth_metadata": { + "description": "JSON OAuth metadata; reserved for per_user_oauth.", + "type": "string" + }, + "secret_schema": { + "description": "JSON secret schema; required when auth_mode=per_user_secret.", + "type": "string" + }, + "server_id": { + "description": "Target MCP server ID, from the list returned by `POST /safari/mcp/server/list`.", + "type": "string" + }, + "server_name": { + "description": "New name; omitted or empty leaves it unchanged.", + "maxLength": 255, + "minLength": 1, + "type": "string" + }, + "team_id": { + "description": "Reassign team scope: 0 = account-wide; >0 = team. Omit to leave unchanged.", + "format": "int64", + "type": [ + "integer", + "null" + ] + }, + "transport": { + "description": "Transport protocol; when switching, also supply the matching fields (`command`/`args`/`env` for `stdio`, `url`/`headers` for `sse` / `streamable-http`); omitted or empty leaves it unchanged.", + "enum": [ + "stdio", + "sse", + "streamable-http" + ], + "type": "string" + }, + "url": { + "description": "Server URL (sse / streamable-http transport).", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentIDRequest" - }, - "example": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D" - } - } - } - } - } - }, - "/safari/a2a-agent/enable": { - "post": { - "operationId": "remote-agent-write-enable", - "summary": "Enable A2A agent", - "description": "Enable a disabled A2A agent.", - "tags": [ - "AI SRE/A2A agents" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "server_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Agent Manage** (`ai-sre`) |\n\n## Usage\n\n- Requires edit permission (`access.CanEdit`) on the agent's team, not just visibility into it.\n- Returns `InvalidParameter` if the agent is already enabled.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-write-enable", - "metadata": { - "sidebarTitle": "Enable A2A agent" + "type": "object" + }, + "ManualRunRuleResult": { + "description": "Result of manually running an Automation rule outside its schedule.", + "properties": { + "preflight": { + "$ref": "#/components/schemas/PreflightResult" + }, + "rule_id": { + "description": "Rule ID that was run.", + "type": "string" + }, + "run": { + "$ref": "#/components/schemas/AutomationRunView" + }, + "trigger_kind": { + "description": "Always manual for this operation.", + "enum": [ + "manual" + ], + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "required": [ + "rule_id", + "trigger_kind", + "preflight" + ], + "type": "object" + }, + "MappingAPICreateRequest": { + "properties": { + "api_name": { + "description": "Unique API name (max 199 chars).", + "maxLength": 199, + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "description": { + "description": "Optional description. Values longer than 500 characters are silently truncated.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom HTTP request headers. In SaaS mode, security-sensitive names (`authorization`, `cookie`, `x-forwarded-for`, etc.) are rejected; keys must be RFC 7230 token characters (max 1024 chars) and values max 4096 chars.", + "type": "object" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "insecure_skip_verify": { + "description": "Skip TLS certificate verification. Default `false`.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "retry_count": { + "description": "Number of retries on failure (0–1). Default 0.", + "maximum": 1, + "minimum": 0, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "team_id": { + "description": "Owning team ID; obtain it from `POST /team/list`.", + "format": "int64", + "type": "integer" + }, + "timeout": { + "description": "Request timeout in seconds (1–3). Default 2.", + "maximum": 3, + "minimum": 1, + "type": "integer" + }, + "url": { + "description": "HTTP/HTTPS endpoint URL (max 500 chars).", + "format": "uri", + "maxLength": 500, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentIDRequest" - }, - "example": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D" - } - } - } - } - } - }, - "/safari/a2a-agent/get": { - "post": { - "operationId": "remote-agent-read-get", - "summary": "Get A2A agent detail", - "description": "Get one A2A agent by ID.", - "tags": [ - "AI SRE/A2A agents" + "required": [ + "api_name", + "url" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MappingAPICreateResponse": { + "properties": { + "api_id": { + "description": "Created API ID (MongoDB ObjectID hex).", + "type": "string" + }, + "api_name": { + "description": "API name.", + "type": "string" } + }, + "required": [ + "api_id", + "api_name" ], - "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- `card_resolve_timeout` and `task_timeout` are always `0` today — the API does not yet expose a way to set them.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-read-get", - "metadata": { - "sidebarTitle": "Get A2A agent detail" + "type": "object" + }, + "MappingAPIIDRequest": { + "properties": { + "api_id": { + "description": "Mapping API ID (MongoDB ObjectID hex).", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/A2AAgentItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D", - "account_id": 10023, - "team_id": 0, - "can_edit": true, - "environments": [ - "env_8s7Hn2kLpQ3xYbVc4Wd2m" - ], - "agent_name": "deploy-bot", - "instructions": "Inspect deployment pipelines and propose rollbacks when a canary fails health checks.", - "card_url": "https://agents.example.com/deploy-bot/card", - "auth_type": "bearer", - "streaming": true, - "status": "enabled", - "agent_card_name": "Deploy Bot", - "agent_card_skills": [ - "rollback", - "diff" - ], - "card_resolve_timeout": 0, - "task_timeout": 0, - "auth_mode": "shared", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000 - } - } - } - } + "required": [ + "api_id" + ], + "type": "object" + }, + "MappingAPIItem": { + "description": "Mapping API configuration.", + "properties": { + "api_id": { + "description": "API ID (MongoDB ObjectID hex).", + "type": "string" + }, + "api_name": { + "description": "API name.", + "type": "string" + }, + "created_at": { + "description": "Creation time, Unix seconds. Omitted when 0 (legacy records).", + "format": "int64", + "type": "integer" + }, + "creator_id": { + "description": "Creator member ID.", + "format": "int64", + "type": "integer" + }, + "deleted_at": { + "description": "Deletion time, Unix seconds. Omitted when the API has not been soft-deleted.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Description.", + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom request headers. `null` when none are configured.", + "type": [ + "object", + "null" + ] + }, + "insecure_skip_verify": { + "description": "Whether TLS verification is skipped.", + "type": "boolean" + }, + "retry_count": { + "description": "Retry count.", + "type": "integer" + }, + "status": { + "description": "API status: `enabled` or `deleted` (soft-deleted). The list endpoint excludes `deleted` items; the info endpoint may return them.", + "enum": [ + "enabled", + "deleted" + ], + "type": "string" + }, + "team_id": { + "description": "Owning team ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "timeout": { + "description": "Request timeout in seconds.", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "updated_at": { + "description": "Last update time, Unix seconds. Omitted when 0 (legacy records).", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "updated_by": { + "description": "Last updater member ID.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "url": { + "description": "Endpoint URL.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentIDRequest" - }, - "example": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D" - } - } - } - } - } - }, - "/safari/a2a-agent/list": { - "post": { - "operationId": "remote-agent-read-list", - "summary": "List A2A agents", - "description": "List A2A agents visible to the caller across account and team scopes, with pagination.", - "tags": [ - "AI SRE/A2A agents" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "api_id", + "api_name", + "description", + "url", + "headers", + "timeout", + "retry_count", + "insecure_skip_verify", + "status", + "team_id", + "updated_by", + "creator_id" ], - "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- Pagination uses `offset`/`limit` (not `p`/`limit`).\n- `scope=account` restricts to account-scoped agents; `scope=team` restricts to the caller's visible teams; the default `all` combines both, subject to `include_account`.\n- `query` performs a case-insensitive substring search across agent name, instructions, card URL, agent ID, and the resolved card name.\n- `card_resolve_timeout` and `task_timeout` are always `0` today — the API does not yet expose a way to set them.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-read-list", - "metadata": { - "sidebarTitle": "List A2A agents" + "type": "object" + }, + "MappingAPIListResponse": { + "properties": { + "items": { + "description": "Mapping APIs.", + "items": { + "$ref": "#/components/schemas/MappingAPIItem" + }, + "type": "array" + }, + "total": { + "description": "Total API count.", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/A2AAgentListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D", - "account_id": 10023, - "team_id": 0, - "can_edit": true, - "environments": [ - "env_8s7Hn2kLpQ3xYbVc4Wd2m" - ], - "agent_name": "deploy-bot", - "instructions": "Inspect deployment pipelines and propose rollbacks when a canary fails health checks.", - "card_url": "https://agents.example.com/deploy-bot/card", - "auth_type": "bearer", - "streaming": true, - "status": "enabled", - "agent_card_name": "Deploy Bot", - "agent_card_skills": [ - "rollback", - "diff" - ], - "card_resolve_timeout": 0, - "task_timeout": 0, - "auth_mode": "shared", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000 - } - ], - "total": 1 - } - } - } - } + "required": [ + "total", + "items" + ], + "type": "object" + }, + "MappingAPIUpdateRequest": { + "properties": { + "api_id": { + "description": "Mapping API ID (MongoDB ObjectID hex).", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "api_name": { + "description": "New API name (max 199 chars).", + "maxLength": 199, + "type": [ + "string", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "New description.", + "type": [ + "string", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "headers": { + "additionalProperties": { + "type": "string" + }, + "description": "Custom HTTP request headers. In SaaS mode, security-sensitive names (`authorization`, `cookie`, `x-forwarded-for`, etc.) are rejected; keys must be RFC 7230 token characters (max 1024 chars) and values max 4096 chars.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" + "insecure_skip_verify": { + "description": "New TLS skip-verify setting.", + "type": [ + "boolean", + "null" + ] + }, + "retry_count": { + "description": "New retry count.", + "maximum": 1, + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "team_id": { + "description": "New owning team ID; obtain it from `POST /team/list`.", + "format": "int64", + "type": [ + "integer", + "null" + ] + }, + "timeout": { + "description": "New timeout in seconds.", + "maximum": 3, + "minimum": 1, + "type": [ + "integer", + "null" + ] + }, + "url": { + "description": "New endpoint URL (max 500 chars).", + "format": "uri", + "maxLength": 500, + "type": [ + "string", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentListRequest" - }, - "example": { - "offset": 0, - "limit": 20, - "include_account": true - } - } - } - } - } - }, - "/safari/a2a-agent/update": { - "post": { - "operationId": "remote-agent-write-update", - "summary": "Update A2A agent", - "description": "Apply a partial update to an A2A agent. Omit a field to leave it unchanged.", - "tags": [ - "AI SRE/A2A agents" + "required": [ + "api_id" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MappingDataDeleteRequest": { + "properties": { + "keys": { + "description": "Keys of rows to delete.", + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "schema_id": { + "description": "Mapping schema ID (MongoDB ObjectID hex).", + "type": "string" } + }, + "required": [ + "schema_id", + "keys" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Agent Manage** (`ai-sre`) |\n\n## Usage\n\n- Requires edit permission (`access.CanEdit`) on the agent's *current* team before any field may change.\n- Reassigning `team_id` requires rights on the destination team; if the team changes without also sending a new environment binding, the existing runner binding must remain selectable by the caller or the update is rejected.\n- Changing `auth_mode` always rewrites `secret_schema` together with it; omitting `oauth_metadata` alongside a new `auth_mode` clears it to empty.\n- Sending back a masked or empty value for a sensitive `auth_config` key (`api_key`, `token`, `client_secret`) keeps the stored secret instead of overwriting it.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/a2a-agents/remote-agent-write-update", - "metadata": { - "sidebarTitle": "Update A2A agent" + "type": "object" + }, + "MappingDataItem": { + "description": "A single mapping data row.", + "properties": { + "created_at": { + "description": "Creation time, Unix seconds. Omitted when 0.", + "format": "int64", + "type": "integer" + }, + "fields": { + "additionalProperties": { + "type": "string" + }, + "description": "All label key-value pairs of this row. Omitted when empty.", + "type": "object" + }, + "key": { + "description": "Composite row key — MD5 of the row's source label values (sorted by label name, joined with `:`). Omitted when empty.", + "type": "string" + }, + "updated_at": { + "description": "Last update time, Unix seconds. Omitted when 0.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "type": "object" + }, + "MappingDataListRequest": { + "properties": { + "asc": { + "description": "Sort ascending when `true`.", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "description": "Page size (0–100); defaults to 20 when omitted, `null`, or 0.", + "format": "int64", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "orderby": { + "description": "Sort field. Defaults to `updated_at`.", + "enum": [ + "created_at", + "updated_at" + ], + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "p": { + "description": "Page number (1-based) for offset pagination; defaults to 1 when omitted, `null`, or 0. Ignored when `search_after_ctx` is set. Page-based navigation can reach at most 10,000 rows (`p * limit <= 10000`).", + "format": "int64", + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "query": { + "additionalProperties": { + "type": "string" + }, + "description": "Exact-match filter on source label values. Keys that are not source labels of the schema are silently ignored; if any source label is given, all source labels must be provided.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" + "schema_id": { + "description": "Mapping schema ID (MongoDB ObjectID hex).", + "type": "string" + }, + "search_after_ctx": { + "description": "Opaque cursor for cursor-based pagination — pass the `search_after_ctx` value from the previous response. Must be a MongoDB ObjectID hex string; when set, `p` is ignored.", + "type": [ + "string", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/A2AAgentUpdateRequest" - }, - "example": { - "agent_id": "a2a_6mWqZ2pK9nLcR3tY8uVb4D", - "instructions": "Inspect deployment pipelines and propose rollbacks." - } - } + "required": [ + "schema_id" + ], + "type": "object" + }, + "MappingDataListResponse": { + "properties": { + "has_next_page": { + "description": "Whether more pages exist.", + "type": "boolean" + }, + "items": { + "description": "Data rows.", + "items": { + "$ref": "#/components/schemas/MappingDataItem" + }, + "type": "array" + }, + "search_after_ctx": { + "description": "Cursor token (ObjectID hex of this page's last row) for fetching the next page. Omitted when there is no next page.", + "type": "string" + }, + "total": { + "description": "Total matching rows.", + "format": "int64", + "type": "integer" } - } - } - }, - "/safari/automation/rule/create": { - "post": { - "operationId": "automation-rule-write-create", - "summary": "Create Automation rule", - "description": "Create an Automation rule with schedule, HTTP POST, and On-call incident triggers.", - "tags": [ - "AI SRE/Automations" + }, + "required": [ + "items", + "total", + "has_next_page" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MappingDataUpsertRequest": { + "properties": { + "docs": { + "description": "Rows to insert or update. Each row must include all source and result labels; unknown labels are silently dropped; a value longer than 2048 characters is rejected.", + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "maxItems": 1000, + "type": "array" + }, + "schema_id": { + "description": "Mapping schema ID (MongoDB ObjectID hex).", + "type": "string" } + }, + "required": [ + "schema_id", + "docs" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | Valid `app_key`; management operations require the caller to manage the target rule |\n\n## Usage\n\n- A caller may create personal rules and rules for any team in the current account; `team_id` can be reassigned later via update (converting a team rule to personal is owner-only; moving into a team requires the caller to belong to it).\n- `cron_expr` is evaluated in `timezone` if provided, else the caller's member timezone, else the account timezone, else the server default (Asia/Shanghai).\n- `http_post_trigger_enabled=true` creates and enables an HTTP POST trigger; the response's `http_post_token` is a one-time value returned only on creation — save it immediately.\n- `oncall_incident_trigger_enabled=true` requires at least one `oncall_incident_channel_ids` entry and one `oncall_incident_severities` value; matching incidents run with `trigger_kind=oncall_incident`.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/automations/automation-rule-write-create", - "metadata": { - "sidebarTitle": "Create Automation rule" + "type": "object" + }, + "MappingDataUpsertResponse": { + "properties": { + "keys": { + "description": "Composite keys of upserted rows.", + "items": { + "type": "string" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AutomationRuleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "account_id": 10023, - "team_id": 123, - "owner_id": 80011, - "name": "Weekly on-call review", - "enabled": true, - "run_scope": "team", - "cron_expr": "0 9 * * 1", - "timezone": "Asia/Shanghai", - "prompt": "Summarize last week's alert noise and escalation load.", - "environment_kind": "", - "environment_id": "", - "schedule_trigger_id": "atrig_6aKp3wT9mQ2xVc8bR1nY7z", - "schedule_trigger_enabled": true, - "http_post_trigger_id": "atrig_2bLq4xT8mP1sWd9cN3rF6y", - "http_post_trigger_url": "/safari/automation/triggers/atrig_2bLq4xT8mP1sWd9cN3rF6y/fire", - "http_post_trigger_enabled": true, - "can_edit": true, - "created_at": 1780367971228, - "updated_at": 1780367971228, - "http_post_token": "sat_yQ9p8V7n6M5k4J3h2G1f0E9d8C7b6A5z4Y3x2W1v0U", - "schedule_next_fire_at_ms": 1780630800000, - "oncall_incident_trigger_id": "atrig_9cVb2mN7qKs4dEa8T1rY5p", - "oncall_incident_trigger_enabled": true, - "oncall_incident_channel_ids": [ - 456 - ], - "oncall_incident_severities": [ - "Critical", - "Warning" - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "keys" + ], + "type": "object" + }, + "MappingSchemaCreateRequest": { + "properties": { + "description": { + "description": "Optional description (max 500 chars).", + "maxLength": 500, + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "result_labels": { + "description": "Output label names written on a match (1–10). Each must match `^[a-zA-Z_][a-zA-Z0-9_]*$`; entries must be unique and must not overlap with `source_labels`.", + "items": { + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$", + "type": "string" + }, + "maxItems": 10, + "type": "array", + "uniqueItems": true }, - "403": { - "$ref": "#/components/responses/Forbidden" + "schema_name": { + "description": "Unique schema name (max 39 chars).", + "maxLength": 39, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "source_labels": { + "description": "Lookup key label names (1–3). Each must match `^[a-zA-Z_][a-zA-Z0-9_]*$`; entries must be unique and must not overlap with `result_labels`.", + "items": { + "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$", + "type": "string" + }, + "maxItems": 3, + "type": "array", + "uniqueItems": true }, - "500": { - "$ref": "#/components/responses/ServerError" + "team_id": { + "description": "Owning team ID. `0` means no team.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRuleCreateRequest" - }, - "example": { - "name": "Weekly on-call review", - "team_id": 123, - "enabled": true, - "cron_expr": "0 9 * * 1", - "timezone": "Asia/Shanghai", - "schedule_trigger_enabled": true, - "prompt": "Summarize last week's alert noise and escalation load.", - "http_post_trigger_enabled": true, - "oncall_incident_trigger_enabled": true, - "oncall_incident_channel_ids": [ - 456 - ], - "oncall_incident_severities": [ - "Critical", - "Warning" - ] - } - } - } - } - } - }, - "/safari/automation/rule/delete": { - "post": { - "operationId": "automation-rule-write-delete", - "summary": "Delete Automation rule", - "description": "Delete an Automation rule.", - "tags": [ - "AI SRE/Automations" + "required": [ + "schema_name", + "source_labels", + "result_labels" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MappingSchemaCreateResponse": { + "properties": { + "schema_id": { + "description": "Created schema ID (MongoDB ObjectID hex).", + "type": "string" + }, + "schema_name": { + "description": "Schema name.", + "type": "string" } + }, + "required": [ + "schema_id", + "schema_name" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | Valid `app_key`; management operations require the caller to manage the target rule |\n\n## Usage\n\n- Deleting a rule also removes its schedule, HTTP POST, and On-call incident triggers; a deleted HTTP POST trigger's token stops working immediately.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/automations/automation-rule-write-delete", - "metadata": { - "sidebarTitle": "Delete Automation rule" + "type": "object" + }, + "MappingSchemaIDRequest": { + "properties": { + "schema_id": { + "description": "Mapping schema ID (MongoDB ObjectID hex).", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "required": [ + "schema_id" + ], + "type": "object" + }, + "MappingSchemaItem": { + "description": "Mapping schema definition.", + "properties": { + "created_at": { + "description": "Creation time, Unix seconds. Omitted when 0 (legacy records).", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "creator_id": { + "description": "Creator member ID.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "deleted_at": { + "description": "Deletion time, Unix seconds. Omitted when the schema has not been soft-deleted.", + "format": "int64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "description": { + "description": "Schema description.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "result_labels": { + "description": "Output label names.", + "items": { + "type": "string" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "schema_id": { + "description": "Schema ID (MongoDB ObjectID hex).", + "type": "string" + }, + "schema_name": { + "description": "Schema name.", + "type": "string" + }, + "source_labels": { + "description": "Lookup key label names.", + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "description": "Schema status: `enabled` or `deleted` (soft-deleted). The list endpoint excludes `deleted` items; the info endpoint may return them.", + "enum": [ + "enabled", + "deleted" + ], + "type": "string" + }, + "team_id": { + "description": "Owning team ID.", + "format": "int64", + "type": "integer" + }, + "updated_at": { + "description": "Last update time, Unix seconds. Omitted when 0 (legacy records).", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "Last updater member ID.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRuleIDRequest" - }, - "example": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b" - } - } - } - } - } - }, - "/safari/automation/rule/get": { - "post": { - "operationId": "automation-rule-read-get", - "summary": "Get Automation rule", - "description": "Get one Automation rule by ID.", - "tags": [ - "AI SRE/Automations" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "schema_id", + "schema_name", + "description", + "source_labels", + "result_labels", + "status", + "team_id", + "updated_by", + "creator_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Valid `app_key`; caller must manage the target rule |\n\n## Usage\n\n- Manage rights mean the personal rule owner; for team rules, an account admin or a member of the rule's team.\n", - "href": "/en/api-reference/ai-sre/automations/automation-rule-read-get", - "metadata": { - "sidebarTitle": "Get Automation rule" + "type": "object" + }, + "MappingSchemaListResponse": { + "properties": { + "items": { + "description": "Mapping schemas.", + "items": { + "$ref": "#/components/schemas/MappingSchemaItem" + }, + "type": "array" + }, + "total": { + "description": "Total schema count.", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AutomationRuleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "account_id": 10023, - "team_id": 123, - "owner_id": 80011, - "name": "Weekly on-call review", - "enabled": true, - "run_scope": "team", - "cron_expr": "0 9 * * 1", - "timezone": "Asia/Shanghai", - "prompt": "Summarize last week's alert noise and escalation load.", - "environment_kind": "", - "environment_id": "", - "schedule_trigger_id": "atrig_6aKp3wT9mQ2xVc8bR1nY7z", - "schedule_trigger_enabled": true, - "http_post_trigger_id": "atrig_2bLq4xT8mP1sWd9cN3rF6y", - "http_post_trigger_url": "/safari/automation/triggers/atrig_2bLq4xT8mP1sWd9cN3rF6y/fire", - "http_post_trigger_enabled": true, - "can_edit": true, - "created_at": 1780367971228, - "updated_at": 1780367971228, - "schedule_next_fire_at_ms": 1780630800000, - "oncall_incident_trigger_id": "atrig_9cVb2mN7qKs4dEa8T1rY5p", - "oncall_incident_trigger_enabled": true, - "oncall_incident_channel_ids": [ - 456 - ], - "oncall_incident_severities": [ - "Critical", - "Warning" - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "required": [ + "total", + "items" + ], + "type": "object" + }, + "MappingSchemaUpdateRequest": { + "properties": { + "description": { + "description": "New description (max 500 chars).", + "maxLength": 500, + "type": [ + "string", + "null" + ] }, - "403": { - "$ref": "#/components/responses/Forbidden" + "schema_id": { + "description": "Schema ID (MongoDB ObjectID hex).", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "schema_name": { + "description": "New schema name (max 39 chars).", + "maxLength": 39, + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "team_id": { + "description": "New owning team ID. `0` removes the team association.", + "format": "int64", + "type": [ + "integer", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRuleIDRequest" - }, - "example": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b" - } - } - } - } - } - }, - "/safari/automation/rule/list": { - "post": { - "operationId": "automation-rule-read-list", - "summary": "List Automation rules", - "description": "List Automation rules visible to the caller.", - "tags": [ - "AI SRE/Automations" + "required": [ + "schema_id" ], - "security": [ + "type": "object" + }, + "MemberDeleteRequest": { + "anyOf": [ { - "AppKeyAuth": [] + "required": [ + "member_id" + ] + }, + { + "required": [ + "member_name" + ] + }, + { + "required": [ + "email" + ] + }, + { + "required": [ + "phone" + ] + }, + { + "required": [ + "ref_id" + ] } ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Valid `app_key`; results are filtered to the caller's visible scope |\n\n## Usage\n\n- `all` returns your personal rules plus team rules you can access.\n- Account admins see all team rules in list results, but not other users' personal rules.\n- `team_ids` narrows the visible set and never expands access.\n", - "href": "/en/api-reference/ai-sre/automations/automation-rule-read-list", - "metadata": { - "sidebarTitle": "List Automation rules" + "description": "Delete member request (provide one of the lookup fields)", + "properties": { + "country_code": { + "description": "Region hint for parsing `phone` when it has no \"+\" prefix — an ISO 3166-1 alpha-2 code such as \"CN\" (the default when omitted). Legacy digit calling codes like \"86\" are still accepted in this parsing context.", + "type": "string" + }, + "email": { + "description": "Email address. Only used when neither `member_id` nor `member_name` is provided", + "type": "string" + }, + "is_force": { + "default": false, + "description": "Force delete. Defaults to false, which checks for references from escalation rules, schedules, etc. Set to true to skip the reference check and delete immediately", + "type": "boolean" + }, + "member_id": { + "description": "Member ID. When several lookup fields are provided, the first non-empty one wins in the order `member_id` > `member_name` > `email` > `phone` > `ref_id`", + "format": "uint64", + "type": "integer" + }, + "member_name": { + "description": "Member name. Only used when `member_id` is not provided", + "type": "string" + }, + "phone": { + "description": "Phone number. Only used when `member_id`, `member_name`, and `email` are all absent", + "type": "string" + }, + "ref_id": { + "description": "External reference ID. Only used when all other lookup fields are absent", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AutomationRuleListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "rules": [ - { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "account_id": 10023, - "team_id": 123, - "owner_id": 80011, - "name": "Weekly on-call review", - "enabled": true, - "run_scope": "team", - "cron_expr": "0 9 * * 1", - "timezone": "Asia/Shanghai", - "prompt": "Summarize last week's alert noise and escalation load.", - "environment_kind": "", - "environment_id": "", - "schedule_trigger_id": "atrig_6aKp3wT9mQ2xVc8bR1nY7z", - "schedule_trigger_enabled": true, - "http_post_trigger_id": "atrig_2bLq4xT8mP1sWd9cN3rF6y", - "http_post_trigger_url": "/safari/automation/triggers/atrig_2bLq4xT8mP1sWd9cN3rF6y/fire", - "http_post_trigger_enabled": true, - "can_edit": true, - "created_at": 1780367971228, - "updated_at": 1780367971228, - "schedule_next_fire_at_ms": 1780630800000, - "oncall_incident_trigger_id": "atrig_9cVb2mN7qKs4dEa8T1rY5p", - "oncall_incident_trigger_enabled": true, - "oncall_incident_channel_ids": [ - 456 - ], - "oncall_incident_severities": [ - "Critical", - "Warning" - ] - } - ] - } - } - } - } + "type": "object" + }, + "MemberEmptyObject": { + "description": "Empty response", + "properties": {}, + "type": "object" + }, + "MemberInfoRequest": { + "description": "Get member info request", + "properties": {}, + "type": "object" + }, + "MemberInfoResponse": { + "description": "Current member profile", + "properties": { + "account_avatar": { + "description": "Account avatar URL", + "type": "string" + }, + "account_email": { + "description": "Account email", + "type": "string" + }, + "account_id": { + "description": "Account ID", + "format": "uint64", + "type": "integer" + }, + "account_locale": { + "description": "Account-level locale preference (e.g. zh-CN or en-US). Omitted when the account has none set.", + "type": "string" + }, + "account_name": { + "description": "Account name", + "type": "string" + }, + "account_role_ids": { + "description": "Assigned role IDs", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" + }, + "account_time_zone": { + "description": "Account-level time zone (e.g. Asia/Shanghai). Omitted when the account has none set.", + "type": "string" + }, + "avatar": { + "description": "Member avatar URL", + "type": "string" + }, + "country_code": { + "description": "ISO 3166-1 alpha-2 region code of the member's contact phone (e.g. \"CN\", \"US\", \"HK\").", + "type": "string" + }, + "created_at": { + "description": "Member creation time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "domain": { + "description": "Account domain", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "email": { + "description": "Email address", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "email_verified": { + "description": "Whether email is verified", + "type": "boolean" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "is_external": { + "description": "Whether provisioned via SSO", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "locale": { + "description": "Member's locale preference. Omitted when the member has none set.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRuleListRequest" - }, - "example": { - "scope": "all", - "limit": 20 - } - } - } - } - } - }, - "/safari/automation/rule/run": { - "post": { - "operationId": "automation-rule-write-run", - "summary": "Run Automation rule", - "description": "Manually run an Automation rule immediately, outside its schedule.", - "tags": [ - "AI SRE/Automations" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **100 requests/minute**; **5 requests/second** per account |\n| Permissions | Valid `app_key`; caller must manage the target rule |\n\n## Usage\n\n- Rate-limited to at most once per minute per rule; a second call within that window returns `429` with `code: \"RequestTooFrequently\"`.\n- Only enabled rules can run manually; a disabled or misconfigured rule fails preflight with a `400` error before any run is created.\n- The call returns once the underlying agent session starts, not once the run finishes; the run continues asynchronously — use List Automation runs to check completion status.\n- `trigger_kind` is always `manual` for runs started this way, distinguishing them from `schedule`, `http_post`, and `oncall_incident` runs in run history.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/automations/automation-rule-write-run", - "metadata": { - "sidebarTitle": "Run Automation rule" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ManualRunRuleResult" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "trigger_kind": "manual", - "preflight": { - "ok": true, - "checks": [ - "rule_loaded", - "actor_authorized", - "app_allowed", - "runtime_scope_resolved", - "rule_config_valid" - ], - "scope": "team", - "owner_id": 80011, - "team_id": 123, - "app_name": "ai-sre" - }, - "run": { - "run_id": "trun_5oDvqiG64uur6sBNsTc4u", - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u" - } - } - } - } - } + "member_id": { + "description": "Member ID", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "member_name": { + "description": "Member display name", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "mp_account_id": { + "description": "Account identifier on the marketplace platform. Omitted together with `mp_plat`.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "mp_plat": { + "description": "Cloud marketplace platform the account was provisioned from. Omitted when the account did not come from a marketplace.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "phone": { + "description": "Masked phone number", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "phone_verified": { + "description": "Whether phone is verified", + "type": "boolean" + }, + "time_zone": { + "description": "Member's IANA time zone. Omitted when the member has none set.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRuleIDRequest" - }, - "example": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b" - } - } - } - } - } - }, - "/safari/automation/rule/update": { - "post": { - "operationId": "automation-rule-write-update", - "summary": "Update Automation rule", - "description": "Update mutable Automation rule fields, including HTTP POST and On-call incident trigger settings.", - "tags": [ - "AI SRE/Automations" + "required": [ + "account_id", + "account_name", + "account_avatar", + "account_email", + "account_role_ids", + "domain", + "member_id", + "member_name", + "phone", + "phone_verified", + "email", + "email_verified", + "country_code", + "avatar", + "is_external", + "created_at" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MemberInviteRequest": { + "description": "Invite members request", + "properties": { + "from": { + "description": "Invite source. Only takes effect when the account has member invites disabled and the value is `api`: members are created directly in the enabled state with email/phone marked verified and no invitation sent. Any other value follows the normal invite flow", + "type": "string" + }, + "members": { + "description": "Members to invite in one call (at least 1). Each entry needs either an `email`, or `member_name` + `phone` together.", + "items": { + "$ref": "#/components/schemas/InviteMemberItem" + }, + "minItems": 1, + "type": "array" } + }, + "required": [ + "members" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | Valid `app_key`; management operations require the caller to manage the target rule |\n\n## Usage\n\n- Omitted or `null` fields are left unchanged. `team_id` reassigns the rule's scope: `0` converts a team rule to personal (owner-only), `>0` moves it into a team the caller belongs to.\n- `cron_expr` and `timezone` can be updated independently — sending only one keeps the other at its current stored value.\n- `rotate_http_post_trigger_token=true` issues a fresh webhook token, returned only in this response.\n- To trigger from On-call incidents, send `oncall_incident_trigger_enabled`, `oncall_incident_channel_ids`, and `oncall_incident_severities`; matching events run with `trigger_kind=oncall_incident`.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/automations/automation-rule-write-update", - "metadata": { - "sidebarTitle": "Update Automation rule" + "type": "object" + }, + "MemberInviteResponse": { + "description": "Invite members response", + "properties": { + "items": { + "description": "Newly created members", + "items": { + "$ref": "#/components/schemas/NewMemberItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AutomationRuleItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "account_id": 10023, - "team_id": 123, - "owner_id": 80011, - "name": "Weekly on-call review", - "enabled": true, - "run_scope": "team", - "cron_expr": "0 9 * * 1", - "timezone": "Asia/Shanghai", - "prompt": "Summarize last week's alert noise and escalation load.", - "environment_kind": "", - "environment_id": "", - "schedule_trigger_id": "atrig_6aKp3wT9mQ2xVc8bR1nY7z", - "schedule_trigger_enabled": true, - "http_post_trigger_id": "atrig_2bLq4xT8mP1sWd9cN3rF6y", - "http_post_trigger_url": "/safari/automation/triggers/atrig_2bLq4xT8mP1sWd9cN3rF6y/fire", - "http_post_trigger_enabled": true, - "can_edit": true, - "created_at": 1780367971228, - "updated_at": 1780367971228, - "http_post_token": "sat_yQ9p8V7n6M5k4J3h2G1f0E9d8C7b6A5z4Y3x2W1v0U", - "schedule_next_fire_at_ms": 1780630800000, - "oncall_incident_trigger_id": "atrig_9cVb2mN7qKs4dEa8T1rY5p", - "oncall_incident_trigger_enabled": true, - "oncall_incident_channel_ids": [ - 456 - ], - "oncall_incident_severities": [ - "Critical", - "Warning" - ] - } - } - } - } + "type": "object" + }, + "MemberItem": { + "description": "Member item", + "properties": { + "account_id": { + "description": "Account ID", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "account_role_ids": { + "description": "Role IDs", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "avatar": { + "description": "Avatar URL", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "country_code": { + "description": "ISO 3166-1 alpha-2 region code of the member's contact phone (e.g. \"CN\", \"US\", \"HK\").", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_at": { + "description": "Creation timestamp (Unix seconds)", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRuleUpdateRequest" - }, - "example": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "enabled": true, - "cron_expr": "15 9 * * 1", - "rotate_http_post_trigger_token": true, - "oncall_incident_trigger_enabled": true, - "oncall_incident_severities": [ - "Critical", - "Warning" - ], - "oncall_incident_channel_ids": [ - 456 - ] - } - } - } - } - } - }, - "/safari/automation/run/list": { - "post": { - "operationId": "automation-run-read-list", - "summary": "List Automation runs", - "description": "List run history for a rule the caller can manage.", - "tags": [ - "AI SRE/Automations" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Valid `app_key`; caller must manage the target rule |\n\n## Usage\n\n- Run history is visible only when the caller can manage the rule: the personal rule owner; for team rules, an account admin or a member of the rule's team.\n", - "href": "/en/api-reference/ai-sre/automations/automation-run-read-list", - "metadata": { - "sidebarTitle": "List Automation runs" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AutomationRunListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "runs": [ - { - "run_id": "trun_5oDvqiG64uur6sBNsTc4u", - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "session_name": "Weekly on-call review", - "kind": "automation_rule", - "account_id": 10023, - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "trigger_kind": "schedule", - "occurrence_key": "atrig_6aKp3wT9mQ2xVc8bR1nY7z:1780630800000", - "status": "succeeded", - "attempts": 1, - "started_at": 1780630800000, - "completed_at": 1780630923456, - "duration_ms": 123456, - "error_code": "", - "error_message": "", - "stats_json": {}, - "result_json": { - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u" - }, - "created_at": 1780630800000, - "updated_at": 1780630923456 - } - ] - } - } - } - } + "email": { + "description": "Email address", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "email_verified": { + "description": "Email verified", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "is_external": { + "description": "Provisioned via SSO", + "type": "boolean" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "locale": { + "description": "Member's locale preference (e.g. `zh-CN`). Omitted when empty — the list endpoint does not populate it.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "member_id": { + "description": "Member ID", + "format": "uint64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationRunListRequest" - }, - "example": { - "rule_id": "arule_7NnLzY2Qp8xS4kUaV3mR6b", - "limit": 20, - "trigger_kind": "schedule" - } - } - } - } - } - }, - "/safari/automation/template/list": { - "post": { - "operationId": "automation-template-read-list", - "summary": "List Automation templates", - "description": "List preset Automation templates for the requested locale.", - "tags": [ - "AI SRE/Automations" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | Valid `app_key`; results are filtered to the caller's visible scope |\n", - "href": "/en/api-reference/ai-sre/automations/automation-template-read-list", - "metadata": { - "sidebarTitle": "List Automation templates" + "member_name": { + "description": "Display name", + "type": "string" + }, + "phone": { + "description": "Masked phone number", + "type": "string" + }, + "phone_verified": { + "description": "Phone verified", + "type": "boolean" + }, + "ref_id": { + "description": "External reference ID", + "type": "string" + }, + "status": { + "description": "Member status. `enabled` — active member; `pending` — invited but not yet accepted; `deleted` — removed from the organization.", + "enum": [ + "enabled", + "pending", + "deleted" + ], + "type": "string" + }, + "time_zone": { + "description": "Member's IANA time zone (e.g. `Asia/Shanghai`). Omitted when empty — the list endpoint does not populate it.", + "type": "string" + }, + "updated_at": { + "description": "Update timestamp (Unix seconds)", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AutomationTemplateListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "templates": [ - { - "name": "Weekly Insights", - "description": "Analyze incidents, alerts, response activity, notification load, and related changes from the past week.", - "icon": "chart-no-axes-combined", - "enabled": false, - "prompt": "Generate a weekly insights report. Analyze incidents, alerts, response activity, notification load, and related changes from the past week. Focus on what happened this week, which signals deserve attention, and which improvement actions are most valuable. Do not modify any Flashduty business state.\n" - } - ] - } - } - } - } + "required": [ + "account_id", + "member_id", + "member_name", + "country_code", + "phone", + "email", + "phone_verified", + "email_verified", + "avatar", + "status", + "account_role_ids", + "created_at", + "updated_at", + "ref_id", + "is_external" + ], + "type": "object" + }, + "MemberListRequest": { + "description": "List members request", + "properties": { + "asc": { + "description": "Ascending order. Default: false (descending)", + "type": "boolean" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "limit": { + "default": 100, + "description": "Page size. Defaults to 100 on the server when omitted or 0", + "maximum": 100, + "minimum": 1, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "member_id": { + "description": "Filter by member ID. Return only the member with this ID.", + "format": "uint64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "orderby": { + "description": "Sort field. Default: `updated_at`", + "enum": [ + "created_at", + "updated_at" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "p": { + "description": "Page number, 1-based", + "minimum": 1, + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "query": { + "description": "Substring match on member name or email; if the keyword parses as a phone number, an exact phone match is also applied", + "type": "string" + }, + "role_id": { + "description": "Filter by role ID. Get role IDs from `POST /role/list` (built-in roles: 2=Admin, 6=Responder, 8=Viewer)", + "format": "uint64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AutomationTemplateListRequest" - }, - "example": { - "locale": "en-US" - } - } - } - } - } - }, - "/safari/mcp/server/create": { - "post": { - "operationId": "mcp-write-server-create", - "summary": "Create MCP server", - "description": "Register a new MCP server (connector) on the account.", - "tags": [ - "AI SRE/MCP servers" - ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MemberListResponse": { + "description": "Member list response", + "properties": { + "items": { + "description": "Member items", + "items": { + "$ref": "#/components/schemas/MemberItem" + }, + "type": "array" + }, + "limit": { + "description": "Page size", + "type": "integer" + }, + "p": { + "description": "Current page", + "type": "integer" + }, + "total": { + "description": "Total count", + "type": "integer" } + }, + "required": [ + "p", + "limit", + "total", + "items" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **MCP Manage** (`ai-sre`) |\n\n## Usage\n\n- `command`/`args`/`env` apply to `stdio`; `url`/`headers` apply to `sse`/`streamable-http`.\n- Server name must start with a letter and contain only letters, digits, `-`, or `_`, and is unique within its scope (account-wide or one team), case-insensitive; violations return InvalidParameter.\n- `environments` restricts where the server can run: a list of `cloud` and/or BYOC runner environment IDs; omitted or empty means all environments.\n- `per_user_secret` auth mode requires `secret_schema` to be valid JSON with a non-empty `header_name`.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-write-server-create", - "metadata": { - "sidebarTitle": "Create MCP server" + "type": "object" + }, + "MemberOncallInterval": { + "description": "One on-call shift interval of a member.", + "properties": { + "end_at": { + "description": "Unix timestamp in seconds - when the shift ends. Absent while the shift is ongoing.", + "format": "int64", + "type": "integer" + }, + "schedule_id": { + "description": "Owning schedule ID.", + "format": "int64", + "type": "integer" + }, + "schedule_name": { + "description": "Owning schedule name.", + "type": "string" + }, + "start_at": { + "description": "Unix timestamp in seconds - when the shift starts.", + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MCPServerItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1", - "account_id": 10023, - "team_id": 0, - "can_edit": true, - "environments": [], - "server_name": "prometheus", - "description": "Query Prometheus metrics and alerts.", - "transport": "streamable-http", - "url": "https://mcp.example.com/prometheus", - "status": "enabled", - "connect_timeout": 10, - "call_timeout": 60, - "auth_mode": "shared", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000 - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "type": "object" + }, + "MemberResetInfoRequest": { + "anyOf": [ + { + "required": [ + "member_id" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + { + "required": [ + "member_name" + ] }, - "403": { - "$ref": "#/components/responses/Forbidden" + { + "required": [ + "email" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + { + "required": [ + "phone" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerCreateRequest" - }, - "example": { - "server_name": "prometheus", - "description": "Query Prometheus metrics and alerts.", - "transport": "streamable-http", - "url": "https://mcp.example.com/prometheus", - "status": "enabled" - } - } - } - } - } - }, - "/safari/mcp/server/delete": { - "post": { - "operationId": "mcp-write-server-delete", - "summary": "Delete MCP server", - "description": "Delete an MCP server by ID.", - "tags": [ - "AI SRE/MCP servers" - ], - "security": [ { - "AppKeyAuth": [] + "required": [ + "ref_id" + ] } ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **MCP Manage** (`ai-sre`) |\n\n## Usage\n\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-write-server-delete", - "metadata": { - "sidebarTitle": "Delete MCP server" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "description": "Reset member info request. Top-level fields identify the member, and updates contains the profile fields to write.", + "properties": { + "country_code": { + "description": "Region hint for parsing `phone` when it has no \"+\" prefix — an ISO 3166-1 alpha-2 code such as \"CN\" (the default when omitted). Legacy digit calling codes like \"86\" are still accepted in this parsing context.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "email": { + "description": "Email address used to identify the member.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "from": { + "description": "Set to `api` to mark an updated phone or email as verified. Only takes effect when the account has member invites disabled; any other value is ignored.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "member_id": { + "description": "Member ID used to identify the member.", + "format": "uint64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "member_name": { + "description": "Member name used to identify the member.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "phone": { + "description": "Phone number used to identify the member. Include country_code when the number is not in E.164 format.", + "type": "string" + }, + "ref_id": { + "description": "External reference ID used to identify the member.", + "type": "string" + }, + "updates": { + "$ref": "#/components/schemas/MemberResetInfoUpdates", + "description": "New profile values to write. Must include at least one field." } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerDeleteRequest" - }, - "example": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1" - } - } - } - } - } - }, - "/safari/mcp/server/disable": { - "post": { - "operationId": "mcp-write-server-disable", - "summary": "Disable MCP server", - "description": "Disable an enabled MCP server.", - "tags": [ - "AI SRE/MCP servers" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "updates" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **MCP Manage** (`ai-sre`) |\n\n## Usage\n\n- Disabling an already-disabled server returns InvalidParameter instead of a silent no-op.\n- Requires edit permission on the server's current team: account-scope servers are owner/admin only; team-scope servers require the caller to belong to that team (or be owner/admin).\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-write-server-disable", - "metadata": { - "sidebarTitle": "Disable MCP server" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "type": "object" + }, + "MemberResetInfoUpdates": { + "description": "Member profile fields to write. Omitted fields remain unchanged.", + "properties": { + "avatar": { + "description": "New avatar URL.", + "maxLength": 499, + "type": [ + "string", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "country_code": { + "description": "ISO 3166-1 alpha-2 region code (e.g. \"CN\", \"US\"). Updated independently — `phone` is not required — and also used as the parsing hint for `phone`. Invalid values are rejected with a 400; an explicit empty string is not allowed.", + "type": [ + "string", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "email": { + "description": "New email address.", + "type": [ + "string", + "null" + ] }, - "403": { - "$ref": "#/components/responses/Forbidden" + "locale": { + "description": "New locale preference. One of: `zh-CN` (Simplified Chinese), `en-US` (English); other values are rejected with a 400.", + "enum": [ + "zh-CN", + "en-US" + ], + "type": [ + "string", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "member_name": { + "description": "New display name.", + "maxLength": 39, + "minLength": 2, + "type": [ + "string", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "password": { + "description": "New login password in the encrypted format accepted by the backend.", + "type": [ + "string", + "null" + ] + }, + "phone": { + "description": "New phone number. Include country_code when the number is not in E.164 format.", + "type": [ + "string", + "null" + ] + }, + "ref_id": { + "description": "New external reference ID.", + "type": [ + "string", + "null" + ] + }, + "time_zone": { + "description": "New IANA time zone name, such as Asia/Shanghai.", + "type": [ + "string", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerStatusRequest" - }, - "example": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1" - } - } + "type": "object" + }, + "MemberRoleGrantRequest": { + "description": "Grant role to member request", + "properties": { + "member_id": { + "description": "Member ID", + "format": "uint64", + "type": "integer" + }, + "role_ids": { + "description": "Role IDs to grant; appended to the member's current roles (duplicates are deduplicated).", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" } - } - } - }, - "/safari/mcp/server/enable": { - "post": { - "operationId": "mcp-write-server-enable", - "summary": "Enable MCP server", - "description": "Enable a disabled MCP server.", - "tags": [ - "AI SRE/MCP servers" + }, + "required": [ + "member_id", + "role_ids" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MemberRoleRevokeRequest": { + "description": "Revoke role from member request", + "properties": { + "member_id": { + "description": "Member ID", + "format": "uint64", + "type": "integer" + }, + "role_ids": { + "description": "Role IDs to remove from the member.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" + } + }, + "required": [ + "member_id", + "role_ids" + ], + "type": "object" + }, + "MemberRoleUpdateRequest": { + "description": "Update member roles request", + "properties": { + "member_id": { + "description": "Member ID", + "format": "uint64", + "type": "integer" + }, + "role_ids": { + "description": "New role ID set. Replaces the member's existing roles entirely (not additive); get IDs from `POST /role/list`. Leave empty to reset to the built-in Viewer role (ID 8)", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" } + }, + "required": [ + "member_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **MCP Manage** (`ai-sre`) |\n\n## Usage\n\n- Enabling an already-enabled server returns InvalidParameter instead of a silent no-op.\n- Requires edit permission on the server's current team: account-scope servers are owner/admin only; team-scope servers require the caller to belong to that team (or be owner/admin).\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-write-server-enable", - "metadata": { - "sidebarTitle": "Enable MCP server" + "type": "object" + }, + "MemberScheduleItem": { + "description": "An enabled schedule the member participates in.", + "properties": { + "schedule_id": { + "description": "Schedule ID.", + "format": "int64", + "type": "integer" + }, + "schedule_name": { + "description": "Schedule name.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "type": "object" + }, + "MergeIncidentsRequest": { + "description": "Parameters for merging source incidents into a target.", + "properties": { + "comment": { + "description": "Optional comment recorded on the merge timeline entry.", + "maxLength": 1024, + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "owner_id": { + "description": "Accepted for compatibility but currently ignored by the server; the merge does not change the target incident owner.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "remove_source_incidents": { + "description": "When true, soft-delete the source incidents after merging instead of closing them.", + "type": "boolean" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "source_incident_ids": { + "description": "Source incident IDs. The target incident is removed from this set automatically.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "target_incident_id": { + "description": "Target incident ID of the merge; obtain it from `POST /incident/list`.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "title": { + "description": "Optional new title for the target incident.", + "maxLength": 512, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerStatusRequest" - }, - "example": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1" - } - } - } - } - } - }, - "/safari/mcp/server/get": { - "post": { - "operationId": "mcp-read-server-get", - "summary": "Get MCP server detail", - "description": "Get one MCP server as a pure database read — no live probe is performed.", - "tags": [ - "AI SRE/MCP servers" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "source_incident_ids", + "target_incident_id" ], - "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- A pure database read — it never probes the live server; the stored configuration (with secrets masked) and the cached `ai_description` are returned as-is.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-read-server-get", - "metadata": { - "sidebarTitle": "Get MCP server detail" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MCPServerItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1", - "account_id": 10023, - "team_id": 0, - "can_edit": true, - "environments": [], - "server_name": "prometheus", - "description": "Query Prometheus metrics and alerts.", - "transport": "streamable-http", - "url": "https://mcp.example.com/prometheus", - "status": "enabled", - "connect_timeout": 10, - "call_timeout": 60, - "auth_mode": "shared", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000 - } - } - } - } + "type": "object" + }, + "MetricsBase": { + "description": "Shared dimension identifiers attached to every aggregated insight row.", + "properties": { + "channel_id": { + "description": "Channel ID, returned only when aggregating by channel (`/insight/channel`).", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "channel_name": { + "description": "Channel name, returned when aggregating by channel; omitted when the name cannot be resolved.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "hours": { + "description": "Hour bucket when `split_hours` is enabled. `work` is Mon–Fri 08:00–19:00, `sleep` is daily 23:00–08:00, and `off` is everything else, all evaluated in the account timezone (`sleep` takes precedence over `work`). Omitted when `split_hours` is false.", + "enum": [ + "work", + "sleep", + "off" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "responder_id": { + "description": "Responder (person) ID, returned only when aggregating by responder (`/insight/responder`).", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "responder_name": { + "description": "Responder name, returned when aggregating by responder; omitted when the name cannot be resolved.", + "type": "string" + }, + "team_id": { + "description": "Team ID, returned only when aggregating by team (`/insight/team`).", + "format": "int64", + "type": "integer" + }, + "team_name": { + "description": "Team name, returned when aggregating by team; omitted when the name cannot be resolved (e.g. team deleted).", + "type": "string" + }, + "ts": { + "description": "Start of the aggregation bucket, Unix epoch seconds. Equals `start_time` when no `aggregate_unit` is given.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerGetRequest" - }, - "example": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1" - } - } + "type": "object" + }, + "MigrateStatusPageEmailSubscribersRequest": { + "description": "Parameters for starting an Atlassian Statuspage email subscriber migration job.", + "properties": { + "api_key": { + "description": "Atlassian Statuspage API key with access to the source page.", + "type": "string" + }, + "source_page_id": { + "description": "Atlassian Statuspage source page ID.", + "type": "string" + }, + "target_page_id": { + "description": "Flashduty target status page ID that will receive the imported subscribers.", + "format": "int64", + "type": "integer" } - } - } - }, - "/safari/mcp/server/list": { - "post": { - "operationId": "mcp-read-server-list", - "summary": "List MCP servers", - "description": "List MCP servers visible to the caller across account and team scopes, with pagination.", - "tags": [ - "AI SRE/MCP servers" + }, + "required": [ + "api_key", + "source_page_id", + "target_page_id" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "MigrateStatusPageStructureRequest": { + "description": "Parameters for starting an Atlassian Statuspage structure and history migration job.", + "properties": { + "api_key": { + "description": "Atlassian Statuspage API key with access to the source page.", + "type": "string" + }, + "source_page_id": { + "description": "Atlassian Statuspage source page ID.", + "type": "string" + }, + "url_name": { + "description": "Target URL name for the new status page, normalized to a URL-safe slug (max 255 characters). Omit or pass null to derive it from the source page name; an explicitly empty string is rejected.", + "maxLength": 255, + "type": [ + "string", + "null" + ] } + }, + "required": [ + "api_key", + "source_page_id" ], - "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- The response never includes a live tool list; tools are probed asynchronously on create/update and cached for runtime use.\n- `query` performs a case-insensitive substring search across name, description, AI-generated description, server ID, transport, URL, command, and source template name.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-read-server-list", - "metadata": { - "sidebarTitle": "List MCP servers" + "type": "object" + }, + "NameMessage": { + "description": "Per-item result for batch rule operations.", + "properties": { + "message": { + "description": "Empty on success, error message on failure.", + "type": "string" + }, + "name": { + "description": "Rule name.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MCPServerListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "servers": [ - { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1", - "account_id": 10023, - "team_id": 0, - "can_edit": true, - "environments": [], - "server_name": "prometheus", - "description": "Query Prometheus metrics and alerts.", - "transport": "streamable-http", - "url": "https://mcp.example.com/prometheus", - "status": "enabled", - "connect_timeout": 10, - "call_timeout": 60, - "auth_mode": "shared", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000 - } - ] - } - } - } - } + "required": [ + "name", + "message" + ], + "type": "object" + }, + "NewMemberItem": { + "description": "Newly created member", + "properties": { + "member_id": { + "description": "Member ID", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "member_name": { + "description": "Member display name", + "type": "string" + } + }, + "type": "object" + }, + "NotifyChat": { + "description": "Notification delivery record for a chat group recipient.", + "properties": { + "chat_id": { + "description": "Chat group identifier.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "chat_name": { + "description": "Chat group display name.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "data_source_id": { + "description": "Integration data source ID used to send the notification.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "failed_reason": { + "description": "Failure reason if delivery did not succeed.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerListRequest" - }, - "example": { - "p": 1, - "limit": 20, - "include_account": true - } - } + "type": "object" + }, + "NotifyPerson": { + "description": "Notification delivery record for a single person recipient.", + "properties": { + "failed_reason": { + "description": "Failure reason if delivery did not succeed.", + "type": "string" + }, + "person_id": { + "description": "Recipient member ID.", + "format": "int64", + "type": "integer" + }, + "sms_content": { + "description": "SMS text delivered to the recipient; present on SMS deliveries.", + "type": "string" } - } - } - }, - "/safari/mcp/server/update": { - "post": { - "operationId": "mcp-write-server-update", - "summary": "Update MCP server", - "description": "Update an MCP server's configuration. Omit a field to leave it unchanged.", - "tags": [ - "AI SRE/MCP servers" - ], - "security": [ - { - "AppKeyAuth": [] + }, + "type": "object" + }, + "NotifyRobot": { + "description": "Notification delivery record for a robot webhook recipient.", + "properties": { + "alias": { + "description": "Robot alias.", + "type": "string" + }, + "failed_reason": { + "description": "Failure reason if delivery did not succeed.", + "type": "string" + }, + "token": { + "description": "Robot token or identifier.", + "type": "string" } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **MCP Manage** (`ai-sre`) |\n\n## Usage\n\n- Masked secret values in `env`/`headers` are preserved — sending the masked value back does not overwrite the stored secret.\n- `environments` is a tri-state partial-update field: omit (null) to leave it unchanged; send a list to set it — an empty list clears the restriction back to all environments.\n- Changing `team_id` requires reassignment permission on the destination team; if `environments` is left unchanged, the current environments must still be selectable by the caller under the new team or the update is rejected.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/mcp-servers/mcp-write-server-update", - "metadata": { - "sidebarTitle": "Update MCP server" + }, + "type": "object" + }, + "OnceTimeFilter": { + "description": "One-off time window defined by unix seconds.", + "properties": { + "end_time": { + "description": "Window end, Unix timestamp in seconds. Must be greater than 0.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" + }, + "start_time": { + "description": "Window start, Unix timestamp in seconds. Must be greater than 0 and less than `end_time`.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/MCPServerItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1", - "account_id": 10023, - "team_id": 0, - "can_edit": true, - "environments": [], - "server_name": "prometheus", - "description": "Query Prometheus metrics, alerts, and rules.", - "transport": "streamable-http", - "url": "https://mcp.example.com/prometheus", - "status": "enabled", - "connect_timeout": 10, - "call_timeout": 60, - "auth_mode": "shared", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000 - } - } - } - } + "required": [ + "start_time", + "end_time" + ], + "type": "object" + }, + "OrFilterGroup": { + "description": "OR-of-AND filter tree. Outer array is a list of AND groups; the condition passes if **any** AND group matches. Within each AND group, **all** conditions must match.", + "items": { + "description": "AND group — all conditions in this array must match.", + "items": { + "$ref": "#/components/schemas/FilterCondition" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "type": "array" + }, + "type": "array" + }, + "PastIncidentItem": { + "allOf": [ + { + "$ref": "#/components/schemas/IncidentInfo" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + { + "properties": { + "score": { + "description": "Similarity score from the vector search.", + "format": "float", + "type": "number" + } + }, + "required": [ + "score" + ], + "type": "object" + } + ] + }, + "PermissionFactorItem": { + "description": "A permission factor.", + "properties": { + "factor_name": { + "description": "Factor identifier (e.g., 'template:read:info').", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "factor_type": { + "description": "Factor type. `api`: backend API factor — `factor_name` is the API name (e.g. `skill:write:upload`), enforced at the gateway; `button`: UI action factor, used by the role-config page to render action toggles; `visit`: page-visit factor (custom menu pages use this type); `menu`: menu-visibility factor (legacy, no current seed data); `url`: page route-path factor (legacy, no current seed data).", + "enum": [ + "api", + "button", + "visit", + "menu", + "url" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "source": { + "description": "Origin of the factor. `system` — seeded built-in factor; `account` — dynamic factor created for this account (e.g. custom menus).", + "enum": [ + "system", + "account" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "source_ref": { + "description": "Primary key of the source object (e.g. the custom menu ID) for account-scoped factors. Omitted when empty.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MCPServerUpdateRequest" - }, - "example": { - "server_id": "mcp_4kP9wQ2nLceRtY7uVb3xA1", - "description": "Query Prometheus metrics, alerts, and rules." - } - } - } - } - } - }, - "/safari/session/delete": { - "post": { - "operationId": "session-write-delete", - "summary": "Delete session", - "description": "Delete a session by ID.", - "tags": [ - "AI SRE/Sessions" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "factor_name", + "factor_type" ], - "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- Personal sessions can be deleted only by their creator; team sessions can be deleted by the creator, an account admin, or a member of the owning team.\n- This is a soft delete: it also cascades to delete child subagent sessions and any presented files; the underlying S3/MinIO blobs are removed best-effort after the transaction commits, so an orphaned blob is possible on partial failure.\n", - "href": "/en/api-reference/ai-sre/sessions/session-write-delete", - "metadata": { - "sidebarTitle": "Delete session" + "type": "object" + }, + "PermissionFactorListRequest": { + "description": "Filters for listing permission factors.", + "properties": { + "factor_types": { + "description": "Filter by factor type.", + "items": { + "enum": [ + "api", + "button", + "visit", + "menu", + "url" + ], + "type": "string" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "type": "object" + }, + "PermissionFactorListResponse": { + "description": "List of permission factors.", + "items": { + "$ref": "#/components/schemas/PermissionFactorItem" + }, + "type": "array" + }, + "PermissionItem": { + "description": "A permission entry.", + "properties": { + "account_id": { + "description": "Owning account ID. Omitted when 0, i.e. for system-level permissions.", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "class": { + "description": "Permission class (e.g., 'On-call', 'Organization').", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "description": { + "description": "Human-readable permission description.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "id": { + "description": "Unique permission ID.", + "format": "uint64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "is_granted": { + "description": "Whether this permission is granted to the roles given in `role_ids`. Always present in this endpoint's response; `false` entries only appear when `with_all` is true.", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SessionDeleteRequest" - }, - "example": { - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u" - } - } - } - } - } - }, - "/safari/session/export": { - "post": { - "operationId": "session-read-export", - "summary": "Export session transcript", - "description": "Stream a session's full event transcript as newline-delimited JSON.", - "tags": [ - "AI SRE/Sessions" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/day**; **200 requests/minute**; **20 requests/second** per account |\n| Permissions | None — any valid `app_key` can call this operation |\n\n## Usage\n\n- Personal sessions are exportable only by their creator; team sessions can be exported by same-account callers with the `session_id`.\n- The response is `application/x-ndjson` — parse line-by-line and write to a file; do not buffer the whole body in memory.\n- The first line is always a `session_meta` envelope; `include_subagents=true` inlines each child session's stream after its dispatch line.\n- Requests are capped at a 60-second execution timeout; very large sessions may not finish exporting within that window.\n- If the stream fails partway through, the response ends with a JSON error line instead of a proper error envelope (headers are already sent) — check for this trailing line to detect truncation.\n", - "href": "/en/api-reference/ai-sre/sessions/session-read-export", - "metadata": { - "sidebarTitle": "Export session transcript" - } - }, - "responses": { - "200": { - "description": "Streaming NDJSON (application/x-ndjson). One JSON object per line, terminated by a newline. The first line is always a `session_meta` envelope; subsequent lines are session events.", - "content": { - "application/x-ndjson": { - "schema": { - "type": "string", - "description": "Newline-delimited JSON stream. Parse line-by-line; do not buffer the whole body." - } - } - } + "permission_name": { + "description": "Permission display name.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "permission_type": { + "description": "Whether this is a read or manage permission. `read`: view-only permission (read/list/query); `manage`: administrative permission covering mutations (create, update, delete, configure).", + "enum": [ + "read", + "manage" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "scope": { + "description": "Functional scope the permission applies to.\n\n| value | meaning |\n| --- | --- |\n| `account` | Account settings and API keys |\n| `organization` | Members, teams, roles, audit |\n| `on-call` | On-call incident management |\n| `monit` | Monitoring |\n| `rum` | Real user monitoring |\n| `ai-sre` | AI SRE features |\n| `custom_menu` | Account-defined custom menu pages (on-premises only) |", + "enum": [ + "account", + "organization", + "on-call", + "monit", + "rum", + "ai-sre", + "custom_menu" + ], + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "source": { + "description": "Origin of the permission. `system` — seeded built-in permission; `account` — dynamic permission created for this account (e.g. custom menus).", + "enum": [ + "system", + "account" + ], + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "source_ref": { + "description": "Primary key of the source object (e.g. the custom menu ID) for account-scoped permissions. Omitted when empty.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "status": { + "description": "Permission status. `enabled` — active; `deleted` — removed (deleted permissions are filtered out and never returned).", + "enum": [ + "enabled", + "deleted" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SessionExportRequest" - }, - "example": { - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "include_subagents": false - } - } - } - } - } - }, - "/safari/session/get": { - "post": { - "operationId": "session-read-info", - "summary": "Get session detail", - "description": "Fetch one session plus a backward-paged window of its most recent events.", - "tags": [ - "AI SRE/Sessions" + "required": [ + "id", + "permission_name", + "permission_type", + "description", + "class", + "scope", + "status", + "source", + "is_granted" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "PersonInfosRequest": { + "description": "Get person info by IDs request", + "properties": { + "person_ids": { + "description": "Person IDs to look up — these are member IDs (get them from `POST /member/list`). Passing the account ID returns the account principal; unknown IDs are ignored", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" } + }, + "required": [ + "person_ids" ], - "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- Personal sessions are readable only by their creator; team sessions can be read by same-account callers with the `session_id`.\n- Page older history with `search_after_ctx` from the previous response.\n- `limit` (or legacy `num_recent_events`) caps the event page; default 100, max 1000.\n- A malformed `search_after_ctx` returns 400 immediately, before any DB work.\n- `current_turn_*` fields are populated only while the session `is_running`; `suggest_init` is the same account-wide onboarding flag as `session/list`.\n", - "href": "/en/api-reference/ai-sre/sessions/session-read-info", - "metadata": { - "sidebarTitle": "Get session detail" + "type": "object" + }, + "PersonInfosResponse": { + "description": "Person info by IDs response", + "properties": { + "items": { + "description": "Person profiles", + "items": { + "$ref": "#/components/schemas/PersonItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SessionGetResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "session": { - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "session_name": "Investigate cloud-assistant first heartbeat", - "app_name": "ai-sre", - "entry_kind": "web", - "person_id": "3790925372131", - "team_id": 0, - "is_mine": false, - "can_view": true, - "can_continue": true, - "can_manage": true, - "can_fork": true, - "access_source": "manager", - "share_enabled": true, - "share_version": 3, - "shared_at": 1780367971000, - "shared_by": 3790925372131, - "status": "enabled", - "incognito": false, - "created_at": 1780367971228, - "updated_at": 1780367993457, - "token_usage": { - "input_tokens": 14948, - "cached_tokens": 11520, - "output_tokens": 888, - "reasoning_tokens": 351 - }, - "current_context_tokens": 14948, - "context_window": 0, - "archived_at": 0, - "pinned_at": 0, - "last_event_at": 1780367992649, - "is_running": false, - "has_unread": true, - "current_turn_started_at": 0, - "current_turn_active_ms": 0, - "current_turn_wait_ms": 0, - "current_turn_tokens": 0 - }, - "events": [ - { - "event_id": "evt_3aZQ9p", - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "author": "user", - "partial": false, - "turn_complete": false, - "status": "normal", - "created_at": 1780367971241 - }, - { - "event_id": "evt_7bWk2r", - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "author": "ai-sre", - "content": { - "role": "model", - "parts": [ - { - "text": "..." - } - ] - }, - "partial": false, - "turn_complete": true, - "status": "normal", - "created_at": 1780367992649 - } - ], - "has_more_older": false, - "suggest_init": false - } - } - } - } + "required": [ + "items" + ], + "type": "object" + }, + "PersonItem": { + "description": "Person profile", + "properties": { + "account_id": { + "description": "Account ID", + "format": "uint64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "as": { + "description": "Principal kind: `account` — the account owner principal; `member` — an organization member.", + "enum": [ + "account", + "member" + ], + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "avatar": { + "description": "Avatar URL. Omitted when empty.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "email": { + "description": "Email address. Omitted when empty.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "email_verified": { + "description": "Email verified", + "type": "boolean" }, - "500": { - "$ref": "#/components/responses/ServerError" - } - }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SessionGetRequest" - }, - "example": { - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "num_recent_events": 50 - } - } - } - } - } - }, - "/safari/session/list": { - "post": { - "operationId": "session-read-list", - "summary": "List sessions", - "description": "List agent sessions visible to the caller, filtered by app, surface, archive status, and team.", - "tags": [ - "AI SRE/Sessions" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "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- Pagination uses `p`/`limit` (max 100); `scope` defaults to `all`.\n- `all` returns your personal sessions plus team sessions you can access; account admins see all team sessions, but not other users' personal sessions.\n- `team_ids` narrows the visible set and never expands access.\n- `is_running` reflects the live run-set; `has_unread` is computed per calling user; the `current_turn_*` fields are always zero here — only `session/get` computes them while a session is running.\n- `suggest_init` is an account-wide onboarding flag (true only when the account has zero knowledge packs anywhere) — it doesn't depend on the list filters.\n", - "href": "/en/api-reference/ai-sre/sessions/session-read-list", - "metadata": { - "sidebarTitle": "List sessions" - } - }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SessionListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 988, - "sessions": [ - { - "session_id": "sess_f8oDvqiG64uur6sBNsTc4u", - "session_name": "Investigate cloud-assistant first heartbeat", - "app_name": "ai-sre", - "entry_kind": "web", - "person_id": "3790925372131", - "team_id": 0, - "is_mine": false, - "can_view": true, - "can_continue": true, - "can_manage": true, - "can_fork": true, - "access_source": "manager", - "share_enabled": true, - "share_version": 3, - "shared_at": 1780367971000, - "shared_by": 3790925372131, - "status": "enabled", - "incognito": false, - "created_at": 1780367971228, - "updated_at": 1780367993457, - "token_usage": { - "input_tokens": 14948, - "cached_tokens": 11520, - "output_tokens": 888, - "reasoning_tokens": 351 - }, - "current_context_tokens": 14948, - "context_window": 0, - "archived_at": 0, - "pinned_at": 0, - "last_event_at": 1780367992649, - "is_running": false, - "has_unread": true, - "current_turn_started_at": 0, - "current_turn_active_ms": 0, - "current_turn_wait_ms": 0, - "current_turn_tokens": 0 - } - ], - "suggest_init": false - } - } - } - } + "locale": { + "description": "Locale. Omitted when empty.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "person_id": { + "description": "Person ID", + "format": "uint64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "person_name": { + "description": "Display name. Omitted when empty.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "phone": { + "description": "Phone number. Omitted when empty — this endpoint never populates it.", + "type": "string" + }, + "phone_verified": { + "description": "Whether the phone is verified. Always false in this endpoint's response.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "status": { + "description": "Person status. `enabled` — active; `pending` — invited but not yet accepted; `deleted` — removed. Omitted when empty.", + "enum": [ + "enabled", + "pending", + "deleted" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "time_zone": { + "description": "Time zone. Omitted when empty.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SessionListRequest" - }, - "example": { - "app_name": "ai-sre", - "limit": 2, - "orderby": "updated_at", - "scope": "all" - } - } - } - } - } - }, - "/safari/skill/delete": { - "post": { - "operationId": "skill-write-delete", - "summary": "Delete skill", - "description": "Delete a skill by ID.", - "tags": [ - "AI SRE/Skills" - ], - "security": [ - { - "AppKeyAuth": [] - } + "required": [ + "account_id", + "person_id", + "phone_verified", + "email_verified" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Skill Manage** (`ai-sre`) |\n\n## Usage\n\n- Soft delete only: sets `status` to `deleted` and renames the row to free its name for reuse; the skill's zip archive is not removed from object storage.\n- Deleting an already-deleted or nonexistent `skill_id` returns `ResourceNotFound`, since the lookup excludes deleted rows before the delete itself runs.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/skills/skill-write-delete", - "metadata": { - "sidebarTitle": "Delete skill" + "type": "object" + }, + "PersonShort": { + "description": "A Flashduty member reference.", + "properties": { + "as": { + "description": "Role label for this member in the context of the current object.", + "type": "string" + }, + "email": { + "description": "Member email address.", + "format": "email", + "type": "string" + }, + "person_id": { + "description": "Member ID.", + "format": "int64", + "type": "integer" + }, + "person_name": { + "description": "Member display name.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "type": "object" + }, + "PlatformEmptyObject": { + "additionalProperties": false, + "description": "Empty object returned on success for operations with no meaningful payload.", + "type": "object" + }, + "PostMortemContentResetResponse": { + "description": "Result of a successful full post-mortem content reset.", + "properties": { + "generation": { + "description": "New collaboration document generation after the reset.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "markdown_bytes": { + "description": "UTF-8 byte length of the accepted Markdown content.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "markdown_sha256": { + "description": "SHA-256 hex digest of the accepted Markdown content.", + "type": "string" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "post_mortem_id": { + "description": "ID of the reset post-mortem report.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "previous_generation": { + "description": "Collaboration document generation before the reset.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "previous_revision": { + "description": "Content revision before the reset.", + "format": "int64", + "type": "integer" + }, + "revision": { + "description": "New content revision after the reset.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SkillDeleteRequest" + "required": [ + "post_mortem_id", + "generation", + "revision", + "previous_generation", + "previous_revision", + "markdown_bytes", + "markdown_sha256" + ], + "type": "object" + }, + "PostMortemItem": { + "description": "Full post-mortem report including basics, content and follow-ups.", + "properties": { + "basics": { + "description": "Basics aggregated automatically from the linked incidents: highest severity, earliest start / latest close time, total duration, and responders.", + "properties": { + "incidents_earliest_start_seconds": { + "description": "Earliest start time among linked incidents (seconds).", + "format": "int64", + "type": "integer" }, - "example": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m" + "incidents_highest_severity": { + "description": "Highest severity among linked incidents.", + "type": "string" + }, + "incidents_latest_close_seconds": { + "description": "Latest close time among linked incidents (seconds).", + "format": "int64", + "type": "integer" + }, + "incidents_total_duration_seconds": { + "description": "Cumulative duration in seconds.", + "format": "int64", + "type": "integer" + }, + "responders": { + "description": "Responders involved in the incident(s).", + "items": { + "$ref": "#/components/schemas/Responder" + }, + "type": "array" } - } - } - } - } - }, - "/safari/skill/disable": { - "post": { - "operationId": "skill-write-disable", - "summary": "Disable skill", - "description": "Disable an enabled skill so the agent stops loading it.", - "tags": [ - "AI SRE/Skills" - ], - "security": [ - { - "AppKeyAuth": [] - } - ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Skill Manage** (`ai-sre`) |\n\n## Usage\n\n- Only an `enabled` skill can be disabled; an already-disabled skill returns `InvalidParameter`.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/skills/skill-write-disable", - "metadata": { - "sidebarTitle": "Disable skill" + }, + "required": [ + "incidents_highest_severity", + "incidents_earliest_start_seconds", + "incidents_latest_close_seconds", + "incidents_total_duration_seconds", + "responders" + ], + "type": "object" + }, + "content": { + "description": "Post-mortem body; the object holds a single `content` field whose value is a BlockNote JSON string.", + "properties": { + "content": { + "description": "Report body content (BlockNote JSON).", + "type": "string" + } + }, + "required": [ + "content" + ], + "type": "object" + }, + "follow_ups": { + "description": "Follow-up action items rendered as a single string.", + "type": "string" + }, + "meta": { + "$ref": "#/components/schemas/PostMortemMeta" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "required": [ + "meta", + "basics", + "content", + "follow_ups" + ], + "type": "object" + }, + "PostMortemMeta": { + "description": "Post-mortem metadata (lightweight shape used in lists).", + "properties": { + "account_id": { + "description": "Account ID.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "author_ids": { + "description": "Member IDs that contributed to the report.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "channel_id": { + "description": "Owning channel ID. 0 if none.", + "format": "int64", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "channel_name": { + "description": "Channel name, filled by the server.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_at_seconds": { + "description": "Creation timestamp (seconds).", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "generation": { + "description": "Collaboration document generation. Incremented by each full content reset; 0 for legacy documents.", + "format": "int64", + "type": "integer" + }, + "incident_ids": { + "description": "Linked incident IDs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "is_private": { + "description": "When true, only team members and admins can view.", + "type": "boolean" + }, + "media_count": { + "description": "Number of uploaded media files.", + "type": "integer" + }, + "post_mortem_id": { + "description": "Deterministic post-mortem ID derived from account and incident IDs.", + "type": "string" + }, + "revision": { + "description": "Content revision for optimistic concurrency. Monotonically increases on collaborative saves and full content resets.", + "format": "int64", + "type": "integer" + }, + "status": { + "description": "Post-mortem status. `drafting` means still being edited; `published` means published.", + "enum": [ + "drafting", + "published" + ], + "type": "string" + }, + "team_id": { + "description": "Owning team ID. 0 if none.", + "format": "int64", + "type": "integer" + }, + "template_id": { + "description": "Template used to initialize the report.", + "type": "string" + }, + "title": { + "description": "Report title.", + "type": "string" + }, + "updated_at_seconds": { + "description": "Last update timestamp (seconds).", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, + "required": [ + "account_id", + "title", + "status", + "post_mortem_id", + "template_id", + "incident_ids", + "media_count", + "author_ids", + "team_id", + "channel_id", + "is_private", + "generation", + "revision", + "channel_name", + "created_at_seconds", + "updated_at_seconds" + ], + "type": "object" + }, + "PostMortemTemplate": { + "description": "Post-mortem report template.", + "properties": { + "account_id": { + "description": "Account ID that owns the template. 0 for built-in templates.", + "format": "int64", + "type": "integer" + }, "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SkillStatusRequest" - }, - "example": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m" - } - } + "description": "BlockNote JSON content used to initialize the report body.", + "type": "string" + }, + "content_markdown": { + "description": "Markdown version of the template content, used by AI generation.", + "type": "string" + }, + "created_at_seconds": { + "description": "Unix timestamp in seconds when the template was created.", + "format": "int64", + "type": "integer" + }, + "description": { + "description": "Template description.", + "type": "string" + }, + "name": { + "description": "Template name shown in the console.", + "type": "string" + }, + "team_id": { + "description": "Managing team ID. Built-in templates use 0.", + "format": "int64", + "type": "integer" + }, + "template_id": { + "description": "Template ID. Built-in templates use a stable `post_mortem_default_tmpl_*` ID.", + "type": "string" + }, + "updated_at_seconds": { + "description": "Unix timestamp in seconds when the template was last updated.", + "format": "int64", + "type": "integer" } - } - } - }, - "/safari/skill/enable": { - "post": { - "operationId": "skill-read-enable", - "summary": "Enable skill", - "description": "Enable a disabled skill so the agent can load it.", - "tags": [ - "AI SRE/Skills" + }, + "required": [ + "account_id", + "template_id", + "name", + "description", + "content", + "content_markdown", + "team_id", + "created_at_seconds", + "updated_at_seconds" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "PreflightResult": { + "description": "Readiness checks computed before a manual run is allowed to start.", + "properties": { + "app_name": { + "description": "App the rule is scoped to. Currently always ai-sre; manual runs are only supported for that app.", + "type": "string" + }, + "checks": { + "description": "Names of the readiness checks performed, in order. Current fixed set: rule_loaded, actor_authorized, app_allowed, runtime_scope_resolved, rule_config_valid.", + "items": { + "type": "string" + }, + "type": "array" + }, + "ok": { + "description": "Whether all readiness checks passed. Always true in a response that reaches the caller — a failed preflight returns a 400/403 error instead of a payload with ok=false.", + "type": "boolean" + }, + "owner_id": { + "description": "Rule owner person ID.", + "format": "int64", + "type": "integer" + }, + "scope": { + "description": "Resolved run scope for this run; mirrors the rule's run_scope. One of: `person` (personal rule, runs as its creator), `team` (team rule, runs under the owning team).", + "enum": [ + "person", + "team" + ], + "type": "string" + }, + "team_id": { + "description": "Rule's scope team ID; 0 means a personal rule.", + "format": "int64", + "type": "integer" + }, + "warnings": { + "description": "Non-fatal warnings surfaced during preflight. Omitted or empty when there are none.", + "items": { + "type": "string" + }, + "type": "array" } + }, + "required": [ + "ok", + "checks", + "scope", + "owner_id", + "team_id", + "app_name" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Skill Manage** (`ai-sre`) |\n\n## Usage\n\n- Only a `disabled` skill can be enabled; an already-enabled skill returns `InvalidParameter`.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/skills/skill-read-enable", - "metadata": { - "sidebarTitle": "Enable skill" + "type": "object" + }, + "PreviewIncidentCardFixedField": { + "description": "Fixed incident-card fields returned for supported IM previews after the requested hiding rules are applied.", + "properties": { + "field": { + "description": "Incident-card field name.\n\n| Value | Meaning |\n|---|---|\n| `channel` | Name of the alert channel that produced the incident; returned only when non-empty. |\n| `snoozed_before` | Snooze-until timestamp formatted as `YYYY-MM-DD HH:MM:SS`; returned only while the incident is snoozed. |\n| `severity` | Incident severity label; returned only when non-empty. |\n| `responders` | Names of the current responders, separated by spaces; returned only when the incident has responders. |\n| `aggregate_alert_count` | Number of alerts aggregated into the incident; returned only when greater than 1. |", + "enum": [ + "channel", + "snoozed_before", + "severity", + "responders", + "aggregate_alert_count" + ], + "type": "string" + }, + "value": { + "description": "Rendered display value for the fixed field.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "null", - "description": "Always null on success." - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": null - } - } - } + "required": [ + "field", + "value" + ], + "type": "object" + }, + "PreviewRemoteConfigRequest": { + "description": "Preview request. Omit `config` to preview the currently live configuration.", + "properties": { + "app_version": { + "description": "App version the simulated client reports.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "application_id": { + "description": "RUM application ID.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "config": { + "$ref": "#/components/schemas/RemoteConfig" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "env": { + "description": "Environment the simulated client reports.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "sdk": { + "description": "SDK name and version the simulated client reports, e.g. `web@2.4.1`.", + "type": "string" + } + }, + "required": [ + "application_id" + ], + "type": "object" + }, + "PreviewRemoteConfigResponse": { + "description": "Values the simulated client would receive.", + "properties": { + "hit_rule_index": { + "description": "0-based index of the rule that decided the result, or -1 when only the default applied.", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "values": { + "$ref": "#/components/schemas/RemoteConfigValues" } }, - "requestBody": { - "required": true, + "type": "object" + }, + "PreviewTemplateRequest": { + "description": "Template preview request.", + "properties": { "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SkillStatusRequest" - }, - "example": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m" - } - } - } - } - } - }, - "/safari/skill/get": { - "post": { - "operationId": "skill-read-get", - "summary": "Get skill detail", - "description": "Get one skill including its full SKILL.md content.", - "tags": [ - "AI SRE/Skills" - ], - "security": [ - { - "AppKeyAuth": [] + "description": "Template content to render.", + "type": "string" + }, + "incident_card_hidden_fields": { + "$ref": "#/components/schemas/IncidentCardHiddenFields", + "description": "Incident card fields to hide per IM app when previewing." + }, + "incident_id": { + "description": "Incident ID whose data is used to render the template; mock data is used when omitted. A MongoDB ObjectID hex string.", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "type": { + "description": "Template channel type that selects the rendering engine. `email` renders as Go html/template; other channels render as text/template. Values match the template channel fields, for example `email`, `sms`, `voice`, `dingtalk`, `wecom`, `feishu`, `feishu_app`, `dingtalk_app`, `wecom_app`, `slack_app`, `teams_app`, `telegram`, `slack`, `zoom`.", + "type": "string" } + }, + "required": [ + "content", + "type" ], - "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 `ResourceNotFound` if the skill does not exist or has already been deleted.\n- `can_edit` reflects team membership, but read access itself is open to any caller regardless of team.\n", - "href": "/en/api-reference/ai-sre/skills/skill-read-get", - "metadata": { - "sidebarTitle": "Get skill detail" + "type": "object" + }, + "PreviewTemplateResponse": { + "description": "Template preview result.", + "properties": { + "content": { + "description": "Rendered template output, present when success is true.", + "type": "string" + }, + "fixed_fields": { + "description": "Fixed incident-card fields returned for supported IM previews after the requested hiding rules are applied.", + "items": { + "$ref": "#/components/schemas/PreviewIncidentCardFixedField" + }, + "type": "array" + }, + "message": { + "description": "Error message describing why rendering failed, present when success is false.", + "type": "string" + }, + "success": { + "description": "Whether the template rendered without errors.", + "type": "boolean" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SkillItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m", - "account_id": 10023, - "team_id": 0, - "skill_name": "k8s-triage", - "description": "Diagnose unhealthy Kubernetes workloads from cluster events and pod logs.", - "version": "1.2.0", - "tags": [ - "kubernetes", - "triage" - ], - "author": "sre-team", - "tools": [ - "bash", - "mcp:prometheus/query" - ], - "status": "enabled", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000, - "can_edit": true, - "update_available": false, - "is_modified": false, - "description_en": "Diagnose unhealthy Kubernetes workloads from cluster events and pod logs.", - "content": "---\nname: k8s-triage\ndescription: ...\n---\n# Triage steps" - } - } - } - } + "required": [ + "success", + "content", + "message" + ], + "type": "object" + }, + "PublishedArtifactItem": { + "description": "One published artifact in the gallery. Time fields are Unix timestamps in milliseconds.", + "properties": { + "artifact_id": { + "description": "Artifact ID (`art_` prefix). Also the key of the public-share link.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "can_edit": { + "description": "Whether the caller may manage this artifact (rename, transfer, delete, share): the creator, any member of the owning team, or a manager of the source session.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "content_type": { + "description": "MIME type of the file.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "created_at": { + "description": "Unix timestamp in milliseconds when the artifact was published.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "creator_name": { + "description": "Creator's display name.", + "type": "string" + }, + "file_id": { + "description": "Presented-file ID (`pf_` prefix) currently holding the artifact's bytes. Changes on every republish.", + "type": "string" + }, + "is_mine": { + "description": "Whether the caller is the creator.", + "type": "boolean" + }, + "name": { + "description": "Underlying file name including extension.", + "type": "string" + }, + "person_id": { + "description": "Person (member) ID of the creator.", + "format": "int64", + "type": "integer" + }, + "public_url": { + "description": "Anonymous public link — a console `/share/artifact/` page served entirely from CDN. Present only while shared; anyone with the link can view it, no login required.", + "type": "string" + }, + "session_id": { + "description": "Source session ID (`sess_` prefix) that produced the file.", + "type": "string" + }, + "session_title": { + "description": "Source session's title. Omitted when the session has been deleted.", + "type": "string" + }, + "share_enabled": { + "description": "Whether anonymous public sharing is on. Omitted when false.", + "type": "boolean" + }, + "share_file_id": { + "description": "Presented-file ID the public snapshot was materialized from. When `share_enabled` is true and `file_id` differs from `share_file_id`, the public snapshot is stale — call `/safari/artifact/gallery/share/sync` to refresh it.", + "type": "string" + }, + "shared_at": { + "description": "Unix timestamp in milliseconds of the last share enable or snapshot sync. Present only while shared.", + "format": "int64", + "type": "integer" + }, + "shared_by": { + "description": "Person ID of the member who enabled sharing. Present only while shared.", + "format": "int64", + "type": "integer" + }, + "size": { + "description": "File size in bytes.", + "format": "int64", + "type": "integer" + }, + "team_id": { + "description": "Owning team ID. `0` means a personal artifact (creator-only management); a positive value means team-owned.", + "format": "int64", + "type": "integer" + }, + "team_name": { + "description": "Owning team's display name. Omitted for personal artifacts.", + "type": "string" + }, + "title": { + "description": "Display title in the gallery.", + "type": "string" + }, + "updated_at": { + "description": "Unix timestamp in milliseconds when the artifact was last updated (rename, transfer, or republish).", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SkillGetRequest" - }, - "example": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m" - } - } - } - } - } - }, - "/safari/skill/list": { - "post": { - "operationId": "skill-read-list", - "summary": "List skills", - "description": "List AI SRE skills visible to the caller across account and team scopes, with pagination.", - "tags": [ - "AI SRE/Skills" + "required": [ + "artifact_id", + "title", + "team_id", + "person_id", + "creator_name", + "is_mine", + "can_edit", + "session_id", + "file_id", + "name", + "size", + "content_type", + "created_at", + "updated_at" ], - "security": [ + "type": "object" + }, + "QueryDataRequest": { + "allOf": [ { - "AppKeyAuth": [] + "$ref": "#/components/schemas/QueryRowsRequest" } ], - "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- The `content` field is omitted in list rows; fetch a single skill to read its body.\n- `scope` selects `all` (default), `account`-only, or `team`-only, overriding `include_account`; non-admins requesting specific `team_ids` are silently filtered down to the teams they belong to.\n- `update_available` compares against the marketplace catalog once per call; if the catalog fails to load, the badge is simply suppressed rather than the request failing.\n", - "href": "/en/api-reference/ai-sre/skills/skill-read-list", - "metadata": { - "sidebarTitle": "List skills" + "description": "Request for the stable structured query endpoint. It accepts the same query fields as the retired rows endpoint." + }, + "QueryDataResponse": { + "description": "Stable, Edge-version-independent structured query response.", + "properties": { + "format": { + "description": "Public result-contract version. It is independent of the internal monit-edge query protocol version. Fixed at `query_result.v1`, which defines the structure of the `result` field.", + "enum": [ + "query_result.v1" + ], + "type": "string" + }, + "result": { + "$ref": "#/components/schemas/QueryResult" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SkillListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "total": 1, - "skills": [ - { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m", - "account_id": 10023, - "team_id": 0, - "skill_name": "k8s-triage", - "description": "Diagnose unhealthy Kubernetes workloads from cluster events and pod logs.", - "version": "1.2.0", - "tags": [ - "kubernetes", - "triage" - ], - "author": "sre-team", - "tools": [ - "bash", - "mcp:prometheus/query" - ], - "status": "enabled", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000, - "can_edit": true, - "update_available": false, - "is_modified": false - } - ] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "format", + "result" + ], + "type": "object" + }, + "QueryField": { + "description": "One typed column. `string` fields contain string or null values; `time` fields contain RFC 3339 Nano strings or null; `float` fields contain numbers, null, or the special strings `NaN`, `+Inf`, and `-Inf`.", + "properties": { + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "Series labels. Present on the float field of a time-series frame.", + "type": "object" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "name": { + "description": "Column name; on a time-series float field, series are distinguished by `labels` and `name` is usually the metric name.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "type": { + "description": "Value type governing `values` encoding: `string` = strings or null, `float` = numbers or `NaN`/`±Inf` strings or null, `time` = RFC 3339 Nano strings or null.", + "enum": [ + "string", + "float", + "time" + ], + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "values": { + "description": "All values of this column in row order; length matches the other fields in the frame.", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SkillListRequest" - }, - "example": { - "p": 1, - "limit": 20, - "include_account": true - } - } - } - } - } - }, - "/safari/skill/update": { - "post": { - "operationId": "skill-write-update", - "summary": "Update skill", - "description": "Update a skill's descriptions or reassign its team scope.", - "tags": [ - "AI SRE/Skills" + "required": [ + "name", + "type", + "values" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "QueryFrame": { + "description": "A typed, columnar table or time-series frame. All fields in one frame have the same number of values. A `time_series` frame contains one time field and one float field; labels belong to the float field.", + "properties": { + "fields": { + "description": "Columns of the frame; all fields share the same `values` length and row i is composed of each field's `values[i]`.", + "items": { + "$ref": "#/components/schemas/QueryField" + }, + "type": "array" + }, + "kind": { + "description": "Frame type: `table` for a generic table, `time_series` for a series (exactly one time field and one float field).", + "enum": [ + "table", + "time_series" + ], + "type": "string" } + }, + "required": [ + "kind", + "fields" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **300 requests/minute**; **20 requests/second** per account |\n| Permissions | **Skill Manage** (`ai-sre`) |\n\n## Usage\n\n- Only `description`, `description_en`, and `team_id` are editable; the skill body is changed by re-uploading.\n- `description` only updates when non-empty — there is no way to clear it via this field; `description_en` is nilable, so send an empty string to explicitly clear it.\n- Reassigning `team_id` to a different team runs a second authorization check beyond edit access, verifying the caller may target the destination team.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/skills/skill-write-update", - "metadata": { - "sidebarTitle": "Update skill" + "type": "object" + }, + "QueryFramesResult": { + "properties": { + "frames": { + "description": "Typed table or time-series frames. A response can contain more than one frame.", + "items": { + "$ref": "#/components/schemas/QueryFrame" + }, + "type": "array" + }, + "kind": { + "description": "Result-kind discriminator, always `frames`, indicating the `frames` payload of typed table/time-series frames.", + "enum": [ + "frames" + ], + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SkillItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m", - "account_id": 10023, - "team_id": 0, - "skill_name": "k8s-triage", - "description": "Updated triage runbook.", - "version": "1.2.0", - "tags": [ - "kubernetes", - "triage" - ], - "author": "sre-team", - "tools": [ - "bash", - "mcp:prometheus/query" - ], - "status": "enabled", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000, - "can_edit": true, - "update_available": false, - "is_modified": false - } + "required": [ + "kind", + "frames" + ], + "type": "object" + }, + "QueryRecordsResult": { + "properties": { + "kind": { + "description": "Result-kind discriminator, always `records`, indicating the `records` payload of schemaless record objects.", + "enum": [ + "records" + ], + "type": "string" + }, + "records": { + "description": "Schema-flexible records. Records may have different fields, contain nested JSON, or be null. Integers outside JavaScript's safe range are encoded as decimal strings.", + "items": { + "oneOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" } - } - } + ] + }, + "type": "array" + } + }, + "required": [ + "kind", + "records" + ], + "type": "object" + }, + "QueryResult": { + "description": "Exactly one natural result shape, selected by `kind`.", + "discriminator": { + "mapping": { + "frames": "#/components/schemas/QueryFramesResult", + "records": "#/components/schemas/QueryRecordsResult", + "samples": "#/components/schemas/QuerySamplesResult" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/components/schemas/QueryFramesResult" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + { + "$ref": "#/components/schemas/QueryRecordsResult" }, - "403": { - "$ref": "#/components/responses/Forbidden" + { + "$ref": "#/components/schemas/QuerySamplesResult" + } + ] + }, + "QueryRowsRequest": { + "properties": { + "account_id": { + "description": "Optional consistency check. Must equal the authenticated account when supplied; mismatched values are rejected. Business execution always uses the authenticated account.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "args": { + "additionalProperties": { + "type": "string" + }, + "description": "Polymorphic key/value extension parameters forwarded verbatim to monit-edge. All values must be strings, and keys are always namespaced by source (e.g. `sls.project`, `loki.type`). Validation depends on `ds_type`: SLS requires `sls.project` + `sls.logstore`. Elasticsearch accepts `es.type` of `sql`, or omitted — any other value is rejected. Loki and VictoriaLogs accept `.type` of `stats`, `raw`, or omitted; `raw` additionally requires a time range, either `.start` + `.end` or `.timespan.value` + `.timespan.unit` (unit one of `s`, `m`, `h`, `d`). Prometheus and the remaining SQL sources ignore `args` entirely.", + "type": "object" }, - "500": { - "$ref": "#/components/responses/ServerError" + "delay_seconds": { + "default": 0, + "description": "Look-back offset in seconds applied to point-in-time queries (Prometheus, Loki stats, VictoriaLogs stats). Ignored for raw / detail queries.", + "type": "integer" + }, + "ds_name": { + "description": "Data source name; must match a configured data source under the tenant.", + "type": "string" + }, + "ds_type": { + "description": "Data source type; must match a configured data source under the tenant. Examples: `prometheus`, `loki`, `victorialogs`, `sls`, `elasticsearch`, `mysql`, `postgres`, `oracle`, `clickhouse`.", + "type": "string" + }, + "expr": { + "description": "Query expression. Syntax depends on `ds_type` and is interpreted by the corresponding monit-edge client (PromQL for Prometheus, LogQL for Loki, SQL for SQL sources, etc.).", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SkillUpdateRequest" + "required": [ + "ds_type", + "ds_name", + "expr" + ], + "type": "object" + }, + "QuerySample": { + "properties": { + "labels": { + "additionalProperties": { + "type": "string" + }, + "description": "The sample's full label set; may be an empty object but is always present.", + "type": "object" + }, + "value": { + "description": "Finite numeric value or a JSON-safe representation of a non-finite float.", + "oneOf": [ + { + "type": "number" }, - "example": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m", - "description": "Updated triage runbook." + { + "enum": [ + "NaN", + "+Inf", + "-Inf" + ], + "type": "string" } - } + ] } - } - } - }, - "/safari/skill/upload": { - "post": { - "operationId": "skill-write-upload", - "summary": "Upload skill", - "description": "Upload a skill archive (.skill/.zip/.tar.gz/.tgz) to create or replace a skill.", - "tags": [ - "AI SRE/Skills" + }, + "required": [ + "labels", + "value" ], - "security": [ - { - "AppKeyAuth": [] + "type": "object" + }, + "QuerySamplesResult": { + "properties": { + "kind": { + "description": "Result-kind discriminator, always `samples`, indicating the `samples` payload of labeled instant samples.", + "enum": [ + "samples" + ], + "type": "string" + }, + "samples": { + "description": "Instant samples with their complete label sets.", + "items": { + "$ref": "#/components/schemas/QuerySample" + }, + "type": "array" } + }, + "required": [ + "kind", + "samples" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **30 requests/minute**; **3 requests/second** per account |\n| Permissions | **Skill Manage** (`ai-sre`) |\n\n## Usage\n\n- Send as `multipart/form-data` with a `file` part; accepted archive types are `.skill`, `.zip`, `.tar.gz`, `.tgz`, capped at 100MB (oversized files are rejected before the body is read).\n- `skill_id` + `replace=true` targets and overwrites that specific skill, skipping the team-authorship check since the caller already owns the row.\n- `replace=true` without `skill_id` upserts by matching skill name; omitting `replace` always creates a new skill — both paths require the caller to be allowed to author into the target `team_id`.\n- The response always stamps `can_edit: true`.\n- Every call is recorded in the account audit log.\n", - "href": "/en/api-reference/ai-sre/skills/skill-write-upload", - "metadata": { - "sidebarTitle": "Upload skill" + "type": "object" + }, + "RemoteConfig": { + "description": "The whole per-application remote configuration. A change reaches an SDK asynchronously and is applied when that SDK creates its next session, so a running session never flips a decision mid-flight.", + "properties": { + "activation": { + "default": "next_session", + "description": "How a change lands on a client that is already running: `next_session` (the default, and what an empty value means) leaves running sessions untouched and applies the change to new sessions; `immediate` ends the running session as soon as the change arrives so a new session starts under the new configuration.", + "enum": [ + "next_session", + "immediate" + ], + "type": "string" + }, + "custom": { + "additionalProperties": {}, + "description": "Application-defined pass-through values handed to the host app verbatim. At most 5 keys, each key up to 64 bytes, each value up to 4 KB of JSON nested at most 3 levels, 16 KB in total. Anyone holding the public client token can read it.", + "maxProperties": 5, + "type": "object" + }, + "default": { + "$ref": "#/components/schemas/RemoteConfigValues" + }, + "enabled": { + "description": "Kill switch. When false the engine reports no values at all and SDKs fall back to their init values.", + "type": "boolean" + }, + "refresh_on_foreground": { + "description": "Let clients re-check the configuration when they return to the foreground instead of waiting for the next poll.", + "type": "boolean" + }, + "rules": { + "description": "Targeting rules, evaluated in order; at most 20 per application.", + "items": { + "$ref": "#/components/schemas/RemoteConfigRule" + }, + "maxItems": 20, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/ResponseEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/SkillItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "skill_id": "skill_8s7Hn2kLpQ3xYbVc4Wd2m", - "account_id": 10023, - "team_id": 0, - "skill_name": "k8s-triage", - "description": "Diagnose unhealthy Kubernetes workloads from cluster events and pod logs.", - "version": "1.2.0", - "tags": [ - "kubernetes", - "triage" - ], - "author": "sre-team", - "tools": [ - "bash", - "mcp:prometheus/query" - ], - "status": "enabled", - "created_by": 80011, - "created_at": 1716960000000, - "updated_at": 1717046400000, - "can_edit": true, - "update_available": false, - "is_modified": false - } - } - } - } + "type": "object" + }, + "RemoteConfigHistoryItem": { + "description": "One published remote configuration version.", + "properties": { + "config": { + "$ref": "#/components/schemas/RemoteConfig" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "content_hash": { + "description": "Hash of the configuration content; lets the console identify versions with identical content.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "equivalent_to": { + "description": "Earliest version carrying the same content, when that is not this version itself.", + "type": "integer" }, - "403": { - "$ref": "#/components/responses/Forbidden" + "reason": { + "description": "Operator's note left when the version was published. Empty when none was given.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "updated_at": { + "description": "Unix timestamp in milliseconds - when the version was published.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "updated_by": { + "description": "ID of the member who published the version.", + "format": "int64", + "type": "integer" + }, + "updated_by_name": { + "description": "Name of the member who published the version.", + "type": "string" + }, + "version": { + "description": "Version number, unique within the application.", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "multipart/form-data": { - "schema": { - "$ref": "#/components/schemas/SkillUploadRequest" - }, - "example": { - "team_id": 0, - "replace": false - } - } - } - } - } - }, - "/rum/session-replay/metadata": { - "post": { - "operationId": "rum-session-replay-read-metadata", - "summary": "Get session replay metadata", - "description": "Return the application, device, session bounds, and views recorded for a replayable session.", - "tags": [ - "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 views are found within the session's time window.\n- Pass `ts` to disambiguate when a `session_id` has been reused across different time windows.", - "href": "/en/api-reference/rum/session-replay/rum-session-replay-read-metadata", - "metadata": { - "sidebarTitle": "Get session replay metadata" + "type": "object" + }, + "RemoteConfigRule": { + "description": "One targeting rule: when `match` holds, `set` overrides `default`. The first matching rule wins and evaluation stops there - rule order is the priority.", + "properties": { + "match": { + "additionalProperties": { + "maxLength": 256, + "type": "string" + }, + "description": "Key/value conditions the SDK's config request must equal. Keys are limited to `env`, `app_version` and `sdk`; values are at most 256 bytes.", + "minProperties": 1, + "type": "object" + }, + "set": { + "$ref": "#/components/schemas/RemoteConfigValues" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumSessionReplayMetaItem" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "application": { - "id": "WoyQQ3BohkdtPivubEvE8o" - }, - "device": { - "type": "desktop" - }, - "session": { - "is_active": false, - "server_time_delta": 0, - "source": "browser", - "start": 1752480000000, - "end": 1752480600000 - }, - "views": [ - { - "source": "browser", - "view_id": "6f2b6b1a-8f7e-4e3a-9c2b-1a2b3c4d5e6f", - "name": "/dashboard", - "url": "https://app.example.com/dashboard", - "loading_type": "initial_load", - "container_source": "", - "container_view_id": "", - "server_time_delta": 0, - "start": 1752480000000, - "end": 1752480600000, - "is_active": false - } - ], - "foreground_periods": [] - } - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" + "required": [ + "match", + "set" + ], + "type": "object" + }, + "RemoteConfigValues": { + "description": "The SDK knobs a configuration can set. Every field is optional: a value absent from both rule and default is omitted from the SDK response, which tells the SDK to keep its init value.", + "properties": { + "defaultPrivacyLevel": { + "description": "How Session Replay masks a page by default.", + "enum": [ + "mask", + "mask-user-input", + "allow" + ], + "type": [ + "string", + "null" + ] }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "sessionReplaySampleRate": { + "description": "Session Replay sampling rate (0-100).", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "sessionSampleRate": { + "description": "Session sampling rate (0-100).", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] }, - "500": { - "$ref": "#/components/responses/ServerError" + "traceSampleRate": { + "description": "Trace sampling rate (0-100): which sessions inject trace headers into their requests.", + "maximum": 100, + "minimum": 0, + "type": [ + "integer", + "null" + ] } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumSessionReplayMetaRequest" - }, - "example": { - "session_id": "0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81" - } - } + "type": "object" + }, + "RemoveIncidentRequest": { + "description": "Parameters for permanently removing incidents.", + "properties": { + "incident_ids": { + "description": "Incident IDs to remove. At most 100 per call. The caller must have access to every channel the incidents belong to.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" } - } - } - }, - "/rum/session-replay/segments": { - "post": { - "operationId": "rum-session-replay-read-segments", - "summary": "List session replay segments", - "description": "Page through the recorded replay segments of a session, as presigned URLs or a raw stream.", - "tags": [ - "RUM/Session replay" + }, + "required": [ + "incident_ids" ], - "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.\n- When `url_mode` is `true`, the response is a normal JSON envelope containing presigned download URLs (valid 1 hour) instead of the raw segment bytes.\n- Pass `ts` to seek to the most recent full-snapshot segment at or before that time, instead of paging from the start of the session.\n- `limit` accepts 1-99; values of 100 or more are rejected.", - "href": "/en/api-reference/rum/session-replay/rum-session-replay-read-segments", - "metadata": { - "sidebarTitle": "List session replay segments" + "type": "object" + }, + "ReopenIncidentRequest": { + "description": "Parameters for reopening one or more closed incidents.", + "properties": { + "incident_ids": { + "description": "Incident IDs to reopen. At most 100 per call.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "reason": { + "description": "Optional reason recorded on the timeline.", + "maxLength": 1024, + "type": "string" } }, - "responses": { - "200": { - "description": "Success. Shape depends on `url_mode` — see Usage.", - "headers": { - "X-Search-After-Ctx": { - "description": "Base64-encoded pagination cursor for the next call. Only set in streaming mode (`url_mode: false`).", - "schema": { - "type": "string" - } - } + "required": [ + "incident_ids" + ], + "type": "object" + }, + "ReorderIncidentCommentTypesRequest": { + "description": "Parameters for reordering comment types.", + "properties": { + "comment_type_ids": { + "description": "IDs of every comment type of the account in the desired order (24-character hex ObjectIDs).", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" }, - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/RumSessionReplaySegmentsResult" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R5", - "data": { - "items": [ - "https://rum-replay.flashcat.cloud/short-term/2451002751131/0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81/segments/1752480001234?X-Amz-Signature=example", - "https://rum-replay.flashcat.cloud/short-term/2451002751131/0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81/segments/1752480032456?X-Amz-Signature=example" - ], - "search_after_ctx": "c2hvcnQtdGVybS8yNDUxMDAyNzUxMTMxLzBhNGEyZTY0LThhNGYtNGI5YS05YzFlLTNhMmY5ZTZkN2M4MS9zZWdtZW50cy8xNzUyNDgwMDMyNDU2" - } - } - }, - "application/x-ndjson": { - "schema": { - "type": "string", - "description": "Newline-delimited JSON (NDJSON). Each line is one decompressed replay segment record (rrweb-format events), streamed directly and not wrapped in the standard envelope." - } - } - } + "minItems": 1, + "type": "array" + } + }, + "required": [ + "comment_type_ids" + ], + "type": "object" + }, + "ResetIncidentFieldRequest": { + "description": "Parameters for updating a custom field value on an incident.", + "properties": { + "field_name": { + "description": "Custom field name; must match a field defined on the account.", + "type": "string" + }, + "field_value": { + "description": "New field value. Type must match the field definition." + }, + "incident_id": { + "description": "Incident ID (MongoDB ObjectID).", + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + } + }, + "required": [ + "incident_id", + "field_name" + ], + "type": "object" + }, + "ResetPostMortemBasicsRequest": { + "description": "Basic incident facts to write back to a post-mortem report.", + "properties": { + "incidents_earliest_start_seconds": { + "description": "Unix timestamp in seconds for the earliest linked incident start time.", + "format": "int64", + "minimum": 1, + "type": "integer" + }, + "incidents_highest_severity": { + "description": "Highest severity among linked incidents: `Critical`, `Warning`, `Info`, or `Ok`.", + "enum": [ + "Critical", + "Warning", + "Info", + "Ok" + ], + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "incidents_latest_close_seconds": { + "description": "Unix timestamp in seconds for the latest linked incident close time. 0 when still open.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "incidents_total_duration_seconds": { + "description": "Total incident duration in seconds.", + "format": "int64", + "minimum": 0, + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "post_mortem_id": { + "description": "Post-mortem ID; obtain it from `POST /incident/post-mortem/list`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "responder_ids": { + "description": "Responder member IDs to store on the report.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RumSessionReplaySegmentsRequest" - }, - "example": { - "session_id": "0a4a2e64-8a4f-4b9a-9c1e-3a2f9e6d7c81", - "limit": 20, - "url_mode": true - } - } + "required": [ + "post_mortem_id", + "incidents_highest_severity", + "incidents_earliest_start_seconds" + ], + "type": "object" + }, + "ResetPostMortemContentRequest": { + "description": "Parameters for fully replacing a drafting post-mortem report body.", + "properties": { + "expected_revision": { + "description": "Current content revision expected by the caller. Pass 0 for the first write to a document that has never been saved.", + "format": "int64", + "minimum": 0, + "type": [ + "integer", + "null" + ] + }, + "idempotency_key": { + "description": "Non-blank key for safely retrying this exact reset request.", + "maxLength": 128, + "minLength": 1, + "type": "string" + }, + "markdown": { + "description": "Replacement Markdown content. Limited to 4 MiB.", + "type": "string" + }, + "post_mortem_id": { + "description": "ID of the post-mortem to reset; obtain it from `POST /incident/post-mortem/list`.", + "type": "string" } - } - } - }, - "/oncall/license/list": { - "post": { - "operationId": "oncall-license-read-license-list", - "summary": "List On-call licenses", - "description": "List people with active fixed or temporary On-call licenses in the current account.", - "tags": [ - "On-call/Licenses" + }, + "required": [ + "post_mortem_id", + "markdown", + "expected_revision", + "idempotency_key" ], - "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- `items` contains only people with an active fixed or temporary On-call license.\n- For temporary licenses, `updated_by`, `created_at`, and `updated_at` are `0`.", - "href": "/en/api-reference/on-call/licenses/oncall-license-read-license-list", - "metadata": { - "sidebarTitle": "List On-call licenses" + "type": "object" + }, + "ResetPostMortemFollowUpsRequest": { + "description": "Parameters for replacing post-mortem follow-up action items.", + "properties": { + "follow_ups": { + "description": "Follow-up action items as free text.", + "type": "string" + }, + "post_mortem_id": { + "description": "Post-mortem ID; obtain it from `POST /incident/post-mortem/list`.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/LicenseListResponse" - } - } - } - ] - }, - "example": { - "request_id": "01J0D5Y31GY2TWAHRP3Q8K4M6N", - "data": { - "total": 2, - "items": [ - { - "person_id": 80011, - "person_name": "Yuki Zhang", - "type": "fixed", - "updated_by": 80001, - "created_at": 1719792000, - "updated_at": 1719878400 - }, - { - "person_id": 80012, - "person_name": "Alex Chen", - "type": "temporary", - "updated_by": 0, - "created_at": 0, - "updated_at": 0 - } - ] - } - } - } - } + "required": [ + "post_mortem_id" + ], + "type": "object" + }, + "ResetPostMortemStatusRequest": { + "description": "Parameters for changing a post-mortem report status.", + "properties": { + "post_mortem_id": { + "description": "Post-mortem ID; obtain it from `POST /incident/post-mortem/list`.", + "type": "string" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "status": { + "description": "Target report status: `drafting` draft, `published` published.", + "enum": [ + "drafting", + "published" + ], + "type": "string" + } + }, + "required": [ + "post_mortem_id", + "status" + ], + "type": "object" + }, + "ResetPostMortemTitleRequest": { + "description": "Parameters for changing a post-mortem report title.", + "properties": { + "post_mortem_id": { + "description": "Post-mortem ID; obtain it from `POST /incident/post-mortem/list`.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "title": { + "description": "New report title.", + "type": "string" + } + }, + "required": [ + "post_mortem_id", + "title" + ], + "type": "object" + }, + "ResetWorkItemAssigneesRequest": { + "description": "Full replacement of a work item's assignee set.", + "properties": { + "assignee_ids": { + "description": "New assignee member IDs, replacing the current set. An empty array clears all assignees.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "version": { + "description": "Current item version for optimistic locking. Must match the stored version.", + "format": "int64", + "type": "integer" }, - "500": { - "$ref": "#/components/responses/ServerError" + "work_item_id": { + "description": "Work item ID (opaque string, max 128 characters).", + "maxLength": 128, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/EmptyRequest" - }, - "example": {} - } - } - } - } - }, - "/incident/comment-type/list": { - "post": { - "operationId": "incidentCommentTypeList", - "summary": "List comment types", - "description": "Retrieve all comment types of the account, ordered by their display position.", - "tags": [ - "On-call/Incidents" + "required": [ + "work_item_id", + "version" ], - "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** (`on-call`) |\n\n## Usage\n\n- Returns the full list in one call — there is no pagination.\n- An account can have at most 10 comment types.", - "href": "/en/api-reference/on-call/incidents/incident-comment-type-list", - "metadata": { - "sidebarTitle": "List comment types" + "type": "object" + }, + "ResolveIncidentRequest": { + "description": "Parameters for resolving one or more incidents.", + "properties": { + "custom_fields": { + "$ref": "#/components/schemas/CustomFieldValues", + "description": "Custom field values for the resolution form. Allowed keys and values depend on the incident's visible form." + }, + "description": { + "description": "New incident description, up to 6,144 characters. When set, it replaces the current description before the incident closes.", + "maxLength": 6144, + "type": [ + "string", + "null" + ] + }, + "images": { + "description": "Images attached to the resolution timeline entry.", + "items": { + "$ref": "#/components/schemas/IncidentActionImage" + }, + "type": "array" + }, + "incident_ids": { + "description": "Incident IDs to resolve. At most 100 per call.", + "items": { + "pattern": "^[0-9a-fA-F]{24}$", + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" + }, + "resolution": { + "description": "Optional resolution note applied to every resolved incident.", + "maxLength": 1024, + "type": [ + "string", + "null" + ] + }, + "root_cause": { + "description": "Optional root cause note applied to every resolved incident.", + "maxLength": 1024, + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "Form summary recorded as a timeline comment. Accepted only when the resolution form contains a summary element.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ListIncidentCommentTypesResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "comment_type_id": "6a5895d672a064bc2d3ddfc2", - "account_id": 2451002751131, - "name": "Key finding", - "color": "#30A46C", - "position": 1, - "creator_id": 5068740052131, - "updated_by": 5068740052131, - "created_at": 1784190422, - "updated_at": 1784207748 - }, - { - "comment_type_id": "6a5895b572a064bc2d3ddfc0", - "account_id": 2451002751131, - "name": "Hypothesis", - "color": "#998000", - "position": 2, - "creator_id": 5068740052131, - "updated_by": 3790925372131, - "created_at": 1784190389, - "updated_at": 1785141535 - } - ] - } - } - } - } + "required": [ + "incident_ids" + ], + "type": "object" + }, + "Responder": { + "description": "Incident responder with assignment/acknowledgement timestamps.", + "properties": { + "acknowledged_at": { + "description": "Unix timestamp (seconds) when the member acknowledged. 0 if not yet acknowledged.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "as": { + "description": "Role label of this responder.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "assigned_at": { + "description": "Unix timestamp (seconds) when the member was assigned.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "email": { + "description": "Member email, filled by the server.", + "format": "email", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "person_id": { + "description": "Responder member ID.", + "format": "int64", + "type": "integer" + }, + "person_name": { + "description": "Member display name, filled by the server.", + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListIncidentCommentTypesRequest" + "required": [ + "person_id", + "assigned_at", + "acknowledged_at" + ], + "type": "object" + }, + "ResponderInsightItem": { + "allOf": [ + { + "$ref": "#/components/schemas/MetricsBase" + }, + { + "description": "Aggregated incident metrics for a single responder.", + "properties": { + "acknowledgement_pct": { + "description": "This responder's acknowledgement rate (%): acknowledged incidents ÷ involved incidents × 100, rounded to two decimals and capped at 100; 0 when the responder has no incidents.", + "format": "double", + "type": "number" }, - "example": {} - } + "mean_seconds_to_ack": { + "description": "This responder's mean time to acknowledgement in seconds; 0 when the responder acknowledged nothing.", + "format": "double", + "type": "number" + }, + "total_engaged_seconds": { + "description": "This responder's total engaged time in seconds: each incident contributes close time minus their acknowledgement time.", + "format": "int64", + "type": "integer" + }, + "total_incident_cnt": { + "description": "Incidents this responder was involved in.", + "format": "int64", + "type": "integer" + }, + "total_incidents_acknowledged": { + "description": "Incidents acknowledged by this responder.", + "format": "int64", + "type": "integer" + }, + "total_incidents_escalated": { + "description": "This responder's incidents that were escalated at least once.", + "format": "int64", + "type": "integer" + }, + "total_incidents_manually_escalated": { + "description": "This responder's incidents escalated manually.", + "format": "int64", + "type": "integer" + }, + "total_incidents_reassigned": { + "description": "Incidents reassigned away from this responder.", + "format": "int64", + "type": "integer" + }, + "total_incidents_timeout_escalated": { + "description": "This responder's incidents escalated on timeout.", + "format": "int64", + "type": "integer" + }, + "total_interruptions": { + "description": "Interruptions for this responder: notifications sent via app push, SMS, or voice call; consecutive notifications within 60 seconds count as one.", + "format": "int64", + "type": "integer" + }, + "total_notifications": { + "description": "Total notifications sent to this responder.", + "format": "int64", + "type": "integer" + }, + "total_seconds_to_ack": { + "description": "This responder's total time to acknowledgement in seconds: each incident contributes acknowledgement time minus assignment time.", + "format": "int64", + "type": "integer" + } + }, + "type": "object" } - } - } - }, - "/incident/comment-type/create": { - "post": { - "operationId": "incidentCommentTypeCreate", - "summary": "Create a comment type", - "description": "Create a comment type that can be attached to incident comments.", - "tags": [ - "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 | **Comment Types Manage** (`on-call`) |\n\n## Usage\n\n- The new type is appended to the end of the display ordering.\n- The name must be unique within the account (case-insensitive, after trimming whitespace).\n- An account can have at most 10 comment types.\n- This permission is admin-only by default; custom roles must be granted it explicitly.", - "href": "/en/api-reference/on-call/incidents/incident-comment-type-create", - "metadata": { - "sidebarTitle": "Create a comment type" + ] + }, + "ResponderInsightResponse": { + "properties": { + "items": { + "description": "Incident response metric rows aggregated by responder; further split by hour bucket or time bucket when `split_hours` or `aggregate_unit` is enabled.", + "items": { + "$ref": "#/components/schemas/ResponderInsightItem" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CreateIncidentCommentTypeResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": { - "comment_type_id": "6a5895d672a064bc2d3ddfc2", - "item": { - "comment_type_id": "6a5895d672a064bc2d3ddfc2", - "account_id": 2451002751131, - "name": "Key finding", - "color": "#30A46C", - "position": 1, - "creator_id": 5068740052131, - "updated_by": 5068740052131, - "created_at": 1784190422, - "updated_at": 1784207748 - } - } - } - } - } + "type": "object" + }, + "ResponseEnvelope": { + "description": "Standard response envelope used by every Flashduty public API. On success `data` contains the endpoint-specific payload and `error` is absent. On failure `error` is present and `data` is absent. `request_id` is always present and is also mirrored in the `Flashcat-Request-Id` response header.", + "properties": { + "data": { + "description": "Endpoint-specific payload. See each operation's 200 response schema." }, - "400": { - "$ref": "#/components/responses/BadRequest" + "error": { + "$ref": "#/components/schemas/DutyError" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "request_id": { + "description": "Unique ID for this request. Mirrored in the Flashcat-Request-Id header. Include it when reporting issues.", + "example": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", + "type": "string" + } + }, + "required": [ + "request_id" + ], + "type": "object" + }, + "RevertRemoteConfigRequest": { + "description": "Republish an earlier version's content under a new version number.", + "properties": { + "application_id": { + "description": "RUM application ID.", + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "reason": { + "description": "Operator's note. The console fills in `rolled back to vN` when left empty.", + "maxLength": 255, + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "version": { + "description": "History version to republish.", + "minimum": 1, + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateIncidentCommentTypeRequest" - }, - "example": { - "name": "Key finding", - "color": "#30A46C" - } - } - } - } - } - }, - "/incident/comment-type/update": { - "post": { - "operationId": "incidentCommentTypeUpdate", - "summary": "Update a comment type", - "description": "Update the name and/or color of an existing account comment type.", - "tags": [ - "On-call/Incidents" + "required": [ + "application_id", + "version" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Comment Types Manage** (`on-call`) |\n\n## Usage\n\n- Partial update — only the provided fields are changed, but at least one of `name` or `color` must be provided.\n- The name must remain unique within the account (case-insensitive, after trimming whitespace).\n- This permission is admin-only by default; custom roles must be granted it explicitly.", - "href": "/en/api-reference/on-call/incidents/incident-comment-type-update", - "metadata": { - "sidebarTitle": "Update a comment type" + "type": "object" + }, + "RevertRemoteConfigResponse": { + "description": "Version created by the revert.", + "properties": { + "version": { + "description": "New version number created by the revert.", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } - }, - "400": { - "$ref": "#/components/responses/BadRequest" - }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "type": "object" + }, + "RoleDeleteRequest": { + "description": "Request to delete a role.", + "properties": { + "is_force": { + "default": false, + "description": "When false (default), deletion fails with a `ReferenceExist` error listing the members that still hold the role in `data.refs`. When true, the role is first revoked from all holders and then deleted.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "role_id": { + "description": "Role ID to delete. Get IDs from `POST /role/list` (built-in roles: 2=Admin, 6=Responder, 8=Viewer).", + "format": "uint64", + "type": "integer" + } + }, + "required": [ + "role_id" + ], + "type": "object" + }, + "RoleGrantRequest": { + "description": "Request to grant or revoke a role from members.", + "properties": { + "member_ids": { + "description": "Member IDs to grant/revoke the role.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "role_id": { + "description": "Role ID to grant or revoke. Get IDs from `POST /role/list`.", + "format": "uint64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateIncidentCommentTypeRequest" - }, - "example": { - "comment_type_id": "6a5895b572a064bc2d3ddfc0", - "color": "#B7791F" - } - } + "required": [ + "member_ids", + "role_id" + ], + "type": "object" + }, + "RoleIDRequest": { + "properties": { + "role_id": { + "description": "Role ID to operate on. Get IDs from `POST /role/list` (built-in roles: 2=Admin, 6=Responder, 8=Viewer).", + "format": "uint64", + "type": "integer" } - } - } - }, - "/incident/comment-type/delete": { - "post": { - "operationId": "incidentCommentTypeDelete", - "summary": "Delete a comment type", - "description": "Delete a comment type. Comments that used it keep their text but lose the type label.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "role_id" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Comment Types Manage** (`on-call`) |\n\n## Usage\n\n- Hard delete — the comment type is removed permanently and cannot be restored.\n- Existing comments that referenced the type lose the type label but are not otherwise affected.\n- This permission is admin-only by default; custom roles must be granted it explicitly.", - "href": "/en/api-reference/on-call/incidents/incident-comment-type-delete", - "metadata": { - "sidebarTitle": "Delete a comment type" + "type": "object" + }, + "RoleInfoRequest": { + "properties": { + "role_id": { + "description": "Role ID to query. Get IDs from `POST /role/list` (built-in roles: 2=Admin, 6=Responder, 8=Viewer).", + "format": "uint64", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "required": [ + "role_id" + ], + "type": "object" + }, + "RoleItem": { + "description": "A role and its permission set.", + "properties": { + "created_at": { + "description": "Unix epoch seconds the role was created.", + "format": "int64", + "type": "integer" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "description": { + "description": "Role description.", + "type": "string" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "editable": { + "description": "False for built-in roles which cannot be modified.", + "type": "boolean" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "permission_ids": { + "description": "IDs of permissions granted by this role.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "role_id": { + "description": "Unique role ID.", + "format": "uint64", + "type": "integer" + }, + "role_name": { + "description": "Role display name.", + "type": "string" + }, + "status": { + "description": "Role status.", + "enum": [ + "enabled", + "disabled" + ], + "type": "string" + }, + "updated_at": { + "description": "Unix epoch seconds the role was last updated.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteIncidentCommentTypeRequest" - }, - "example": { - "comment_type_id": "6a5895b572a064bc2d3ddfc0" - } - } - } - } - } - }, - "/incident/comment-type/reorder": { - "post": { - "operationId": "incidentCommentTypeReorder", - "summary": "Reorder comment types", - "description": "Set the display order of all comment types by passing every type ID in the desired order.", - "tags": [ - "On-call/Incidents" + "required": [ + "role_id", + "role_name", + "description", + "status", + "permission_ids", + "editable", + "created_at", + "updated_at" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Comment Types Manage** (`on-call`) |\n\n## Usage\n\n- Full-set reorder — `comment_type_ids` must contain every comment type of the account, each exactly once, in the desired order.\n- Positions are reassigned starting from 1: the first ID in the array becomes position 1.\n- This permission is admin-only by default; custom roles must be granted it explicitly.", - "href": "/en/api-reference/on-call/incidents/incident-comment-type-reorder", - "metadata": { - "sidebarTitle": "Reorder comment types" + "type": "object" + }, + "RoleListRequest": { + "description": "Filters for listing roles.", + "properties": { + "asc": { + "description": "Ascending sort order. Default: false (descending).", + "type": "boolean" + }, + "no_global": { + "description": "When true, exclude the built-in global roles (Admin, Responder, Viewer) and return only custom roles. Default: false.", + "type": "boolean" + }, + "orderby": { + "description": "Sort field. Default: `updated_at`.", + "enum": [ + "created_at", + "updated_at" + ], + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/EmptyResponse" - } - } - } - ] - }, - "example": { - "request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4", - "data": {} - } - } - } + "type": "object" + }, + "RoleListResponse": { + "description": "Role list result.", + "properties": { + "items": { + "description": "Array of roles; includes account roles plus built-in global roles unless `no_global=true`; empty array when no results.", + "items": { + "$ref": "#/components/schemas/RoleItem" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "total": { + "description": "Total role count.", + "type": "integer" + } + }, + "required": [ + "total", + "items" + ], + "type": "object" + }, + "RolePermissionListRequest": { + "description": "Filters for listing permissions.", + "properties": { + "role_ids": { + "description": "Filter to permissions granted to these roles.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "with_all": { + "description": "If true, return all permissions with is_granted set to indicate which are granted.", + "type": "boolean" + } + }, + "type": "object" + }, + "RolePermissionListResponse": { + "description": "Permission list result.", + "properties": { + "items": { + "description": "Array of permission items: system-level permissions plus the caller's account-scoped custom-menu permissions (never other tenants' rows).", + "items": { + "$ref": "#/components/schemas/PermissionItem" + }, + "type": "array" + } + }, + "required": [ + "items" + ], + "type": "object" + }, + "RoleUpsertRequest": { + "description": "Parameters for creating or updating a custom role.", + "properties": { + "description": { + "description": "Role description.", + "maxLength": 499, + "type": "string" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "permission_ids": { + "description": "Permission IDs to grant. Replaces the existing set.", + "items": { + "format": "uint64", + "type": "integer" + }, + "type": "array" }, - "500": { - "$ref": "#/components/responses/ServerError" + "role_id": { + "description": "Role ID. Omit or set to 0 to create.", + "format": "uint64", + "type": "integer" + }, + "role_name": { + "description": "Role display name. 1–39 characters.", + "maxLength": 39, + "minLength": 1, + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ReorderIncidentCommentTypesRequest" - }, - "example": { - "comment_type_ids": [ - "6a5895b572a064bc2d3ddfc0", - "6a5895d672a064bc2d3ddfc2" - ] - } - } - } - } - } - }, - "/incident/work-item/list": { - "post": { - "operationId": "incidentWorkItemList", - "summary": "List work items", - "description": "List incident work items (actions and post-mortem follow-ups) with cursor pagination.", - "tags": [ - "On-call/Incidents" + "required": [ + "role_name" ], - "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** (`on-call`) |\n\n## Usage\n\n- At least one of `incident_id`, `post_mortem_id`, or `assignee_id` is required.\n- Cursor pagination sorted by `updated_at_seconds` descending — pass the previous response's `next_cursor` as `cursor` until `has_more` is false.\n- Listing by `incident_id` also includes follow-ups anchored on the incident's post-mortem.\n- Listing by `assignee_id` alone requires being that assignee or an account admin.", - "href": "/en/api-reference/on-call/incidents/incident-work-item-list", - "metadata": { - "sidebarTitle": "List work items" + "type": "object" + }, + "RoleUpsertResponse": { + "description": "Role create/update result.", + "properties": { + "role_id": { + "description": "Created or updated role ID.", + "format": "uint64", + "type": "integer" + }, + "role_name": { + "description": "Role name echoed from the request.", + "type": "string" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/WorkItemListResult" - } - } - } - ] - }, - "example": { - "request_id": "01J8XQ3E5Z7JM2NTFQ5YJ8P9R4", - "data": { - "items": [ - { - "work_item_id": "wi_68MHnkWBiyjrh6uhkxUyiZ", - "item_type": "follow_up", - "incident_id": "6a5f1e28807515413b384bce", - "post_mortem_id": "51d65cd9525c369379ba471b5512df63", - "title": "Follow-ups assigned to Bowen and Weili", - "status": "done", - "source_kind": "native", - "version": 2, - "assignee_ids": [ - 3790925372131, - 4756301322131, - 5068740052131 - ], - "created_by": 5329873302131, - "updated_by": 3790925372131, - "created_at_seconds": 1785495329, - "updated_at_seconds": 1785496384 - }, - { - "work_item_id": "wi_dMRYTeZHivE5vf87PQEeFX", - "item_type": "follow_up", - "incident_id": "6a5f1e28807515413b384bce", - "post_mortem_id": "51d65cd9525c369379ba471b5512df63", - "title": "Check whether this to-do notifies Bowen", - "status": "open", - "source_kind": "native", - "version": 1, - "assignee_ids": [ - 5068740052131 - ], - "created_by": 3790925372131, - "updated_by": 3790925372131, - "created_at_seconds": 1785495164, - "updated_at_seconds": 1785495164 - } - ], - "next_cursor": "MTc4NTQ5NTE2NHx3aV9kTVJZVGVaSGl2RTV2Zjg3UFFFZUZY", - "has_more": true - } - } - } - } + "required": [ + "role_id", + "role_name" + ], + "type": "object" + }, + "RouteCase": { + "description": "A single case branch in the routing rule. When all of its conditions match, the alert is dispatched to the configured channels.", + "properties": { + "channel_ids": { + "description": "Target channel IDs. Required when `routing_mode` is `standard` (or empty); returned as `null` for `name_mapping`.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": [ + "array", + "null" + ] }, - "400": { - "$ref": "#/components/responses/BadRequest" + "fallthrough": { + "description": "If `true`, evaluation continues to the next case after this one matches; otherwise matching stops at the first hit.", + "type": "boolean" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "if": { + "description": "List of match conditions that are AND-ed together.", + "items": { + "$ref": "#/components/schemas/RouteMatchCondition" + }, + "type": "array" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "name_mapping_label": { + "description": "Label key whose value is used as the target channel name. Required when `routing_mode` is `name_mapping`.", + "type": "string" }, - "500": { - "$ref": "#/components/responses/ServerError" + "routing_mode": { + "description": "Routing mode. `standard` (default, also used when left empty) routes to the fixed channel IDs; `name_mapping` resolves channels by reading a label value from the alert event.", + "enum": [ + "standard", + "name_mapping" + ], + "type": "string" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListWorkItemRequest" - }, - "example": { - "incident_id": "6a5f1e28807515413b384bce", - "limit": 50 - } - } - } - } - } - }, - "/incident/work-item/create": { - "post": { - "operationId": "incidentWorkItemCreate", - "summary": "Create a work item", - "description": "Create an action on an active incident or a follow-up on one of its post-mortems.", - "tags": [ - "On-call/Incidents" + "required": [ + "if" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Requires the On-call Pro license.\n- An `action` anchors to an active incident and must NOT set `post_mortem_id`; a `follow_up` REQUIRES the `post_mortem_id` of a post-mortem linked to `incident_id`.\n- Assignees must be active members who can already read the anchor incident or post-mortem — assignment never grants access.\n- Newly added assignees are notified.\n- Retrying with the same (`creator`, `idempotency_key`) replays the original item with `idempotent_replay: true` instead of creating a duplicate.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/incidents/incident-work-item-create", - "metadata": { - "sidebarTitle": "Create a work item" + "type": "object" + }, + "RouteDefault": { + "description": "Default branch used when no case matches (or all matched cases yield no valid channels).", + "properties": { + "channel_ids": { + "description": "Channel IDs to fall back to.", + "items": { + "format": "int64", + "type": "integer" + }, + "type": "array" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/WorkItemCreateResult" - } - } - } - ] - }, - "example": { - "request_id": "01J8XQ3E5Z7JM2NTFQ5YJ8P9R4", - "data": { - "item": { - "work_item_id": "wi_9fK2mNqRtVwXyZaBcDeFgH", - "item_type": "action", - "incident_id": "6a5f1e28807515413b384bce", - "title": "Roll back the v2.14 deployment on web-server-01", - "status": "open", - "source_kind": "native", - "version": 1, - "assignee_ids": [ - 3790925372131 - ], - "created_by": 3790925372131, - "updated_by": 3790925372131, - "created_at_seconds": 1785496400, - "updated_at_seconds": 1785496400 - }, - "added_assignee_ids": [ - 3790925372131 - ] - } - } - } - } + "type": "object" + }, + "RouteInfoRequest": { + "description": "Parameters for retrieving the routing rule of one integration.", + "properties": { + "integration_id": { + "description": "Integration ID. Must be greater than 0.", + "exclusiveMinimum": 0, + "format": "int64", + "type": "integer" + } + }, + "required": [ + "integration_id" + ], + "type": "object" + }, + "RouteItem": { + "description": "Routing rule of an integration. Alerts are evaluated against `cases` in order; unmatched alerts fall through to `default`. Returns `null` when the integration has no configured rule.", + "properties": { + "cases": { + "description": "Ordered list of case branches.", + "items": { + "$ref": "#/components/schemas/RouteCase" + }, + "type": "array" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "created_at": { + "description": "Creation time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "creator_id": { + "description": "ID of the person who created the rule.", + "format": "int64", + "type": "integer" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "default": { + "$ref": "#/components/schemas/RouteDefault" }, - "500": { - "$ref": "#/components/responses/ServerError" + "deleted_at": { + "description": "Soft-delete timestamp, Unix seconds. Omitted when the rule is active.", + "format": "int64", + "type": "integer" + }, + "integration_id": { + "description": "Integration the rule belongs to.", + "format": "int64", + "type": "integer" + }, + "sections": { + "description": "Optional sections that visually group cases.", + "items": { + "$ref": "#/components/schemas/RouteSection" + }, + "type": "array" + }, + "status": { + "description": "Route status. `enabled` means active; `deleted` means removed, visible only in historical versions.", + "enum": [ + "enabled", + "deleted" + ], + "type": "string" + }, + "updated_at": { + "description": "Last update time, Unix timestamp in seconds.", + "format": "int64", + "type": "integer" + }, + "updated_by": { + "description": "ID of the person who performed the last update.", + "format": "int64", + "type": "integer" + }, + "version": { + "description": "Monotonic version number, incremented on each update. Use it for optimistic concurrency control.", + "format": "int64", + "type": "integer" } }, - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateWorkItemRequest" - }, - "example": { - "item_type": "action", - "title": "Roll back the v2.14 deployment on web-server-01", - "description": "CPU saturation started right after the v2.14 rollout; roll back and watch the error rate.", - "status": "open", - "priority": "high", - "incident_id": "6a5f1e28807515413b384bce", - "assignee_ids": [ - 3790925372131 - ], - "idempotency_key": "create-wi-20260731-0001" - } - } + "required": [ + "version", + "updated_by", + "creator_id" + ], + "type": "object" + }, + "RouteMatchCondition": { + "description": "A single match condition. All conditions inside one case form an AND group.", + "properties": { + "key": { + "description": "Field key to match against the alert event (e.g. `alert_severity`, `labels.service`).", + "type": "string" + }, + "oper": { + "description": "Match operator. `IN` matches when the field value is one of `vals`; `NOTIN` matches when it is not.", + "enum": [ + "IN", + "NOTIN" + ], + "type": "string" + }, + "vals": { + "description": "Values to compare against. Each value may be a literal string, a wildcard (`*`, `?`), a regular expression wrapped in slashes (`/pattern/`), a CIDR (`cidr:10.0.0.0/8`), or a numeric comparison (`num:lt:100`).", + "items": { + "type": "string" + }, + "type": "array" } - } - } - }, - "/incident/work-item/update": { - "post": { - "operationId": "incidentWorkItemUpdate", - "summary": "Update a work item", - "description": "Partially update a work item's title, description, status, or priority.", - "tags": [ - "On-call/Incidents" + }, + "required": [ + "key", + "oper", + "vals" ], - "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Requires the On-call Pro license.\n- Partial patch: omitted fields stay unchanged; an explicit `null` clears the field.\n- Optimistic locking — `version` must match the item's current version; a mismatch returns a conflict error.\n- Assignees, `item_type`, and the incident/post-mortem anchors cannot be changed here — use the dedicated endpoints.\n- Audited — changes are recorded in the audit log.", - "href": "/en/api-reference/on-call/incidents/incident-work-item-update", - "metadata": { - "sidebarTitle": "Update a work item" + "type": "object" + }, + "RouteSection": { + "description": "A logical section that groups consecutive cases for display purposes.", + "properties": { + "name": { + "description": "Section name. Must be unique within the rule.", + "type": "string" + }, + "position": { + "description": "Index in `cases` where this section starts. Must be between 0 and the length of `cases`.", + "type": "integer" } }, - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "allOf": [ - { - "$ref": "#/components/schemas/SuccessEnvelope" + "required": [ + "name", + "position" + ], + "type": "object" + }, + "RuleAuditListResponse": { + "description": "Audit records for a rule, ordered by creation time descending. The `content` field is omitted.", + "items": { + "$ref": "#/components/schemas/AlertRuleAudit" + }, + "type": "array" + }, + "RuleBasicListResponse": { + "description": "List of alert rules (basic info).", + "items": { + "$ref": "#/components/schemas/AlertRuleBasic" + }, + "type": "array" + }, + "RuleConfigs": { + "description": "Rule evaluation configuration.", + "properties": { + "check_anydata": { + "description": "Any-data check configuration. Fires when the query returns any data rows.", + "properties": { + "alerting_check_times": { + "description": "Number of consecutive evaluations that must satisfy the condition before alerting; minimum 1.", + "type": "integer" + }, + "enabled": { + "description": "Whether any-data checking is enabled: any returned data row triggers an alert.", + "type": "boolean" + }, + "push_recovery_event": { + "description": "Whether to push a recovery event notification when the alert resolves.", + "type": "boolean" + }, + "recovery": { + "description": "Recovery condition for any-data check. If omitted or `mode` is empty, treated as `nodata`.", + "properties": { + "args": { + "additionalProperties": { + "type": "string" }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/WorkItemMutationResult" - } - } - } - ] - }, - "example": { - "request_id": "01J8XQ3E5Z7JM2NTFQ5YJ8P9R4", - "data": { - "item": { - "work_item_id": "wi_68MHnkWBiyjrh6uhkxUyiZ", - "item_type": "follow_up", - "incident_id": "6a5f1e28807515413b384bce", - "post_mortem_id": "51d65cd9525c369379ba471b5512df63", - "title": "Follow-ups assigned to Bowen and Weili", - "status": "done", - "source_kind": "native", - "version": 2, - "assignee_ids": [ - 3790925372131, - 4756301322131, - 5068740052131 - ], - "created_by": 5329873302131, - "updated_by": 3790925372131, - "created_at_seconds": 1785495329, - "updated_at_seconds": 1785496384 - } + "description": "Datasource-specific options for the recovery query, same convention as `queries[].args`; required for Elasticsearch datasources when `mode` is `ql`.", + "type": "object" + }, + "condition": { + "description": "Recovery expression. Required when `mode` is `ql`.", + "type": "string" + }, + "mode": { + "description": "`nodata` = recover when the query returns no data; `ql` = recover when the `condition` expression evaluates to true. When `mode` is `ql`, only a single query (`name=A`) is permitted.", + "enum": [ + "nodata", + "ql" + ], + "type": "string" } - } + }, + "type": "object" + }, + "recovery_check_times": { + "description": "Number of consecutive evaluations that must satisfy the recovery condition before resolving; minimum 1.", + "type": "integer" + }, + "severity": { + "description": "Severity of any-data alert events; case-sensitive.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" } - } + }, + "type": "object" }, - "400": { - "$ref": "#/components/responses/BadRequest" + "check_nodata": { + "description": "No-data check configuration.", + "properties": { + "alert_on_empty_result": { + "description": "Whether to trigger an alert when every query returns an empty result.", + "type": "boolean" + }, + "alert_on_empty_result_severity": { + "description": "Severity of empty-result alerts, case-sensitive; only effective when `alert_on_empty_result` is enabled.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" + }, + "alerting_check_times": { + "description": "Number of consecutive evaluations that must satisfy the condition before alerting; minimum 1.", + "type": "integer" + }, + "enabled": { + "description": "Whether no-data checking is enabled: a previously-seen series that stops returning data triggers an alert.", + "type": "boolean" + }, + "push_recovery_event": { + "description": "Whether to push a recovery event notification when the alert resolves.", + "type": "boolean" + }, + "recovery_check_times": { + "description": "Number of consecutive evaluations that must satisfy the recovery condition before resolving; minimum 1.", + "type": "integer" + }, + "resolve_timeout": { + "description": "Auto-resolve after N seconds.", + "type": "integer" + }, + "severity": { + "description": "Severity of no-data alert events; case-sensitive.", + "enum": [ + "Critical", + "Warning", + "Info" + ], + "type": "string" + } + }, + "type": "object" }, - "401": { - "$ref": "#/components/responses/Unauthorized" + "check_threshold": { + "description": "Threshold check configuration.", + "properties": { + "alerting_check_times": { + "description": "Number of consecutive evaluations that must satisfy the condition before alerting; minimum 1.", + "type": "integer" + }, + "critical": { + "description": "Critical threshold expression referencing query results via `$` or `$.`, e.g. `$A > 90`; at least one severity must be configured.", + "type": "string" + }, + "enabled": { + "description": "Whether threshold checking is enabled.", + "type": "boolean" + }, + "info": { + "description": "Info threshold expression, same syntax as `critical`.", + "type": "string" + }, + "push_recovery_event": { + "description": "Whether to push a recovery event notification when the alert resolves.", + "type": "boolean" + }, + "recovery": { + "description": "Recovery evaluation configuration for threshold checks.", + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "description": "Datasource-specific extra parameters for the recovery query, using the same `.` key convention as query `args`. Omitted when empty.", + "type": "object" + }, + "condition": { + "description": "Recovery condition expression; required when `mode` is `threshold` or `ql`, and must be empty for `invert`.", + "type": "string" + }, + "mode": { + "description": "Recovery mode: `invert` = resolve when the alert expression no longer holds (`condition` stays empty); `threshold` = resolve when the `condition` threshold expression holds; `ql` = resolve when the `condition` query expression evaluates true.", + "enum": [ + "invert", + "threshold", + "ql" + ], + "type": "string" + }, + "value_fields": { + "description": "Numeric result fields the recovery `condition` references as `$A.`; same semantics as the query's `value_fields`. Omitted when empty.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "recovery_check_times": { + "description": "Number of consecutive evaluations that must satisfy the recovery condition before resolving; minimum 1.", + "type": "integer" + }, + "warning": { + "description": "Warning threshold expression, same syntax as `critical`.", + "type": "string" + } + }, + "type": "object" }, - "429": { - "$ref": "#/components/responses/TooManyRequests" + "queries": { + "description": "Query list with at least one entry; each needs a unique `name` (`R` and `__all__` are reserved) and a non-empty, non-duplicate `expr`.", + "items": { + "properties": { + "args": { + "additionalProperties": { + "type": "string" + }, + "description": "Datasource-specific query options keyed by the `.