Evaluates an alert rule config over the last seven days and reports how often it would have
fired, per group and per hour. The rule does not need to be saved. Nothing is stored as an
alert, and nobody is notified.
What is simulated: the rule exactly as sent, evaluated every stepMs (as often as live
evaluation runs) with the same evaluation live rules use: the value per group from the window
and baseline, the conditions, the pending period (for), recovery, the no data policy,
minExpected, evaluation hours and overrides. Each evaluation continues from the alerts the
previous one left, so an alert that fired stays firing until it recovers, as live.
Input data: the flows or subflows the rule counts, as they are stored now, in one-minute
buckets. Each evaluation reads the window ending dataDelayMs before it, a fixed delay per
rule type; delays from processing backlogs at that time are not known any more and are not
simulated. Flows classified late are included, so a simulation can see slightly more than the
live evaluation saw at the time.
Not simulated: notifications. The contact point, its integrations and its delivery hours are
not taken into account; the result says when alerts would have fired, not who would have been
notified when.
The first simulation reads the data the rule needs, which can take a minute; the response
streams its progress as application/x-ndjson and ends with a completed event carrying the
result, or a failed event. Send the toMs of that result with every later simulation of the
same rule: as long as the rule’s type, flow or subflow type and grouping stay the same, the
data is reused and the simulation answers in about a second, so thresholds, windows and
pending periods can be tuned freely.
Validation errors return a regular JSON error before streaming starts. Only relative_flow_count,
relative_subflow_count and absolute_flow_count rules can be simulated.
Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.
The configuration of an alert rule: the generic envelope every rule type shares, plus one settings object belonging to the rule type named by type. Everything outside settings is implemented once, generically - the window is resolved and handed to the rule type as two absolute timestamps, and the conditions are applied to whatever number the rule type returned, so a rule type never sees the thresholds.
Shape and vocabulary are validated here. The semantics that span fields - that the bands get stricter as the level does, that recovery sits on the lenient side of them, that the window is a whole number of days, and that groupBy names dimensions this project actually has - are validated when the rule is saved and again when it is evaluated, because only the second catches a project that changed after the rule was written.
End of the simulated range in milliseconds since epoch, from the toMs of an earlier
simulation of the same rule. Omit it to simulate the seven days up to now. It must have
ended within the last 24 hours.
Labels of one group, e.g. {"country": "DE"}, whose every step the result carries for a
detailed chart. An ungrouped rule's only group has no labels: send {}.
Show child attributes
Response
Newline-delimited JSON progress stream; the final line carries the simulation result.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Corbado docs","colors":{"primary":"#184aff","light":"#629eff","dark":"#184aff"},"logo":{"light":"https://mintcdn.com/corbado-43/uh5IdxgOHQMtEt9x/logo/corbado-logo-light.svg?fit=max\u0026auto=format\u0026n=uh5IdxgOHQMtEt9x\u0026q=85\u0026s=decbc139fa76d9eeee8dcfbe91ed2094","dark":"https://mintcdn.com/corbado-43/uh5IdxgOHQMtEt9x/logo/corbado-logo-dark.svg?fit=max\u0026auto=format\u0026n=uh5IdxgOHQMtEt9x\u0026q=85\u0026s=398183bb6eb303cda3062b080363672b"},"favicon":"https://mintcdn.com/corbado-43/uh5IdxgOHQMtEt9x/logo/favicon.svg?fit=max\u0026auto=format\u0026n=uh5IdxgOHQMtEt9x\u0026q=85\u0026s=7e718008fe38fabeacb4a3d75472a491","navbar":{"links":[{"href":"mailto:support@corbado.com","label":"Support"}],"primary":{"type":"button","label":"Start for free","href":"https://app.corbado.com/"}},"footer":{"socials":{"twitter":"https://twitter.com/corbadotech","linkedin":"https://www.linkedin.com/company/corbado"}},"integrations":{"hotjar":{"hjid":"3375029","hjsv":"6"},"koala":{"publicApiKey":"pk_ca0e031974819fc6f69a82b884ff6f1cb661"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Community","icon":"slack","href":"https://bit.ly/passkeys-community"},{"anchor":"GitHub","icon":"github","href":"https://github.com/corbado"},{"anchor":"Blog","icon":"newspaper","href":"https://www.corbado.com/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"corbado-43","hasAudioNarration":false,"actualSubdomain":"corbado-43","customDomains":["docs.corbado.com"],"gitSource":{"type":"github","owner":"corbadotech","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adc900fed3bac47b406e772","collectionId":"38a87d0f-ac03-448f-99f4-7659d9910d1e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adc900fed3bac47b406e772"},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae0c6110b083cd94624b308","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"API Reference","count":183},{"language":"default","tag":"Corbado Connect","count":155},{"language":"default","tag":"Corbado Observe","count":133},{"language":"default","tag":"API endpoints","count":90},{"language":"default","tag":"Backend API","count":69},{"language":"default","tag":"Passkey UI Flows","count":32},{"language":"default","tag":"Alert management","count":23},{"language":"default","tag":"Overview","count":17},{"language":"default","tag":"Web","count":16},{"language":"default","tag":"Analytics and configuration","count":16}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"html{scroll-behavior:smooth!important}.pk-accent,.pk-accent-text{fill:#184aff}.dark .pk-accent,.dark .pk-accent-text{fill:#629eff}.pk-node{cursor:pointer;transition:opacity .15s ease}.pk-node:hover{opacity:.72}.connect-visual-dark,.connect-visual-light,.observe-visual-dark,.observe-visual-light{width:100%;height:auto}.connect-visual-light,.observe-visual-light{display:block}.connect-visual-dark,.dark .connect-visual-light,.dark .observe-visual-light,.observe-visual-dark{display:none}.dark .connect-visual-dark,.dark .observe-visual-dark{display:block}"}],"page":{"pagePath":"api-reference/observe/simulate-alert-rule","slug":"/api-reference/observe/simulate-alert-rule","pageMetadata":{"title":"Simulate alert rule","description":"Evaluates an alert rule config over the last seven days and reports how often it would have\nfired, per group and per hour. The rule does not need to be saved. Nothing is stored as an\nalert, and nobody is notified.\n\nWhat is simulated: the rule exactly as sent, evaluated every `stepMs` (as often as live\nevaluation runs) with the same evaluation live rules use: the value per group from the window\nand baseline, the conditions, the pending period (`for`), recovery, the no data policy,\n`minExpected`, evaluation hours and overrides. Each evaluation continues from the alerts the\nprevious one left, so an alert that fired stays firing until it recovers, as live.\n\nInput data: the flows or subflows the rule counts, as they are stored now, in one-minute\nbuckets. Each evaluation reads the window ending `dataDelayMs` before it, a fixed delay per\nrule type; delays from processing backlogs at that time are not known any more and are not\nsimulated. Flows classified late are included, so a simulation can see slightly more than the\nlive evaluation saw at the time.\n\nNot simulated: notifications. The contact point, its integrations and its delivery hours are\nnot taken into account; the result says when alerts would have fired, not who would have been\nnotified when.\n\nThe first simulation reads the data the rule needs, which can take a minute; the response\nstreams its progress as `application/x-ndjson` and ends with a `completed` event carrying the\nresult, or a `failed` event. Send the `toMs` of that result with every later simulation of the\nsame rule: as long as the rule's type, flow or subflow type and grouping stay the same, the\ndata is reused and the simulation answers in about a second, so thresholds, windows and\npending periods can be tuned freely.\n\nValidation errors return a regular JSON error before streaming starts. Only `relative_flow_count`,\n`relative_subflow_count` and `absolute_flow_count` rules can be simulated.\n\nRequired API key permission: `observe:alerts:read`.","deprecated":null,"version":null,"sidebarTitle":"Simulate alert rule","openapi":"/api-reference/openapi/observe.yaml post /observe/alertRules/simulate","href":"/api-reference/observe/simulate-alert-rule","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Evaluates an alert rule config over the last seven days and reports how often it would have\\nfired, per group and per hour. The rule does not need to be saved. Nothing is stored as an\\nalert, and nobody is notified.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"What is simulated: the rule exactly as sent, evaluated every \", _jsx(_components.code, {\n children: \"stepMs\"\n }), \" (as often as live\\nevaluation runs) with the same evaluation live rules use: the value per group from the window\\nand baseline, the conditions, the pending period (\", _jsx(_components.code, {\n children: \"for\"\n }), \"), recovery, the no data policy,\\n\", _jsx(_components.code, {\n children: \"minExpected\"\n }), \", evaluation hours and overrides. Each evaluation continues from the alerts the\\nprevious one left, so an alert that fired stays firing until it recovers, as live.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Input data: the flows or subflows the rule counts, as they are stored now, in one-minute\\nbuckets. Each evaluation reads the window ending \", _jsx(_components.code, {\n children: \"dataDelayMs\"\n }), \" before it, a fixed delay per\\nrule type; delays from processing backlogs at that time are not known any more and are not\\nsimulated. Flows classified late are included, so a simulation can see slightly more than the\\nlive evaluation saw at the time.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Not simulated: notifications. The contact point, its integrations and its delivery hours are\\nnot taken into account; the result says when alerts would have fired, not who would have been\\nnotified when.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The first simulation reads the data the rule needs, which can take a minute; the response\\nstreams its progress as \", _jsx(_components.code, {\n children: \"application/x-ndjson\"\n }), \" and ends with a \", _jsx(_components.code, {\n children: \"completed\"\n }), \" event carrying the\\nresult, or a \", _jsx(_components.code, {\n children: \"failed\"\n }), \" event. Send the \", _jsx(_components.code, {\n children: \"toMs\"\n }), \" of that result with every later simulation of the\\nsame rule: as long as the rule’s type, flow or subflow type and grouping stay the same, the\\ndata is reused and the simulation answers in about a second, so thresholds, windows and\\npending periods can be tuned freely.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Validation errors return a regular JSON error before streaming starts. Only \", _jsx(_components.code, {\n children: \"relative_flow_count\"\n }), \",\\n\", _jsx(_components.code, {\n children: \"relative_subflow_count\"\n }), \" and \", _jsx(_components.code, {\n children: \"absolute_flow_count\"\n }), \" rules can be simulated.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Required API key permission: \", _jsx(_components.code, {\n children: \"observe:alerts:read\"\n }), \".\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Simulate alert rule","description":"Evaluates an alert rule config over the last seven days and reports how often it would have\nfired, per group and per hour. The rule does not need to be saved. Nothing is stored as an\nalert, and nobody is notified.\n\nWhat is simulated: the rule exactly as sent, evaluated every `stepMs` (as often as live\nevaluation runs) with the same evaluation live rules use: the value per group from the window\nand baseline, the conditions, the pending period (`for`), recovery, the no data policy,\n`minExpected`, evaluation hours and overrides. Each evaluation continues from the alerts the\nprevious one left, so an alert that fired stays firing until it recovers, as live.\n\nInput data: the flows or subflows the rule counts, as they are stored now, in one-minute\nbuckets. Each evaluation reads the window ending `dataDelayMs` before it, a fixed delay per\nrule type; delays from processing backlogs at that time are not known any more and are not\nsimulated. Flows classified late are included, so a simulation can see slightly more than the\nlive evaluation saw at the time.\n\nNot simulated: notifications. The contact point, its integrations and its delivery hours are\nnot taken into account; the result says when alerts would have fired, not who would have been\nnotified when.\n\nThe first simulation reads the data the rule needs, which can take a minute; the response\nstreams its progress as `application/x-ndjson` and ends with a `completed` event carrying the\nresult, or a `failed` event. Send the `toMs` of that result with every later simulation of the\nsame rule: as long as the rule's type, flow or subflow type and grouping stay the same, the\ndata is reused and the simulation answers in about a second, so thresholds, windows and\npending periods can be tuned freely.\n\nValidation errors return a regular JSON error before streaming starts. Only `relative_flow_count`,\n`relative_subflow_count` and `absolute_flow_count` rules can be simulated.\n\nRequired API key permission: `observe:alerts:read`.","deprecated":null,"version":null,"sidebarTitle":"Simulate alert rule","openapi":"/api-reference/openapi/observe.yaml post /observe/alertRules/simulate","href":"/api-reference/observe/simulate-alert-rule","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/corbado-43/07f8b5952369ac3b/content/matomo.js","/_mintlify/custom/corbado-43/3de72dcbd84a772a/content/linkedin-insight-tag.js","/_mintlify/custom/corbado-43/674dd5320b6b99a7/content/commonroom.js"],"openApiReferenceData":{"operation":{"x-mint":{"href":"/api-reference/observe/simulate-alert-rule"},"summary":"Simulate alert rule","description":"Evaluates an alert rule config over the last seven days and reports how often it would have\nfired, per group and per hour. The rule does not need to be saved. Nothing is stored as an\nalert, and nobody is notified.\n\nWhat is simulated: the rule exactly as sent, evaluated every `stepMs` (as often as live\nevaluation runs) with the same evaluation live rules use: the value per group from the window\nand baseline, the conditions, the pending period (`for`), recovery, the no data policy,\n`minExpected`, evaluation hours and overrides. Each evaluation continues from the alerts the\nprevious one left, so an alert that fired stays firing until it recovers, as live.\n\nInput data: the flows or subflows the rule counts, as they are stored now, in one-minute\nbuckets. Each evaluation reads the window ending `dataDelayMs` before it, a fixed delay per\nrule type; delays from processing backlogs at that time are not known any more and are not\nsimulated. Flows classified late are included, so a simulation can see slightly more than the\nlive evaluation saw at the time.\n\nNot simulated: notifications. The contact point, its integrations and its delivery hours are\nnot taken into account; the result says when alerts would have fired, not who would have been\nnotified when.\n\nThe first simulation reads the data the rule needs, which can take a minute; the response\nstreams its progress as `application/x-ndjson` and ends with a `completed` event carrying the\nresult, or a `failed` event. Send the `toMs` of that result with every later simulation of the\nsame rule: as long as the rule's type, flow or subflow type and grouping stay the same, the\ndata is reused and the simulation answers in about a second, so thresholds, windows and\npending periods can be tuned freely.\n\nValidation errors return a regular JSON error before streaming starts. Only `relative_flow_count`,\n`relative_subflow_count` and `absolute_flow_count` rules can be simulated.\n\nRequired API key permission: `observe:alerts:read`.","operationId":"ObserveAlertRuleSimulate","tags":["ObserveAlert"],"security":["69714e03-0d90-46e0-901f-be48d2ad23df"],"requestBody":"3a6963b7-4d6a-42df-970b-b08fb38b652a","responses":{"200":"aa07d6b4-1903-4583-93ab-4af961c619a8","default":"d4ca76e4-6756-46dc-98a4-b72e4e659c99"},"method":"post","type":"path","servers":["ba38b5eb-a889-4b2c-868f-ac4d5ecacc53"],"path":"/observe/alertRules/simulate","baseUrlOptions":["https://api.cloud.corbado.io/v1"],"title":"Simulate alert rule","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ruleType","rule"],"properties":{"ruleType":{"type":"string","enum":["login_success_rate","relative_flow_count","relative_subflow_count","absolute_flow_count"],"description":"Type of the rule to simulate.","x-oapi-codegen-extra-tags":{"validate":"required,oneof=login_success_rate relative_flow_count relative_subflow_count absolute_flow_count"},"isRequired":true,"uniqueKey":"ruleType","typeLabel":"enum\u003cstring>"},"rule":{"type":"object","description":"The configuration of an alert rule: the generic envelope every rule type shares, plus one settings object belonging to the rule type named by type. Everything outside settings is implemented once, generically - the window is resolved and handed to the rule type as two absolute timestamps, and the conditions are applied to whatever number the rule type returned, so a rule type never sees the thresholds.\nShape and vocabulary are validated here. The semantics that span fields - that the bands get stricter as the level does, that recovery sits on the lenient side of them, that the window is a whole number of days, and that groupBy names dimensions this project actually has - are validated when the rule is saved and again when it is evaluated, because only the second catches a project that changed after the rule was written.\n","required":["version","type","window","conditions"],"properties":{"version":{"type":"integer","minimum":1,"maximum":1,"description":"Config schema version. Only 1 exists; a stored rule carries it so a later shape change can be migrated rather than guessed at.","x-oapi-codegen-extra-tags":{"validate":"required,oneof=1"},"isRequired":true,"uniqueKey":"rule.version","typeLabel":"integer"},"type":{"type":"string","enum":["login_success_rate","relative_flow_count","relative_subflow_count","absolute_flow_count"],"description":"The rule type this config belongs to. Must equal the rule's ruleType - the two are stored separately and the evaluator reads the column to pick the implementation, so letting them disagree would store a rule whose settings belong to one type and whose evaluation belongs to another.\n","x-oapi-codegen-extra-tags":{"validate":"required,oneof=login_success_rate relative_flow_count relative_subflow_count absolute_flow_count"},"isRequired":true,"uniqueKey":"rule.type","typeLabel":"enum\u003cstring>"},"window":{"type":"string","description":"How much history the value covers - \"5m\", \"1h\", \"3d\". Go duration syntax extended with \"d\" and \"w\". A rule type that reads pre-aggregated buckets needs a whole number of them: login_success_rate reads an hourly series, so its window must be whole hours; relative_flow_count, relative_subflow_count and absolute_flow_count take one of their offered windows (1m to 1h) and slide with the evaluation instant. The window ends a type-specific delay behind the evaluation instant, so the data it covers has arrived; that delay is not configurable.\n","x-oapi-codegen-extra-tags":{"validate":"required"},"isRequired":true,"uniqueKey":"rule.window","typeLabel":"string"},"conditions":{"type":"array","minItems":1,"maxItems":3,"description":"The severity bands, most severe matching band wins. All conditions must compare in the same direction, each level may appear at most once, and a more severe band must breach later than a less severe one. An equality band stands alone. There is no rule-level severity; each condition carries its own level.\n","items":{"type":"object","description":"One severity band - a comparison against a threshold that yields a level.","required":["severity","operator","threshold"],"properties":{"severity":{"type":"string","enum":["info","warning","critical"],"description":"The severity this band produces. It belongs to the condition rather than to the rule, so an alert may fire at warning and escalate to critical without changing identity.","x-oapi-codegen-extra-tags":{"validate":"required,oneof=info warning critical"},"isRequired":true,"uniqueKey":"rule.conditions.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"operator":{"type":"string","enum":["above","above_or_equal","below","below_or_equal","equal","not_equal"],"description":"How the rule's value is compared against threshold.","x-oapi-codegen-extra-tags":{"validate":"required,oneof=above above_or_equal below below_or_equal equal not_equal"},"isRequired":true,"uniqueKey":"rule.conditions.items.[INDEX].operator","typeLabel":"enum\u003cstring>"},"threshold":{"type":"number","format":"double","description":"The value the band compares against. Zero is a meaningful threshold, so this field carries no required-value validation of its own.","isRequired":true,"uniqueKey":"rule.conditions.items.[INDEX].threshold","typeLabel":"number\u003cdouble>"}},"uniqueKey":"rule.conditions.items.[INDEX]","typeLabel":"object"},"x-oapi-codegen-extra-tags":{"validate":"required,min=1,max=3,dive"},"isRequired":true,"uniqueKey":"rule.conditions","typeLabel":"object[]"},"groupBy":{"type":"array","maxItems":10,"description":"Dimension keys to alert separately by: one alert instance per combination of values, each with its own state and its own for clock. Keys are dimension names as reported by the rule type for this project, never columns or tag slots - a project that reorders its tags must not silently regroup a rule onto whatever now sits in that position. Empty means one ungrouped instance.\n","items":{"type":"string","uniqueKey":"rule.groupBy.items.[INDEX]","typeLabel":"string"},"x-oapi-codegen-extra-tags":{"validate":"omitempty,unique,dive,required"},"uniqueKey":"rule.groupBy","typeLabel":"string[]"},"filters":{"type":"array","maxItems":50,"description":"Label sets to count exclusively: data is read only where its dimension values equal one of the entries, every pair of it. Each entry names every groupBy dimension, no more and no fewer - the same shape as an override's match - so one entry allows exactly one alert. Alerts outside the entries are never created; empty or absent means no filtering. Requires a groupBy, and two identical entries are rejected. Only relative_flow_count, relative_subflow_count and absolute_flow_count rules support filters so far.\n","items":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"rule.filters.items.[INDEX].additionalProperties","typeLabel":"string"},"uniqueKey":"rule.filters.items.[INDEX]","typeLabel":"object"},"uniqueKey":"rule.filters","typeLabel":"object[]"},"maxInstances":{"type":"integer","minimum":1,"maximum":500,"description":"Cardinality cap for a grouped rule. Exceeding it is an error rather than a truncation, so a rule cannot quietly stop covering part of its groups. Defaults to 50.","x-oapi-codegen-extra-tags":{"validate":"omitempty,min=1,max=500"},"uniqueKey":"rule.maxInstances","typeLabel":"integer"},"settings":{"type":"object","additionalProperties":true,"description":"Settings belonging to type, opaque to the envelope. For login_success_rate this is observeAlertRuleSettingsLoginSuccessRate, for relative_flow_count observeAlertRuleSettingsRelativeFlowCount, for relative_subflow_count observeAlertRuleSettingsRelativeSubflowCount, for absolute_flow_count observeAlertRuleSettingsAbsoluteFlowCount. This field stays open rather than a union, so a rule type can be added without a breaking change to this schema.\n","uniqueKey":"rule.settings","typeLabel":"object"},"recovery":{"type":"object","description":"An optional separate threshold a firing instance must clear before it resolves. Without one a rule can fire and resolve at the same value, which is the flapping this exists to prevent, so it must compare in the opposite direction to the conditions and sit on the lenient side of the least severe band.\n","required":["operator","threshold"],"properties":{"operator":{"type":"string","enum":["above","above_or_equal","below","below_or_equal","equal","not_equal"],"x-oapi-codegen-extra-tags":{"validate":"required,oneof=above above_or_equal below below_or_equal equal not_equal"},"isRequired":true,"uniqueKey":"rule.recovery.operator","typeLabel":"enum\u003cstring>"},"threshold":{"type":"number","format":"double","isRequired":true,"uniqueKey":"rule.recovery.threshold","typeLabel":"number\u003cdouble>"}},"uniqueKey":"rule.recovery","typeLabel":"object"},"for":{"type":"string","description":"How long a group must stay breached before it fires, measured per instance from its own first breach - e.g. \"1d\". Omit to fire on the first breaching evaluation.\n","uniqueKey":"rule.for","typeLabel":"string"},"noData":{"type":"string","enum":["ok","no_data","alerting","keep_last"],"description":"What an instance does when its group produces no value. Defaults to no_data, which is visible in the panel and sends nothing - where keep_last would hold a firing alert firing forever and ok would quietly resolve one.\n","x-oapi-codegen-extra-tags":{"validate":"omitempty,oneof=ok no_data alerting keep_last"},"uniqueKey":"rule.noData","typeLabel":"enum\u003cstring>"},"evaluationHours":{"type":"object","description":"A weekly schedule, used in two places. It is read in the project's timezone, looked up each time the schedule is checked, so changing the project's timezone moves the schedule along. Only an override's evaluationHours may set a timezone of their own.\nAs a contact point's deliveryHours it is when the contact point's integrations may deliver. A notification that falls outside these hours is not sent, and not sent later either; the alert's state is recorded all the same. Omit on create to deliver at any time, omit on update to keep the current hours.\nAs a rule's evaluationHours it is when the rule's alerts are evaluated at all. Outside these hours an alert gets no value, with noDataReason outside_evaluation_hours, and the no-data policy does not apply: a firing alert stays firing, a pending alert returns to normal so its for period starts again, and nothing is notified. Set on an override, it replaces the rule's hours for that alert and may set a timezone, e.g. Australia/Sydney for an alert on Australia; mode always evaluates that alert at any time. Omit to evaluate at any time (on an override: to inherit the rule's hours).\n","required":["mode"],"properties":{"mode":{"type":"string","enum":["always","scheduled"],"x-enum-varnames":["ObserveAlertHoursModeAlways","ObserveAlertHoursModeScheduled"],"x-oapi-codegen-extra-tags":{"validate":"required,oneof=always scheduled"},"description":"always is open at any time and takes no timezone or ranges; scheduled is open only inside ranges.","isRequired":true,"uniqueKey":"rule.evaluationHours.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone the ranges are read in, e.g. Australia/Sydney. Only on an override's evaluationHours, and optional there; omit it to use the project's timezone. Delivery hours and a rule's own evaluationHours always use the project's timezone and reject this field.\n","x-oapi-codegen-extra-tags":{"validate":"omitempty,max=64"},"uniqueKey":"rule.evaluationHours.timezone","typeLabel":"string"},"ranges":{"type":"array","maxItems":10,"description":"Required when mode is scheduled.","items":{"type":"object","description":"One block of time within a day, on some weekdays. start is before end; end is exclusive and may be 24:00, so a whole day is 00:00-24:00. Times are on a 15-minute step.\n","required":["weekdays","start","end"],"properties":{"weekdays":{"type":"array","minItems":1,"maxItems":7,"items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"x-enum-varnames":["ObserveAlertHoursRangeWeekdaysMon","ObserveAlertHoursRangeWeekdaysTue","ObserveAlertHoursRangeWeekdaysWed","ObserveAlertHoursRangeWeekdaysThu","ObserveAlertHoursRangeWeekdaysFri","ObserveAlertHoursRangeWeekdaysSat","ObserveAlertHoursRangeWeekdaysSun"],"uniqueKey":"rule.evaluationHours.ranges.items.[INDEX].weekdays.items.[INDEX]","typeLabel":"enum\u003cstring>"},"x-oapi-codegen-extra-tags":{"validate":"required,min=1,max=7,dive,oneof=mon tue wed thu fri sat sun"},"isRequired":true,"uniqueKey":"rule.evaluationHours.ranges.items.[INDEX].weekdays","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Start time, HH:MM.","example":"09:00","x-oapi-codegen-extra-tags":{"validate":"required,min=5,max=5"},"isRequired":true,"uniqueKey":"rule.evaluationHours.ranges.items.[INDEX].start","typeLabel":"string"},"end":{"type":"string","description":"End time, HH:MM, exclusive. 24:00 runs to the end of the day.","example":"18:00","x-oapi-codegen-extra-tags":{"validate":"required,min=5,max=5"},"isRequired":true,"uniqueKey":"rule.evaluationHours.ranges.items.[INDEX].end","typeLabel":"string"}},"uniqueKey":"rule.evaluationHours.ranges.items.[INDEX]","typeLabel":"object"},"x-oapi-codegen-extra-tags":{"validate":"omitempty,max=10,dive"},"uniqueKey":"rule.evaluationHours.ranges","typeLabel":"object[]"}},"uniqueKey":"rule.evaluationHours","typeLabel":"object"},"overrides":{"type":"array","description":"Exceptions to the rule for particular alerts. An override's match is a complete label set - one value for every groupBy key - and it applies to exactly the alert with that label set. The alert is judged by the override's values instead of the rule's, field by field: a field the override sets replaces the rule's wholesale, a field it leaves out is inherited. Editing overrides never touches an alert's identity or history - the new values simply apply at the next evaluation. Requires groupBy; no cap on the count.\n","items":{"type":"object","description":"One exception to a rule: an alert's label set and a sparse patch of the per-alert fields. Only fields the evaluator and the rule type apply per alert can be set here - what shapes the read (window, groupBy, maxInstances) is one value per rule.\n","required":["match"],"properties":{"match":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"rule.overrides.items.[INDEX].match.additionalProperties","typeLabel":"string"},"description":"The alert's label set: one exact value for every one of the rule's groupBy keys, no more and no fewer. An override applies to exactly the alert carrying this label set. Two overrides with the same match are rejected.\n","isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].match","typeLabel":"object"},"conditions":{"type":"array","minItems":1,"maxItems":3,"description":"The complete band set for matching alerts, validated by the same rules as the rule's own conditions and against the recovery threshold that applies (this override's, or the rule's when inherited). Omit to inherit the rule's bands.\n","items":{"type":"object","description":"One severity band - a comparison against a threshold that yields a level.","required":["severity","operator","threshold"],"properties":{"severity":{"type":"string","enum":["info","warning","critical"],"description":"The severity this band produces. It belongs to the condition rather than to the rule, so an alert may fire at warning and escalate to critical without changing identity.","x-oapi-codegen-extra-tags":{"validate":"required,oneof=info warning critical"},"isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].conditions.items.[INDEX].severity","typeLabel":"enum\u003cstring>"},"operator":{"type":"string","enum":["above","above_or_equal","below","below_or_equal","equal","not_equal"],"description":"How the rule's value is compared against threshold.","x-oapi-codegen-extra-tags":{"validate":"required,oneof=above above_or_equal below below_or_equal equal not_equal"},"isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].conditions.items.[INDEX].operator","typeLabel":"enum\u003cstring>"},"threshold":{"type":"number","format":"double","description":"The value the band compares against. Zero is a meaningful threshold, so this field carries no required-value validation of its own.","isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].conditions.items.[INDEX].threshold","typeLabel":"number\u003cdouble>"}},"uniqueKey":"rule.overrides.items.[INDEX].conditions.items.[INDEX]","typeLabel":"object"},"x-oapi-codegen-extra-tags":{"validate":"omitempty,min=1,max=3,dive"},"uniqueKey":"rule.overrides.items.[INDEX].conditions","typeLabel":"object[]"},"recovery":{"type":"object","description":"An optional separate threshold a firing instance must clear before it resolves. Without one a rule can fire and resolve at the same value, which is the flapping this exists to prevent, so it must compare in the opposite direction to the conditions and sit on the lenient side of the least severe band.\n","required":["operator","threshold"],"properties":{"operator":{"type":"string","enum":["above","above_or_equal","below","below_or_equal","equal","not_equal"],"x-oapi-codegen-extra-tags":{"validate":"required,oneof=above above_or_equal below below_or_equal equal not_equal"},"isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].recovery.operator","typeLabel":"enum\u003cstring>"},"threshold":{"type":"number","format":"double","isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].recovery.threshold","typeLabel":"number\u003cdouble>"}},"uniqueKey":"rule.overrides.items.[INDEX].recovery","typeLabel":"object"},"for":{"type":"string","description":"Pending period for matching alerts, e.g. \"3h\". \"0s\" is a value - fire on the first breaching evaluation - and omitting it inherits the rule's.","uniqueKey":"rule.overrides.items.[INDEX].for","typeLabel":"string"},"noData":{"type":"string","enum":["ok","no_data","alerting","keep_last"],"description":"No-data policy for matching alerts. Omit to inherit the rule's.","x-oapi-codegen-extra-tags":{"validate":"omitempty,oneof=ok no_data alerting keep_last"},"uniqueKey":"rule.overrides.items.[INDEX].noData","typeLabel":"enum\u003cstring>"},"settings":{"type":"object","additionalProperties":true,"description":"The complete settings object of the rule type for matching alerts - for login_success_rate, observeAlertRuleSettingsLoginSuccessRate. Replaces the rule's settings wholesale rather than merging into them. Omit to inherit the rule's. For relative_flow_count and relative_subflow_count an override may only set minExpected, and an absolute_flow_count override sets no settings at all; the other settings shape the one read a rule makes.\n","uniqueKey":"rule.overrides.items.[INDEX].settings","typeLabel":"object"},"evaluationHours":{"type":"object","description":"A weekly schedule, used in two places. It is read in the project's timezone, looked up each time the schedule is checked, so changing the project's timezone moves the schedule along. Only an override's evaluationHours may set a timezone of their own.\nAs a contact point's deliveryHours it is when the contact point's integrations may deliver. A notification that falls outside these hours is not sent, and not sent later either; the alert's state is recorded all the same. Omit on create to deliver at any time, omit on update to keep the current hours.\nAs a rule's evaluationHours it is when the rule's alerts are evaluated at all. Outside these hours an alert gets no value, with noDataReason outside_evaluation_hours, and the no-data policy does not apply: a firing alert stays firing, a pending alert returns to normal so its for period starts again, and nothing is notified. Set on an override, it replaces the rule's hours for that alert and may set a timezone, e.g. Australia/Sydney for an alert on Australia; mode always evaluates that alert at any time. Omit to evaluate at any time (on an override: to inherit the rule's hours).\n","required":["mode"],"properties":{"mode":{"type":"string","enum":["always","scheduled"],"x-enum-varnames":["ObserveAlertHoursModeAlways","ObserveAlertHoursModeScheduled"],"x-oapi-codegen-extra-tags":{"validate":"required,oneof=always scheduled"},"description":"always is open at any time and takes no timezone or ranges; scheduled is open only inside ranges.","isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone the ranges are read in, e.g. Australia/Sydney. Only on an override's evaluationHours, and optional there; omit it to use the project's timezone. Delivery hours and a rule's own evaluationHours always use the project's timezone and reject this field.\n","x-oapi-codegen-extra-tags":{"validate":"omitempty,max=64"},"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.timezone","typeLabel":"string"},"ranges":{"type":"array","maxItems":10,"description":"Required when mode is scheduled.","items":{"type":"object","description":"One block of time within a day, on some weekdays. start is before end; end is exclusive and may be 24:00, so a whole day is 00:00-24:00. Times are on a 15-minute step.\n","required":["weekdays","start","end"],"properties":{"weekdays":{"type":"array","minItems":1,"maxItems":7,"items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"x-enum-varnames":["ObserveAlertHoursRangeWeekdaysMon","ObserveAlertHoursRangeWeekdaysTue","ObserveAlertHoursRangeWeekdaysWed","ObserveAlertHoursRangeWeekdaysThu","ObserveAlertHoursRangeWeekdaysFri","ObserveAlertHoursRangeWeekdaysSat","ObserveAlertHoursRangeWeekdaysSun"],"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.ranges.items.[INDEX].weekdays.items.[INDEX]","typeLabel":"enum\u003cstring>"},"x-oapi-codegen-extra-tags":{"validate":"required,min=1,max=7,dive,oneof=mon tue wed thu fri sat sun"},"isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.ranges.items.[INDEX].weekdays","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Start time, HH:MM.","example":"09:00","x-oapi-codegen-extra-tags":{"validate":"required,min=5,max=5"},"isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.ranges.items.[INDEX].start","typeLabel":"string"},"end":{"type":"string","description":"End time, HH:MM, exclusive. 24:00 runs to the end of the day.","example":"18:00","x-oapi-codegen-extra-tags":{"validate":"required,min=5,max=5"},"isRequired":true,"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.ranges.items.[INDEX].end","typeLabel":"string"}},"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.ranges.items.[INDEX]","typeLabel":"object"},"x-oapi-codegen-extra-tags":{"validate":"omitempty,max=10,dive"},"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours.ranges","typeLabel":"object[]"}},"uniqueKey":"rule.overrides.items.[INDEX].evaluationHours","typeLabel":"object"}},"uniqueKey":"rule.overrides.items.[INDEX]","typeLabel":"object"},"x-oapi-codegen-extra-tags":{"validate":"omitempty,dive"},"uniqueKey":"rule.overrides","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"rule","typeLabel":"object"},"toMs":{"type":"integer","format":"int64","description":"End of the simulated range in milliseconds since epoch, from the `toMs` of an earlier\nsimulation of the same rule. Omit it to simulate the seven days up to now. It must have\nended within the last 24 hours.","uniqueKey":"toMs","typeLabel":"integer\u003cint64>"},"focus":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"focus.additionalProperties","typeLabel":"string"},"description":"Labels of one group, e.g. `{\"country\": \"DE\"}`, whose every step the result carries for a\ndetailed chart. An ungrouped rule's only group has no labels: send `{}`.","uniqueKey":"focus","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"rule":{"version":1,"window":"\u003cstring>","conditions":[{"threshold":123}],"groupBy":["\u003cstring>"],"filters":[{}],"maxInstances":250,"settings":{},"for":"\u003cstring>","overrides":[{"match":{},"conditions":[{"threshold":123}],"for":"\u003cstring>","settings":{}}]},"toMs":123,"focus":{}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"aa07d6b4-1903-4583-93ab-4af961c619a8":{"description":"Newline-delimited JSON progress stream; the final line carries the simulation result.","content":{"application/x-ndjson":{"schema":{"type":"object","description":"One line of a simulation's progress stream.","required":["type"],"properties":{"type":{"type":"string","enum":["started","progress","completed","failed"],"description":"`started` comes first, `progress` after every chunk of data read (repeated while a chunk\ntakes long), and either `completed` with the result or `failed` last.","isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"chunksDone":{"type":"integer","description":"Chunks of data read so far (progress events).","uniqueKey":"chunksDone","typeLabel":"integer"},"chunksTotal":{"type":"integer","description":"Chunks of data to read in total (progress events).","uniqueKey":"chunksTotal","typeLabel":"integer"},"simulation":{"type":"object","required":["cached","fromMs","toMs","stepMs","dataDelayMs","fired","firedBySeverity","maxGroups","failedSteps","groups"],"properties":{"cached":{"type":"boolean","description":"Whether the data came from an earlier simulation instead of a new read.","isRequired":true,"uniqueKey":"simulation.cached","typeLabel":"boolean"},"fromMs":{"type":"integer","format":"int64","description":"Start of the simulated range, in milliseconds since epoch.","isRequired":true,"uniqueKey":"simulation.fromMs","typeLabel":"integer\u003cint64>"},"toMs":{"type":"integer","format":"int64","description":"End of the simulated range, in milliseconds since epoch. Send it as `toMs` with the next simulation of this rule.","isRequired":true,"uniqueKey":"simulation.toMs","typeLabel":"integer\u003cint64>"},"stepMs":{"type":"integer","format":"int64","description":"How often the rule is evaluated, as live.","isRequired":true,"uniqueKey":"simulation.stepMs","typeLabel":"integer\u003cint64>"},"dataDelayMs":{"type":"integer","format":"int64","description":"How far behind each evaluation its window ends.","isRequired":true,"uniqueKey":"simulation.dataDelayMs","typeLabel":"integer\u003cint64>"},"fired":{"type":"integer","description":"How many times an alert fired: it started firing, or escalated to a severity above any\nbefore in its episode. These are the two events live evaluation notifies about.","isRequired":true,"uniqueKey":"simulation.fired","typeLabel":"integer"},"firedBySeverity":{"type":"object","description":"How many times an alert fired, per severity it fired with.","required":["info","warning","critical"],"properties":{"info":{"type":"integer","isRequired":true,"uniqueKey":"simulation.firedBySeverity.info","typeLabel":"integer"},"warning":{"type":"integer","isRequired":true,"uniqueKey":"simulation.firedBySeverity.warning","typeLabel":"integer"},"critical":{"type":"integer","isRequired":true,"uniqueKey":"simulation.firedBySeverity.critical","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"simulation.firedBySeverity","typeLabel":"object"},"maxGroups":{"type":"integer","description":"The most groups a single evaluation produced, to compare with the rule's maxInstances.","isRequired":true,"uniqueKey":"simulation.maxGroups","typeLabel":"integer"},"failedSteps":{"type":"integer","description":"Evaluations that failed as a whole, because the rule produced more groups than its maxInstances.","isRequired":true,"uniqueKey":"simulation.failedSteps","typeLabel":"integer"},"groups":{"type":"array","description":"Every group the rule evaluated, most alerts first.","items":{"type":"object","required":["labels","fired","firedBySeverity","firingSteps","pendingSteps","noDataSteps","firedPerHour","firedPerHourBySeverity"],"properties":{"labels":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"simulation.groups.items.[INDEX].labels.additionalProperties","typeLabel":"string"},"description":"The group's labels; empty for an ungrouped rule.","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].labels","typeLabel":"object"},"fired":{"type":"integer","description":"How many times the group's alert fired, as `fired` of the simulation.","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].fired","typeLabel":"integer"},"firedBySeverity":{"type":"object","description":"How many times an alert fired, per severity it fired with.","required":["info","warning","critical"],"properties":{"info":{"type":"integer","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedBySeverity.info","typeLabel":"integer"},"warning":{"type":"integer","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedBySeverity.warning","typeLabel":"integer"},"critical":{"type":"integer","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedBySeverity.critical","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedBySeverity","typeLabel":"object"},"firingSteps":{"type":"integer","description":"Evaluations the alert was firing.","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firingSteps","typeLabel":"integer"},"pendingSteps":{"type":"integer","description":"Evaluations the alert was pending.","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].pendingSteps","typeLabel":"integer"},"noDataSteps":{"type":"integer","description":"Evaluations the alert had no data, including too few expected to judge.","isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].noDataSteps","typeLabel":"integer"},"firedPerHour":{"type":"array","description":"How many times the alert fired per hour of the simulated range, oldest hour first.","items":{"type":"integer","uniqueKey":"simulation.groups.items.[INDEX].firedPerHour.items.[INDEX]","typeLabel":"integer"},"isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedPerHour","typeLabel":"integer[]"},"firedPerHourBySeverity":{"type":"object","description":"How many times the alert fired per hour of the simulated range and severity, oldest hour first.","required":["info","warning","critical"],"properties":{"info":{"type":"array","items":{"type":"integer","uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity.info.items.[INDEX]","typeLabel":"integer"},"isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity.info","typeLabel":"integer[]"},"warning":{"type":"array","items":{"type":"integer","uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity.warning.items.[INDEX]","typeLabel":"integer"},"isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity.warning","typeLabel":"integer[]"},"critical":{"type":"array","items":{"type":"integer","uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity.critical.items.[INDEX]","typeLabel":"integer"},"isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity.critical","typeLabel":"integer[]"}},"isRequired":true,"uniqueKey":"simulation.groups.items.[INDEX].firedPerHourBySeverity","typeLabel":"object"},"lowestValue":{"type":"number","format":"double","description":"The lowest value the group had.","uniqueKey":"simulation.groups.items.[INDEX].lowestValue","typeLabel":"number\u003cdouble>"},"lowestValueAtMs":{"type":"integer","format":"int64","description":"When the group had its lowest value.","uniqueKey":"simulation.groups.items.[INDEX].lowestValueAtMs","typeLabel":"integer\u003cint64>"}},"uniqueKey":"simulation.groups.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"simulation.groups","typeLabel":"object[]"},"error":{"type":"object","description":"The first evaluation that failed as a whole.","required":["atMs","reason","message"],"properties":{"atMs":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"simulation.error.atMs","typeLabel":"integer\u003cint64>"},"reason":{"type":"string","isRequired":true,"uniqueKey":"simulation.error.reason","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"simulation.error.message","typeLabel":"string"}},"uniqueKey":"simulation.error","typeLabel":"object"},"focus":{"type":"object","description":"Every evaluation of the requested group, as parallel arrays with one entry per step from\n`fromMs` on, and the group's status changes.","required":["labels","values","details","statuses","noDataReasons","transitions"],"properties":{"labels":{"type":"object","additionalProperties":{"type":"string","uniqueKey":"simulation.focus.labels.additionalProperties","typeLabel":"string"},"isRequired":true,"uniqueKey":"simulation.focus.labels","typeLabel":"object"},"values":{"type":"array","description":"The value per step; null where there was none.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.values.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.values.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.values.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.values","typeLabel":"(number\u003cdouble> | null)[]"},"details":{"oneOf":[{"type":"object","description":"What the rule computed per step, as parallel arrays with one entry per step like `values`: the same\nnumbers an evaluation's `details` carry, in the shape of the rule's type named in `type`. An entry is\nnull where nothing was computed, e.g. outside the evaluation hours.","required":["type","windowCounts","baselineCounts","expectedCounts"],"properties":{"type":{"type":"string","enum":["relative_flow_count"],"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.0.type","typeLabel":"enum\u003cstring>"},"windowCounts":{"type":"array","description":"Flows in each step's window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.0.windowCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.0.windowCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.0.windowCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.0.windowCounts","typeLabel":"(number\u003cdouble> | null)[]"},"baselineCounts":{"type":"array","description":"Flows in each step's baseline window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.0.baselineCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.0.baselineCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.0.baselineCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.0.baselineCounts","typeLabel":"(number\u003cdouble> | null)[]"},"expectedCounts":{"type":"array","description":"Flows each step's baseline leads to expect in one window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.0.expectedCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.0.expectedCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.0.expectedCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.0.expectedCounts","typeLabel":"(number\u003cdouble> | null)[]"}},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.0","typeLabel":"object"},{"type":"object","description":"What the rule computed per step, as parallel arrays with one entry per step like `values`: the same\nnumbers an evaluation's `details` carry, in the shape of the rule's type named in `type`. An entry is\nnull where nothing was computed, e.g. outside the evaluation hours.","required":["type","windowCounts","baselineCounts","expectedCounts"],"properties":{"type":{"type":"string","enum":["relative_subflow_count"],"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.1.type","typeLabel":"enum\u003cstring>"},"windowCounts":{"type":"array","description":"Subflows in each step's window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.1.windowCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.1.windowCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.1.windowCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.1.windowCounts","typeLabel":"(number\u003cdouble> | null)[]"},"baselineCounts":{"type":"array","description":"Subflows in each step's baseline window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.1.baselineCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.1.baselineCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.1.baselineCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.1.baselineCounts","typeLabel":"(number\u003cdouble> | null)[]"},"expectedCounts":{"type":"array","description":"Subflows each step's baseline leads to expect in one window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.1.expectedCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.1.expectedCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.1.expectedCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.1.expectedCounts","typeLabel":"(number\u003cdouble> | null)[]"}},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.1","typeLabel":"object"},{"type":"object","description":"What the rule computed per step, as parallel arrays with one entry per step like `values`: the same\nnumbers an evaluation's `details` carry, in the shape of the rule's type named in `type`. An entry is\nnull where nothing was computed, e.g. outside the evaluation hours.","required":["type","windowCounts"],"properties":{"type":{"type":"string","enum":["absolute_flow_count"],"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.2.type","typeLabel":"enum\u003cstring>"},"windowCounts":{"type":"array","description":"Flows in each step's window.","items":{"oneOf":[{"type":"number","format":"double","uniqueKey":"simulation.focus.details.oneOf.2.windowCounts.items.[INDEX].oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","uniqueKey":"simulation.focus.details.oneOf.2.windowCounts.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.details.oneOf.2.windowCounts.items.[INDEX]","typeLabel":"number\u003cdouble> | null"},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.2.windowCounts","typeLabel":"(number\u003cdouble> | null)[]"}},"isRequired":true,"uniqueKey":"simulation.focus.details.oneOf.2","typeLabel":"object"}],"isRequired":true,"uniqueKey":"simulation.focus.details","typeLabel":"object"},"statuses":{"type":"array","description":"The status per step (normal, pending, firing, no_data or error); null before the group first appeared.","items":{"oneOf":[{"type":"string","uniqueKey":"simulation.focus.statuses.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"simulation.focus.statuses.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.statuses.items.[INDEX]","typeLabel":"string | null"},"isRequired":true,"uniqueKey":"simulation.focus.statuses","typeLabel":"(string | null)[]"},"noDataReasons":{"type":"array","description":"Why a step had no value; null where it had one.","items":{"oneOf":[{"type":"string","uniqueKey":"simulation.focus.noDataReasons.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"simulation.focus.noDataReasons.items.[INDEX].oneOf.1","typeLabel":"null"}],"uniqueKey":"simulation.focus.noDataReasons.items.[INDEX]","typeLabel":"string | null"},"isRequired":true,"uniqueKey":"simulation.focus.noDataReasons","typeLabel":"(string | null)[]"},"transitions":{"type":"array","items":{"type":"object","required":["atMs","toStatus","reason"],"properties":{"atMs":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"simulation.focus.transitions.items.[INDEX].atMs","typeLabel":"integer\u003cint64>"},"toStatus":{"type":"string","enum":["normal","pending","firing","no_data","error"],"isRequired":true,"uniqueKey":"simulation.focus.transitions.items.[INDEX].toStatus","typeLabel":"enum\u003cstring>"},"reason":{"type":"string","isRequired":true,"uniqueKey":"simulation.focus.transitions.items.[INDEX].reason","typeLabel":"string"},"fromStatus":{"type":"string","enum":["normal","pending","firing","no_data","error"],"uniqueKey":"simulation.focus.transitions.items.[INDEX].fromStatus","typeLabel":"enum\u003cstring>"},"fromSeverity":{"type":"string","enum":["info","warning","critical"],"uniqueKey":"simulation.focus.transitions.items.[INDEX].fromSeverity","typeLabel":"enum\u003cstring>"},"toSeverity":{"type":"string","enum":["info","warning","critical"],"uniqueKey":"simulation.focus.transitions.items.[INDEX].toSeverity","typeLabel":"enum\u003cstring>"},"value":{"type":"number","format":"double","uniqueKey":"simulation.focus.transitions.items.[INDEX].value","typeLabel":"number\u003cdouble>"}},"uniqueKey":"simulation.focus.transitions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"simulation.focus.transitions","typeLabel":"object[]"}},"uniqueKey":"simulation.focus","typeLabel":"object"}},"uniqueKey":"simulation","typeLabel":"object"},"message":{"type":"string","description":"Why the simulation failed (failed events).","uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"type":"started","chunksDone":123,"chunksTotal":123,"simulation":{"cached":true,"fromMs":123,"toMs":123,"stepMs":123,"dataDelayMs":123,"fired":123,"firedBySeverity":{"info":123,"warning":123,"critical":123},"maxGroups":123,"failedSteps":123,"groups":[{"labels":{},"fired":123,"firedBySeverity":{"info":123,"warning":123,"critical":123},"firingSteps":123,"pendingSteps":123,"noDataSteps":123,"firedPerHour":[123],"firedPerHourBySeverity":{"info":[123],"warning":[123],"critical":[123]},"lowestValue":123,"lowestValueAtMs":123}],"error":{"atMs":123,"reason":"\u003cstring>","message":"\u003cstring>"},"focus":{"labels":{},"values":[123],"details":{"type":"relative_flow_count","windowCounts":[123],"baselineCounts":[123],"expectedCounts":[123]},"statuses":["\u003cstring>"],"noDataReasons":["\u003cstring>"],"transitions":[{"atMs":123,"toStatus":"normal","reason":"\u003cstring>","fromStatus":"normal","fromSeverity":"info","toSeverity":"info","value":123}]}},"message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"d4ca76e4-6756-46dc-98a4-b72e4e659c99":{"description":"Error","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["message"],"properties":{"message":{"description":"Error message","type":"string","example":"Validation failed","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"details":{"description":"Validation error details per field","type":"array","items":{"type":"object","required":["field","message"],"properties":{"field":{"description":"Field name that failed validation","type":"string","example":"projectID","isRequired":true,"uniqueKey":"error.details.items.[INDEX].field","typeLabel":"string"},"message":{"description":"Validation error message","type":"string","example":"required","isRequired":true,"uniqueKey":"error.details.items.[INDEX].message","typeLabel":"string"}},"uniqueKey":"error.details.items.[INDEX]","typeLabel":"object"},"uniqueKey":"error.details","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"message":"Validation failed","details":[{"field":"projectID","message":"required"}]}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"69714e03-0d90-46e0-901f-be48d2ad23df":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.","scopes":["observe:alerts:read"],"schemeName":"bearerAuth"}}},"servers":{"ba38b5eb-a889-4b2c-868f-ac4d5ecacc53":{"url":"https://api.cloud.corbado.io/v1"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.","scopes":["observe:alerts:read"],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Use an Observe API key from the management console. The key selects the project and must grant the permission listed on the operation. Keep this key on your server.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi/observe.yaml"},"subdomain":"corbado-43","siteName":"Corbado docs","title":"Simulate alert rule - Corbado docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T15:41:22.681Z","originalFileLocation":"api-reference/observe/simulate-alert-rule.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Evaluates an alert rule config over the last seven days and reports how often it would have fired, per group and per hour. The rule does not need to be saved. Nothing is stored as an alert, and nobody is notified. What is simulated: the rule exactly as sent, evaluated every stepMs (as often as live evaluation runs) with the same evaluation live rules use: the value per group from the window and baseline, the conditions, the pending period (for), recovery, the no data policy, minExpected, evaluation hours and overrides. Each evaluation continues from the alerts the previous one left, so an alert that fired stays firing until it recovers, as live. Input data: the flows or subflows the rule counts, as they are stored now, in one-minute buckets. Each evaluation reads the window ending dataDelayMs before it, a fixed delay per rule type; delays from processing backlogs at that time are not known any more and are not simulated. Flows classified late are included, so a simulation can see slightly more than the live evaluation saw at the time. Not simulated: notifications. The contact point, its integrations and its delivery hours are not taken into account; the result says when alerts would have fired, not who would have been notified when. The first simulation reads the data the rule needs, which can take a minute; the response streams its progress as application/x-ndjson and ends with a completed event carrying the result, or a failed event. Send the toMs of that result with every later simulation of the same rule: as long as the rule\u0026#x27;s type, flow or subflow type and grouping stay the same, the data is reused and the simulation answers in about a second, so thresholds, windows and pending periods can be tuned freely. Validation errors return a regular JSON error before streaming starts. Only relative_flow_count, relative_subflow_count and absolute_flow_count rules can be simulated. Required API key permission: observe:alerts:read.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Corbado docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Simulate alert rule - Corbado docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Evaluates an alert rule config over the last seven days and reports how often it would have fired, per group and per hour. The rule does not need to be saved. Nothing is stored as an alert, and nobody is notified. What is simulated: the rule exactly as sent, evaluated every stepMs (as often as live evaluation runs) with the same evaluation live rules use: the value per group from the window and baseline, the conditions, the pending period (for), recovery, the no data policy, minExpected, evaluation hours and overrides. Each evaluation continues from the alerts the previous one left, so an alert that fired stays firing until it recovers, as live. Input data: the flows or subflows the rule counts, as they are stored now, in one-minute buckets. Each evaluation reads the window ending dataDelayMs before it, a fixed delay per rule type; delays from processing backlogs at that time are not known any more and are not simulated. Flows classified late are included, so a simulation can see slightly more than the live evaluation saw at the time. Not simulated: notifications. The contact point, its integrations and its delivery hours are not taken into account; the result says when alerts would have fired, not who would have been notified when. The first simulation reads the data the rule needs, which can take a minute; the response streams its progress as application/x-ndjson and ends with a completed event carrying the result, or a failed event. Send the toMs of that result with every later simulation of the same rule: as long as the rule\u0026#x27;s type, flow or subflow type and grouping stay the same, the data is reused and the simulation answers in about a second, so thresholds, windows and pending periods can be tuned freely. Validation errors return a regular JSON error before streaming starts. Only relative_flow_count, relative_subflow_count and absolute_flow_count rules can be simulated. Required API key permission: observe:alerts:read.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Corbado docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://corbado-43.mintlify.app/_mintlify/api/og/v2?division=Alert+management\u0026amp;title=Simulate+alert+rule\u0026amp;description=Evaluates+an+alert+rule+config+over+the+last+seven+days+and+reports+how+often+it+would+have%0Afired%2C+per+group+and+per+hour.+The+rule+does+not+need+to+be+saved.+N\u0026amp;theme=46938e1ac6053c91ba042440\u0026amp;signature=55785912775189f6f7b49513a10c3c99b21f2ef18136cb6334362712dd5b98ba\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Simulate alert rule - Corbado docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Evaluates an alert rule config over the last seven days and reports how often it would have fired, per group and per hour. The rule does not need to be saved. Nothing is stored as an alert, and nobody is notified. What is simulated: the rule exactly as sent, evaluated every stepMs (as often as live evaluation runs) with the same evaluation live rules use: the value per group from the window and baseline, the conditions, the pending period (for), recovery, the no data policy, minExpected, evaluation hours and overrides. Each evaluation continues from the alerts the previous one left, so an alert that fired stays firing until it recovers, as live. Input data: the flows or subflows the rule counts, as they are stored now, in one-minute buckets. Each evaluation reads the window ending dataDelayMs before it, a fixed delay per rule type; delays from processing backlogs at that time are not known any more and are not simulated. Flows classified late are included, so a simulation can see slightly more than the live evaluation saw at the time. Not simulated: notifications. The contact point, its integrations and its delivery hours are not taken into account; the result says when alerts would have fired, not who would have been notified when. The first simulation reads the data the rule needs, which can take a minute; the response streams its progress as application/x-ndjson and ends with a completed event carrying the result, or a failed event. Send the toMs of that result with every later simulation of the same rule: as long as the rule\u0026#x27;s type, flow or subflow type and grouping stay the same, the data is reused and the simulation answers in about a second, so thresholds, windows and pending periods can be tuned freely. Validation errors return a regular JSON error before streaming starts. Only relative_flow_count, relative_subflow_count and absolute_flow_count rules can be simulated. Required API key permission: observe:alerts:read.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://corbado-43.mintlify.app/_mintlify/api/og/v2?division=Alert+management\u0026amp;title=Simulate+alert+rule\u0026amp;description=Evaluates+an+alert+rule+config+over+the+last+seven+days+and+reports+how+often+it+would+have%0Afired%2C+per+group+and+per+hour.+The+rule+does+not+need+to+be+saved.+N\u0026amp;theme=46938e1ac6053c91ba042440\u0026amp;signature=55785912775189f6f7b49513a10c3c99b21f2ef18136cb6334362712dd5b98ba\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/corbado-43/noBvchxiQo85SoLM/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Corbado docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#184aff\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/observe/simulate-alert-rule.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.corbado.com/#organization\",\"name\":\"Corbado docs\",\"url\":\"https://docs.corbado.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/corbado-43/uh5IdxgOHQMtEt9x/logo/corbado-logo-light.svg?fit=max\u0026auto=format\u0026n=uh5IdxgOHQMtEt9x\u0026q=85\u0026s=decbc139fa76d9eeee8dcfbe91ed2094\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.corbado.com#website\",\"name\":\"Corbado docs\",\"url\":\"https://docs.corbado.com\",\"publisher\":{\"@id\":\"https://docs.corbado.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule#webpage\",\"url\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule\",\"name\":\"Simulate alert rule\",\"description\":\"Evaluates an alert rule config over the last seven days and reports how often it would have fired, per group and per hour. The rule does not need to be saved. Nothing is stored as an alert, and nobody is notified. What is simulated: the rule exactly as sent, evaluated every stepMs (as often as live evaluation runs) with the same evaluation live rules use: the value per group from the window and baseline, the conditions, the pending period (for), recovery, the no data policy, minExpected, evaluation hours and overrides. Each evaluation continues from the alerts the previous one left, so an alert that fired stays firing until it recovers, as live. Input data: the flows or subflows the rule counts, as they are stored now, in one-minute buckets. Each evaluation reads the window ending dataDelayMs before it, a fixed delay per rule type; delays from processing backlogs at that time are not known any more and are not simulated. Flows classified late are included, so a simulation can see slightly more than the live evaluation saw at the time. Not simulated: notifications. The contact point, its integrations and its delivery hours are not taken into account; the result says when alerts would have fired, not who would have been notified when. The first simulation reads the data the rule needs, which can take a minute; the response streams its progress as application/x-ndjson and ends with a completed event carrying the result, or a failed event. Send the toMs of that result with every later simulation of the same rule: as long as the rule's type, flow or subflow type and grouping stay the same, the data is reused and the simulation answers in about a second, so thresholds, windows and pending periods can be tuned freely. Validation errors return a regular JSON error before streaming starts. Only relative_flow_count, relative_subflow_count and absolute_flow_count rules can be simulated. Required API key permission: observe:alerts:read.\",\"dateModified\":\"2026-10-27T15:41:22.681Z\",\"isPartOf\":{\"@id\":\"https://docs.corbado.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Corbado Observe\",\"item\":\"https://docs.corbado.com/api-reference/observe/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API endpoints\",\"item\":\"https://docs.corbado.com/api-reference/observe/send-events\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Alert management\",\"item\":\"https://docs.corbado.com/api-reference/observe/alert-summary\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Simulate alert rule\",\"item\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule#apireference\",\"headline\":\"Simulate alert rule\",\"name\":\"Simulate alert rule\",\"description\":\"Evaluates an alert rule config over the last seven days and reports how often it would have fired, per group and per hour. The rule does not need to be saved. Nothing is stored as an alert, and nobody is notified. What is simulated: the rule exactly as sent, evaluated every stepMs (as often as live evaluation runs) with the same evaluation live rules use: the value per group from the window and baseline, the conditions, the pending period (for), recovery, the no data policy, minExpected, evaluation hours and overrides. Each evaluation continues from the alerts the previous one left, so an alert that fired stays firing until it recovers, as live. Input data: the flows or subflows the rule counts, as they are stored now, in one-minute buckets. Each evaluation reads the window ending dataDelayMs before it, a fixed delay per rule type; delays from processing backlogs at that time are not known any more and are not simulated. Flows classified late are included, so a simulation can see slightly more than the live evaluation saw at the time. Not simulated: notifications. The contact point, its integrations and its delivery hours are not taken into account; the result says when alerts would have fired, not who would have been notified when. The first simulation reads the data the rule needs, which can take a minute; the response streams its progress as application/x-ndjson and ends with a completed event carrying the result, or a failed event. Send the toMs of that result with every later simulation of the same rule: as long as the rule's type, flow or subflow type and grouping stay the same, the data is reused and the simulation answers in about a second, so thresholds, windows and pending periods can be tuned freely. Validation errors return a regular JSON error before streaming starts. Only relative_flow_count, relative_subflow_count and absolute_flow_count rules can be simulated. Required API key permission: observe:alerts:read.\",\"url\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule\",\"mainEntityOfPage\":{\"@id\":\"https://docs.corbado.com/api-reference/observe/simulate-alert-rule#webpage\"},\"dateModified\":\"2026-10-27T15:41:22.681Z\",\"publisher\":{\"@id\":\"https://docs.corbado.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.corbado.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Corbado docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Corbado docs","nav":{"global":{"anchors":[{"anchor":"Community","icon":"slack","href":"https://bit.ly/passkeys-community"},{"anchor":"GitHub","icon":"github","href":"https://github.com/corbado"},{"anchor":"Blog","icon":"newspaper","href":"https://www.corbado.com/blog"}]},"tabs":[{"tab":"Start","pages":[{"title":"Start","href":"/start"}]},{"tab":"Corbado Observe","pages":[{"title":"Corbado Observe","href":"/corbado-observe/overview/welcome"}]},{"tab":"Corbado Connect","pages":[{"title":"Corbado Connect","href":"/corbado-connect/overview/welcome"}]},{"tab":"SDKs","pages":[{"title":"SDKs","href":"/sdks/overview"}]},{"tab":"API Reference","groups":[{"group":"Overview","pages":[{"title":"Corbado Observe and Connect API Reference","sidebarTitle":"Choose an API","href":"/api-reference/overview"}]},{"group":"Corbado Observe","pages":[{"title":"Observe API reference","sidebarTitle":"Overview","href":"/api-reference/observe/overview"},{"title":"Observe API authentication","sidebarTitle":"Authentication","href":"/api-reference/observe/authentication"},{"title":"Observe errors, pagination and limits","sidebarTitle":"Errors and limits","href":"/api-reference/observe/errors"},{"title":"User data export and deletion","sidebarTitle":"User data requests","href":"/api-reference/observe/user-data"},{"group":"API endpoints","pages":[{"group":"Events","pages":[{"title":"Create new events","deprecated":null,"version":null,"sidebarTitle":"Send events","openapi":"/api-reference/openapi/observe.yaml post /observe/events","href":"/api-reference/observe/send-events"},{"title":"Search events by filter criteria","deprecated":null,"version":null,"sidebarTitle":"Search events","openapi":"/api-reference/openapi/observe.yaml post /observe/eventSearch","href":"/api-reference/observe/search-events"},{"title":"Search low-level tracking events by filter criteria","deprecated":null,"version":null,"sidebarTitle":"Search low events","openapi":"/api-reference/openapi/observe.yaml post /observe/trackingEventLowSearch","href":"/api-reference/observe/search-low-events"}]},{"group":"Catalogs and labels","pages":[{"title":"List flow type definitions","deprecated":null,"version":null,"sidebarTitle":"Flow types","openapi":"/api-reference/openapi/observe.yaml get /observe/flowTypeDefinitions","href":"/api-reference/observe/flow-types"},{"title":"List decisions","deprecated":null,"version":null,"sidebarTitle":"Decisions","openapi":"/api-reference/openapi/observe.yaml get /observe/decisions","href":"/api-reference/observe/decisions"},{"title":"List decision variants","deprecated":null,"version":null,"sidebarTitle":"Decision variants","openapi":"/api-reference/openapi/observe.yaml get /observe/decisionVariants","href":"/api-reference/observe/decision-variants"},{"title":"List challenge variants","deprecated":null,"version":null,"sidebarTitle":"Challenge variants","openapi":"/api-reference/openapi/observe.yaml get /observe/challengeVariants","href":"/api-reference/observe/challenge-variants"},{"title":"List applications","deprecated":null,"version":null,"sidebarTitle":"Applications","openapi":"/api-reference/openapi/observe.yaml get /observe/applications","href":"/api-reference/observe/applications"},{"title":"List email domains","deprecated":null,"version":null,"sidebarTitle":"Email domains","openapi":"/api-reference/openapi/observe.yaml get /observe/emailDomains","href":"/api-reference/observe/email-domains"},{"title":"List labels","deprecated":null,"version":null,"sidebarTitle":"Labels","openapi":"/api-reference/openapi/observe.yaml get /observe/labels","href":"/api-reference/observe/labels"},{"title":"Create label","deprecated":null,"version":null,"sidebarTitle":"Create label","openapi":"/api-reference/openapi/observe.yaml post /observe/labels","href":"/api-reference/observe/create-label"},{"title":"Update label","deprecated":null,"version":null,"sidebarTitle":"Update label","openapi":"/api-reference/openapi/observe.yaml put /observe/labels/{labelID}","href":"/api-reference/observe/update-label"},{"title":"Delete label","deprecated":null,"version":null,"sidebarTitle":"Delete label","openapi":"/api-reference/openapi/observe.yaml delete /observe/labels/{labelID}","href":"/api-reference/observe/delete-label"}]},{"group":"Metrics and funnels","pages":[{"title":"Calculate historical metrics for an exact journey position","deprecated":null,"version":null,"sidebarTitle":"Funnel metrics","openapi":"/api-reference/openapi/observe.yaml post /observe/funnel/metricSeries","href":"/api-reference/observe/funnel-metrics"},{"title":"Get project-owned history dictionaries and coverage","deprecated":null,"version":null,"sidebarTitle":"Funnel metadata","openapi":"/api-reference/openapi/observe.yaml get /observe/funnel/metricSeries/metadata","href":"/api-reference/observe/funnel-metadata"},{"title":"Get time series data","deprecated":null,"version":null,"sidebarTitle":"Time series","openapi":"/api-reference/openapi/observe.yaml get /observe/timeSeries","href":"/api-reference/observe/time-series"},{"title":"Get time series totals","deprecated":null,"version":null,"sidebarTitle":"Time series totals","openapi":"/api-reference/openapi/observe.yaml get /observe/timeSeries/totals","href":"/api-reference/observe/time-series-totals"},{"title":"List time-series definitions","deprecated":null,"version":null,"sidebarTitle":"Time series definitions","openapi":"/api-reference/openapi/observe.yaml get /observe/timeSeriesDefinitions","href":"/api-reference/observe/time-series-definitions"}]},{"group":"Data exports","pages":[{"title":"Export time series to downloadable files","deprecated":null,"version":null,"sidebarTitle":"Create time series export","openapi":"/api-reference/openapi/observe.yaml post /observe/timeSeries/export","href":"/api-reference/observe/create-time-series-export"},{"title":"List time series exports","deprecated":null,"version":null,"sidebarTitle":"Time series exports","openapi":"/api-reference/openapi/observe.yaml get /observe/timeSeries/exports","href":"/api-reference/observe/time-series-exports"},{"title":"Get a time series export by ID","deprecated":null,"version":null,"sidebarTitle":"Time series export","openapi":"/api-reference/openapi/observe.yaml get /observe/timeSeries/exports/{exportID}","href":"/api-reference/observe/time-series-export"},{"title":"Get a download link for a time series export file","deprecated":null,"version":null,"sidebarTitle":"Time series export download","openapi":"/api-reference/openapi/observe.yaml get /observe/timeSeries/exports/{exportID}/files/{fileName}/downloadLink","href":"/api-reference/observe/time-series-export-download"},{"title":"List observe table export files","deprecated":null,"version":null,"sidebarTitle":"Table exports","openapi":"/api-reference/openapi/observe.yaml get /observe/tableExports","href":"/api-reference/observe/table-exports"},{"title":"Get observe table export download link","deprecated":null,"version":null,"sidebarTitle":"Table export download","openapi":"/api-reference/openapi/observe.yaml get /observe/tableExports/{filename}/downloadLink","href":"/api-reference/observe/table-export-download"}]},{"group":"User data","pages":[{"title":"Create data deletion jobs","deprecated":null,"version":null,"sidebarTitle":"Delete user data","openapi":"/api-reference/openapi/observe.yaml post /observe/dataDeletionJobs","href":"/api-reference/observe/delete-user-data"},{"title":"Get a data deletion job by ID","deprecated":null,"version":null,"sidebarTitle":"Deletion status","openapi":"/api-reference/openapi/observe.yaml get /observe/dataDeletionJobs/{dataDeletionJobID}","href":"/api-reference/observe/deletion-status"},{"title":"Export observe data by external ID","deprecated":null,"version":null,"sidebarTitle":"Export user","openapi":"/api-reference/openapi/observe.yaml get /observe/dataExports/{externalID}","href":"/api-reference/observe/export-user"}]},{"group":"Metadata","pages":[{"title":"List FIDO MDS authenticator metadata","deprecated":null,"version":null,"sidebarTitle":"Authenticator metadata","openapi":"/api-reference/openapi/observe.yaml get /observe/metadata/mds","href":"/api-reference/observe/authenticator-metadata"},{"title":"List passkey authenticator (AAGUID) metadata","deprecated":null,"version":null,"sidebarTitle":"Passkey authenticator metadata","openapi":"/api-reference/openapi/observe.yaml get /observe/metadata/passkey-aaguid","href":"/api-reference/observe/passkey-authenticator-metadata"}]},{"group":"Saved ID lists","pages":[{"title":"Get Observe ID list","deprecated":null,"version":null,"sidebarTitle":"Id list","openapi":"/api-reference/openapi/observe.yaml get /observe/idLists/{id}","href":"/api-reference/observe/id-list"},{"title":"Create Observe ID list","deprecated":null,"version":null,"sidebarTitle":"Create id list","openapi":"/api-reference/openapi/observe.yaml post /observe/idLists","href":"/api-reference/observe/create-id-list"}]},{"group":"Journeys and users","pages":[{"title":"Search flows by filter criteria","deprecated":null,"version":null,"sidebarTitle":"Search flows","openapi":"/api-reference/openapi/observe.yaml post /observe/flowSearch","href":"/api-reference/observe/search-flows"},{"title":"Search subflows by filter criteria","deprecated":null,"version":null,"sidebarTitle":"Search subflows","openapi":"/api-reference/openapi/observe.yaml post /observe/subFlowSearch","href":"/api-reference/observe/search-subflows"},{"title":"Search flow tags","deprecated":null,"version":null,"sidebarTitle":"Search flow tags","openapi":"/api-reference/openapi/observe.yaml post /observe/flowTagSearch","href":"/api-reference/observe/search-flow-tags"},{"title":"Search users by filter criteria","deprecated":null,"version":null,"sidebarTitle":"Search users","openapi":"/api-reference/openapi/observe.yaml post /observe/userSearch","href":"/api-reference/observe/search-users"},{"title":"Search identifier submissions","deprecated":null,"version":null,"sidebarTitle":"Search identifiers","openapi":"/api-reference/openapi/observe.yaml post /observe/identifierSearch","href":"/api-reference/observe/search-identifiers"},{"title":"Search client environments","deprecated":null,"version":null,"sidebarTitle":"Search client environments","openapi":"/api-reference/openapi/observe.yaml post /observe/clientEnvSearch","href":"/api-reference/observe/search-client-environments"}]},{"group":"Passkey Intelligence","pages":[{"title":"Explain what went wrong for a user","deprecated":null,"version":null,"sidebarTitle":"User diagnosis","openapi":"/api-reference/openapi/observe.yaml post /observe/userDiagnosis","href":"/api-reference/observe/passkey-intelligence/user-diagnosis"},{"title":"Predict the passkey login outcome","deprecated":null,"version":null,"sidebarTitle":"Predict login","openapi":"/api-reference/openapi/observe.yaml post /observe/passkeyIntelligence","href":"/api-reference/observe/passkey-intelligence/predict-login"}]},{"group":"Passkey analysis","pages":[{"title":"List passkey behaviour for a user cohort","deprecated":null,"version":null,"sidebarTitle":"Passkey cohort","openapi":"/api-reference/openapi/observe.yaml post /observe/passkeyCohort","href":"/api-reference/observe/passkey-cohort"},{"title":"Search passkeys","deprecated":null,"version":null,"sidebarTitle":"Search passkeys","openapi":"/api-reference/openapi/observe.yaml post /observe/passkeySearch","href":"/api-reference/observe/search-passkeys"}]},{"group":"Annotations","pages":[{"title":"List annotations","deprecated":null,"version":null,"sidebarTitle":"Annotations","openapi":"/api-reference/openapi/observe.yaml get /observe/annotations","href":"/api-reference/observe/annotations"},{"title":"Create annotation","deprecated":null,"version":null,"sidebarTitle":"Create annotation","openapi":"/api-reference/openapi/observe.yaml post /observe/annotations","href":"/api-reference/observe/create-annotation"},{"title":"Get project memory document","deprecated":null,"version":null,"sidebarTitle":"Annotation document","openapi":"/api-reference/openapi/observe.yaml get /observe/annotations/document","href":"/api-reference/observe/annotation-document"},{"title":"Create or update annotation by external key","deprecated":null,"version":null,"sidebarTitle":"Upsert annotation","openapi":"/api-reference/openapi/observe.yaml put /observe/annotations/byExternalKey/{externalKey}","href":"/api-reference/observe/upsert-annotation"},{"title":"Get annotation","deprecated":null,"version":null,"sidebarTitle":"Get annotation","openapi":"/api-reference/openapi/observe.yaml get /observe/annotations/{annotationID}","href":"/api-reference/observe/get-annotation"},{"title":"Update annotation","deprecated":null,"version":null,"sidebarTitle":"Update annotation","openapi":"/api-reference/openapi/observe.yaml put /observe/annotations/{annotationID}","href":"/api-reference/observe/update-annotation"},{"title":"Delete annotation","deprecated":null,"version":null,"sidebarTitle":"Delete annotation","openapi":"/api-reference/openapi/observe.yaml delete /observe/annotations/{annotationID}","href":"/api-reference/observe/delete-annotation"},{"title":"List annotation history","deprecated":null,"version":null,"sidebarTitle":"List annotation events","openapi":"/api-reference/openapi/observe.yaml get /observe/annotations/{annotationID}/events","href":"/api-reference/observe/list-annotation-events"}]},{"group":"Error management","pages":[{"title":"List error flavours","deprecated":null,"version":null,"sidebarTitle":"Error flavours","openapi":"/api-reference/openapi/observe.yaml get /observe/errorFlavours","href":"/api-reference/observe/error-flavours"},{"title":"Assign error flavours","deprecated":null,"version":null,"sidebarTitle":"Assign error flavours","openapi":"/api-reference/openapi/observe.yaml patch /observe/errorFlavours","href":"/api-reference/observe/assign-error-flavours"},{"title":"Analyze the flow impact of error flavours","deprecated":null,"version":null,"sidebarTitle":"Error impact","openapi":"/api-reference/openapi/observe.yaml post /observe/errorFlavours/impact","href":"/api-reference/observe/error-impact"},{"title":"List errors","deprecated":null,"version":null,"sidebarTitle":"Errors list","openapi":"/api-reference/openapi/observe.yaml get /observe/errors","href":"/api-reference/observe/errors-list"},{"title":"Create error","deprecated":null,"version":null,"sidebarTitle":"Create error","openapi":"/api-reference/openapi/observe.yaml post /observe/errors","href":"/api-reference/observe/create-error"},{"title":"Update error","deprecated":null,"version":null,"sidebarTitle":"Update error","openapi":"/api-reference/openapi/observe.yaml put /observe/errors/{errorID}","href":"/api-reference/observe/update-error"},{"title":"Delete error","deprecated":null,"version":null,"sidebarTitle":"Delete error","openapi":"/api-reference/openapi/observe.yaml delete /observe/errors/{errorID}","href":"/api-reference/observe/delete-error"},{"title":"Upsert error recommendation","deprecated":null,"version":null,"sidebarTitle":"Upsert error recommendation","openapi":"/api-reference/openapi/observe.yaml put /observe/errors/{errorID}/recommendation","href":"/api-reference/observe/upsert-error-recommendation"},{"title":"Delete error recommendation","deprecated":null,"version":null,"sidebarTitle":"Delete error recommendation","openapi":"/api-reference/openapi/observe.yaml delete /observe/errors/{errorID}/recommendation","href":"/api-reference/observe/delete-error-recommendation"},{"title":"Create recommendation asset upload","deprecated":null,"version":null,"sidebarTitle":"Create recommendation asset upload","openapi":"/api-reference/openapi/observe.yaml post /observe/errors/{errorID}/recommendation/assets","href":"/api-reference/observe/create-recommendation-asset-upload"},{"title":"Delete recommendation asset","deprecated":null,"version":null,"sidebarTitle":"Delete recommendation asset","openapi":"/api-reference/openapi/observe.yaml delete /observe/errors/{errorID}/recommendation/assets/{assetID}","href":"/api-reference/observe/delete-recommendation-asset"},{"title":"Confirm recommendation asset upload","deprecated":null,"version":null,"sidebarTitle":"Confirm recommendation asset upload","openapi":"/api-reference/openapi/observe.yaml post /observe/errors/{errorID}/recommendation/assets/{assetID}/confirm","href":"/api-reference/observe/confirm-recommendation-asset-upload"},{"title":"Get recommendation asset download URL","deprecated":null,"version":null,"sidebarTitle":"Recommendation asset download","openapi":"/api-reference/openapi/observe.yaml get /observe/errors/{errorID}/recommendation/assets/{assetID}/downloadUrl","href":"/api-reference/observe/recommendation-asset-download"}]},{"group":"Alert management","pages":[{"title":"Get alerting summary","deprecated":null,"version":null,"sidebarTitle":"Alert summary","openapi":"/api-reference/openapi/observe.yaml get /observe/alertSummary","href":"/api-reference/observe/alert-summary"},{"title":"List alert rules","deprecated":null,"version":null,"sidebarTitle":"Alert rules","openapi":"/api-reference/openapi/observe.yaml get /observe/alertRules","href":"/api-reference/observe/alert-rules"},{"title":"Create alert rule","description":"Creates an Observe alert rule and stores its configuration. Does not evaluate the rule.\n\nRequired API key permission: `observe:alerts:write`.","deprecated":null,"version":null,"sidebarTitle":"Create alert rule","openapi":"/api-reference/openapi/observe.yaml post /observe/alertRules","href":"/api-reference/observe/create-alert-rule"},{"title":"Simulate alert rule","deprecated":null,"version":null,"sidebarTitle":"Simulate alert rule","openapi":"/api-reference/openapi/observe.yaml post /observe/alertRules/simulate","href":"/api-reference/observe/simulate-alert-rule"},{"title":"Get alert rule","description":"Returns a single Observe alert rule.\n\nRequired API key permission: `observe:alerts:read`.","deprecated":null,"version":null,"sidebarTitle":"Alert rule","openapi":"/api-reference/openapi/observe.yaml get /observe/alertRules/{alertRuleID}","href":"/api-reference/observe/alert-rule"},{"title":"Update alert rule","deprecated":null,"version":null,"sidebarTitle":"Update alert rule","openapi":"/api-reference/openapi/observe.yaml put /observe/alertRules/{alertRuleID}","href":"/api-reference/observe/update-alert-rule"},{"title":"Delete alert rule","deprecated":null,"version":null,"sidebarTitle":"Delete alert rule","openapi":"/api-reference/openapi/observe.yaml delete /observe/alertRules/{alertRuleID}","href":"/api-reference/observe/delete-alert-rule"},{"title":"Evaluate alert rules","deprecated":null,"version":null,"sidebarTitle":"Evaluate alert rules","openapi":"/api-reference/openapi/observe.yaml post /observe/alerts/evaluate","href":"/api-reference/observe/evaluate-alert-rules"},{"title":"List alert contact points","deprecated":null,"version":null,"sidebarTitle":"Alert contact points","openapi":"/api-reference/openapi/observe.yaml get /observe/alertContactPoints","href":"/api-reference/observe/alert-contact-points"},{"title":"Create alert contact point","deprecated":null,"version":null,"sidebarTitle":"Create alert contact point","openapi":"/api-reference/openapi/observe.yaml post /observe/alertContactPoints","href":"/api-reference/observe/create-alert-contact-point"},{"title":"Get alert contact point","deprecated":null,"version":null,"sidebarTitle":"Alert contact point","openapi":"/api-reference/openapi/observe.yaml get /observe/alertContactPoints/{alertContactPointID}","href":"/api-reference/observe/alert-contact-point"},{"title":"Update alert contact point","deprecated":null,"version":null,"sidebarTitle":"Update alert contact point","openapi":"/api-reference/openapi/observe.yaml put /observe/alertContactPoints/{alertContactPointID}","href":"/api-reference/observe/update-alert-contact-point"},{"title":"Delete alert contact point","deprecated":null,"version":null,"sidebarTitle":"Delete alert contact point","openapi":"/api-reference/openapi/observe.yaml delete /observe/alertContactPoints/{alertContactPointID}","href":"/api-reference/observe/delete-alert-contact-point"},{"title":"Send test notification","deprecated":null,"version":null,"sidebarTitle":"Test alert contact point integration","openapi":"/api-reference/openapi/observe.yaml post /observe/alertContactPoints/{alertContactPointID}/integrations/{alertContactPointIntegrationID}/test","href":"/api-reference/observe/test-alert-contact-point-integration"},{"title":"List alert rule types","deprecated":null,"version":null,"sidebarTitle":"Alert rule types","openapi":"/api-reference/openapi/observe.yaml get /observe/alertRuleTypes","href":"/api-reference/observe/alert-rule-types"},{"title":"List alert rule groups","deprecated":null,"version":null,"sidebarTitle":"Alert rule groups","openapi":"/api-reference/openapi/observe.yaml get /observe/alertRuleGroups","href":"/api-reference/observe/alert-rule-groups"},{"title":"List alert instances","deprecated":null,"version":null,"sidebarTitle":"Alert instances","openapi":"/api-reference/openapi/observe.yaml get /observe/alertInstances","href":"/api-reference/observe/alert-instances"},{"title":"Get alert instance statistics","deprecated":null,"version":null,"sidebarTitle":"Alert instance statistics","openapi":"/api-reference/openapi/observe.yaml get /observe/alertInstanceStatistics","href":"/api-reference/observe/alert-instance-statistics"},{"title":"Get alert firing","deprecated":null,"version":null,"sidebarTitle":"Alert firing","openapi":"/api-reference/openapi/observe.yaml get /observe/alertFirings/{alertFiringID}","href":"/api-reference/observe/alert-firing"},{"title":"Get alert rule statistics","deprecated":null,"version":null,"sidebarTitle":"Alert rule statistics","openapi":"/api-reference/openapi/observe.yaml get /observe/alertRuleStatistics","href":"/api-reference/observe/alert-rule-statistics"},{"title":"List alert evaluations","deprecated":null,"version":null,"sidebarTitle":"Alert evaluations","openapi":"/api-reference/openapi/observe.yaml get /observe/alertEvaluations","href":"/api-reference/observe/alert-evaluations"},{"title":"List alert transitions","deprecated":null,"version":null,"sidebarTitle":"Alert transitions","openapi":"/api-reference/openapi/observe.yaml get /observe/alertTransitions","href":"/api-reference/observe/alert-transitions"},{"title":"List alert notifications","deprecated":null,"version":null,"sidebarTitle":"Alert notifications","openapi":"/api-reference/openapi/observe.yaml get /observe/alertNotifications","href":"/api-reference/observe/alert-notifications"}]},{"group":"Experiments","pages":[{"title":"List experiments","deprecated":null,"version":null,"sidebarTitle":"Experiments","openapi":"/api-reference/openapi/observe.yaml get /observe/experiments","href":"/api-reference/observe/experiments"},{"title":"List experiment runs","deprecated":null,"version":null,"sidebarTitle":"Experiment runs","openapi":"/api-reference/openapi/observe.yaml get /observe/experimentRuns","href":"/api-reference/observe/experiment-runs"},{"title":"Create experiment run","deprecated":null,"version":null,"sidebarTitle":"Create experiment run","openapi":"/api-reference/openapi/observe.yaml post /observe/experimentRuns","href":"/api-reference/observe/create-experiment-run"},{"title":"Update experiment run","deprecated":null,"version":null,"sidebarTitle":"Update experiment run","openapi":"/api-reference/openapi/observe.yaml put /observe/experimentRuns/{experimentRunID}","href":"/api-reference/observe/update-experiment-run"},{"title":"Delete experiment run","deprecated":null,"version":null,"sidebarTitle":"Delete experiment run","openapi":"/api-reference/openapi/observe.yaml delete /observe/experimentRuns/{experimentRunID}","href":"/api-reference/observe/delete-experiment-run"}]}]}]},{"group":"Corbado Connect","pages":[{"title":"Connect API reference","sidebarTitle":"Overview","href":"/api-reference/connect/overview"},{"title":"Connect API authentication","sidebarTitle":"Authentication","href":"/api-reference/connect/authentication"},{"title":"Connect API error types","sidebarTitle":"Error types","href":"/api-reference/connect/error-types"},{"title":"Connect Frontend API","sidebarTitle":"Frontend protocol","href":"/api-reference/connect/frontend"},{"group":"Frontend API","pages":[{"group":"Passkey flows","pages":[{"title":"Initialize connect login","deprecated":null,"version":null,"sidebarTitle":"Initialize connect login","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/login/init","href":"/api-reference/connect/frontend/corbadoconnect/initialize-connect-login"},{"title":"Start connect login","deprecated":null,"version":null,"sidebarTitle":"Start connect login","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/login/start","href":"/api-reference/connect/frontend/corbadoconnect/start-connect-login"},{"title":"Finish connect login","deprecated":null,"version":null,"sidebarTitle":"Finish connect login","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/login/finish","href":"/api-reference/connect/frontend/corbadoconnect/finish-connect-login"},{"title":"Initialize connect append","deprecated":null,"version":null,"sidebarTitle":"Initialize connect append","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/append/init","href":"/api-reference/connect/frontend/corbadoconnect/initialize-connect-append"},{"title":"Start connect append","deprecated":null,"version":null,"sidebarTitle":"Start connect append","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/append/start","href":"/api-reference/connect/frontend/corbadoconnect/start-connect-append"},{"title":"Finish connect append","deprecated":null,"version":null,"sidebarTitle":"Finish connect append","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/append/finish","href":"/api-reference/connect/frontend/corbadoconnect/finish-connect-append"},{"title":"Initialize connect management","deprecated":null,"version":null,"sidebarTitle":"Initialize connect management","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/manage/init","href":"/api-reference/connect/frontend/corbadoconnect/initialize-connect-management"},{"title":"Delete connect passkey","deprecated":null,"version":null,"sidebarTitle":"Delete connect passkey","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/manage/delete","href":"/api-reference/connect/frontend/corbadoconnect/delete-connect-passkey"},{"title":"List connect passkeys","deprecated":null,"version":null,"sidebarTitle":"List connect passkeys","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/manage/list","href":"/api-reference/connect/frontend/corbadoconnect/list-connect-passkeys"},{"title":"Create connect event","deprecated":null,"version":null,"sidebarTitle":"Create connect event","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/events","href":"/api-reference/connect/frontend/corbadoconnect/create-connect-event"},{"title":"Send low-level Connect events","deprecated":null,"version":null,"sidebarTitle":"Send low-level Connect events","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/eventsLow","href":"/api-reference/connect/frontend/corbadoconnect/post-v2connecteventslow"},{"title":"Clear connect process","deprecated":null,"version":null,"sidebarTitle":"Clear connect process","openapi":"/api-reference/openapi/connect-frontend.yaml post /v2/connect/process/clear","href":"/api-reference/connect/frontend/corbadoconnect/clear-connect-process"}]},{"group":"App association and keys","pages":[{"title":"Get Android Digital Asset Links","deprecated":null,"version":null,"sidebarTitle":"Get Android Digital Asset Links","openapi":"/api-reference/openapi/connect-frontend.yaml get /.well-known/assetlinks.json","href":"/api-reference/connect/frontend/wellknown/get-well-knownassetlinksjson"},{"title":"Get Apple App Site Association","deprecated":null,"version":null,"sidebarTitle":"Get Apple App Site Association","openapi":"/api-reference/openapi/connect-frontend.yaml get /.well-known/apple-app-site-association","href":"/api-reference/connect/frontend/wellknown/get-well-knownapple-app-site-association"},{"title":"Get project signing keys","deprecated":null,"version":null,"sidebarTitle":"Get project signing keys","openapi":"/api-reference/openapi/connect-frontend.yaml get /.well-known/jwks","href":"/api-reference/connect/frontend/wellknown/get-well-knownjwks"}]}]},{"group":"Backend API","pages":[{"group":"Users and passkeys","pages":[{"title":"List users","deprecated":null,"version":null,"sidebarTitle":"List users","openapi":"/api-reference/openapi/connect-backend.yaml get /users","href":"/api-reference/connect/backend/users/list-users"},{"title":"Create a new user","deprecated":null,"version":null,"sidebarTitle":"Create a new user","openapi":"/api-reference/openapi/connect-backend.yaml post /users","href":"/api-reference/connect/backend/users/create-a-new-user"},{"title":"Retrieve a user","deprecated":null,"version":null,"sidebarTitle":"Retrieve a user","openapi":"/api-reference/openapi/connect-backend.yaml get /users/{userID}","href":"/api-reference/connect/backend/users/retrieve-a-user"},{"title":"Delete a user","deprecated":null,"version":null,"sidebarTitle":"Delete a user","openapi":"/api-reference/openapi/connect-backend.yaml delete /users/{userID}","href":"/api-reference/connect/backend/users/delete-a-user"},{"title":"Update a user","deprecated":null,"version":null,"sidebarTitle":"Update a user","openapi":"/api-reference/openapi/connect-backend.yaml patch /users/{userID}","href":"/api-reference/connect/backend/users/update-a-user"},{"title":"List passkeys for a user","deprecated":null,"version":null,"sidebarTitle":"List passkeys for a user","openapi":"/api-reference/openapi/connect-backend.yaml get /users/{userID}/credentials","href":"/api-reference/connect/backend/users/list-passkeys-for-a-user"},{"title":"Delete a passkey for a user","deprecated":null,"version":null,"sidebarTitle":"Delete a passkey for a user","openapi":"/api-reference/openapi/connect-backend.yaml delete /users/{userID}/credentials/{credentialID}","href":"/api-reference/connect/backend/users/delete-a-passkey-for-a-user"},{"title":"List passkeys for a user including full authenticator data","deprecated":null,"version":null,"sidebarTitle":"List passkeys for a user including full authenticator data","openapi":"/api-reference/openapi/connect-backend.yaml get /users/{userID}/fullCredentials","href":"/api-reference/connect/backend/users/list-passkeys-for-a-user-including-full-authenticator-data"}]},{"group":"Identifiers","pages":[{"title":"Create a login identifier for a user","deprecated":null,"version":null,"sidebarTitle":"Create a login identifier for a user","openapi":"/api-reference/openapi/connect-backend.yaml post /users/{userID}/identifiers","href":"/api-reference/connect/backend/identifiers/create-a-login-identifier-for-a-user"},{"title":"Delete a login identifier for a user","deprecated":null,"version":null,"sidebarTitle":"Delete a login identifier for a user","openapi":"/api-reference/openapi/connect-backend.yaml delete /users/{userID}/identifiers/{identifierID}","href":"/api-reference/connect/backend/identifiers/delete-a-login-identifier-for-a-user"},{"title":"Update a login identifier for a user","deprecated":null,"version":null,"sidebarTitle":"Update a login identifier for a user","openapi":"/api-reference/openapi/connect-backend.yaml patch /users/{userID}/identifiers/{identifierID}","href":"/api-reference/connect/backend/identifiers/update-a-login-identifier-for-a-user"},{"title":"List all login identifiers","deprecated":null,"version":null,"sidebarTitle":"List all login identifiers","openapi":"/api-reference/openapi/connect-backend.yaml get /identifiers","href":"/api-reference/connect/backend/identifiers/list-all-login-identifiers"}]},{"group":"Passkey diagnostics","pages":[{"title":"List all passkey events for a user","deprecated":null,"version":null,"sidebarTitle":"List all passkey events for a user","openapi":"/api-reference/openapi/connect-backend.yaml get /users/{userID}/passkeyEvents","href":"/api-reference/connect/backend/passkeyevents/list-all-passkey-events-for-a-user"},{"title":"Create a passkey event for a user","deprecated":null,"version":null,"sidebarTitle":"Create a passkey event for a user","openapi":"/api-reference/openapi/connect-backend.yaml post /users/{userID}/passkeyEvents","href":"/api-reference/connect/backend/passkeyevents/create-a-passkey-event-for-a-user"},{"title":"Delete a passkey event for a user","deprecated":null,"version":null,"sidebarTitle":"Delete a passkey event for a user","openapi":"/api-reference/openapi/connect-backend.yaml delete /users/{userID}/passkeyEvents/{passkeyEventID}","href":"/api-reference/connect/backend/passkeyevents/delete-a-passkey-event-for-a-user"},{"title":"List all passkey challenges for a user","deprecated":null,"version":null,"sidebarTitle":"List all passkey challenges for a user","openapi":"/api-reference/openapi/connect-backend.yaml get /users/{userID}/passkeyChallenges","href":"/api-reference/connect/backend/passkeychallenges/list-all-passkey-challenges-for-a-user"},{"title":"Update a passkey challenge for a user","deprecated":null,"version":null,"sidebarTitle":"Update a passkey challenge for a user","openapi":"/api-reference/openapi/connect-backend.yaml patch /users/{userID}/passkeyChallenges/{passkeyChallengeID}","href":"/api-reference/connect/backend/passkeychallenges/update-a-passkey-challenge-for-a-user"}]},{"group":"Connect tokens","pages":[{"title":"List all ConnectTokens","deprecated":null,"version":null,"sidebarTitle":"List all connecttokens","openapi":"/api-reference/openapi/connect-backend.yaml get /connectTokens","href":"/api-reference/connect/backend/connecttokens/list-all-connecttokens"},{"title":"Create a connectToken","deprecated":null,"version":null,"sidebarTitle":"Create a connecttoken","openapi":"/api-reference/openapi/connect-backend.yaml post /connectTokens","href":"/api-reference/connect/backend/connecttokens/create-a-connecttoken"},{"title":"Delete a ConnectToken","deprecated":null,"version":null,"sidebarTitle":"Delete a connecttoken","openapi":"/api-reference/openapi/connect-backend.yaml delete /connectTokens/{connectTokenID}","href":"/api-reference/connect/backend/connecttokens/delete-a-connecttoken"},{"title":"Update a ConnectToken","deprecated":null,"version":null,"sidebarTitle":"Update a connecttoken","openapi":"/api-reference/openapi/connect-backend.yaml patch /connectTokens/{connectTokenID}","href":"/api-reference/connect/backend/connecttokens/update-a-connecttoken"}]},{"group":"Passkey ceremonies","pages":[{"title":"Start creating a new passkey","deprecated":null,"version":null,"sidebarTitle":"Start creating a new passkey","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/append/start","href":"/api-reference/connect/backend/passkeys/start-creating-a-new-passkey"},{"title":"Finish creating a new passkey","deprecated":null,"version":null,"sidebarTitle":"Finish creating a new passkey","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/append/finish","href":"/api-reference/connect/backend/passkeys/finish-creating-a-new-passkey"},{"title":"Start login with an existing passkey","deprecated":null,"version":null,"sidebarTitle":"Start login with an existing passkey","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/login/start","href":"/api-reference/connect/backend/passkeys/start-login-with-an-existing-passkey"},{"title":"Finish login with an existing passkey","deprecated":null,"version":null,"sidebarTitle":"Finish login with an existing passkey","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/login/finish","href":"/api-reference/connect/backend/passkeys/finish-login-with-an-existing-passkey"},{"title":"Verify signedPasskeyData from a passkey login","deprecated":null,"version":null,"sidebarTitle":"Verify signedpasskeydata from a passkey login","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/verifySignedData","href":"/api-reference/connect/backend/passkeys/verify-signedpasskeydata-from-a-passkey-login"},{"title":"Start login with an existing passkey (Conditional UI)","deprecated":null,"version":null,"sidebarTitle":"Start login with an existing passkey conditional ui","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/mediation/start","href":"/api-reference/connect/backend/passkeys/start-login-with-an-existing-passkey-conditional-ui"},{"title":"Finish login with an existing passkey (Conditional UI)","deprecated":null,"version":null,"sidebarTitle":"Finish login with an existing passkey conditional ui","openapi":"/api-reference/openapi/connect-backend.yaml post /passkey/mediation/finish","href":"/api-reference/connect/backend/passkeys/finish-login-with-an-existing-passkey-conditional-ui"}]},{"group":"Data exports","pages":[{"title":"List project exports","deprecated":null,"version":null,"sidebarTitle":"List project exports","openapi":"/api-reference/openapi/connect-backend.yaml get /exports/{exportType}","href":"/api-reference/connect/backend/exports/list-project-exports"},{"title":"Get download link for an export file","deprecated":null,"version":null,"sidebarTitle":"Get download link for an export file","openapi":"/api-reference/openapi/connect-backend.yaml get /exports/{exportType}/{filename}/downloadLink","href":"/api-reference/connect/backend/exports/get-download-link-for-an-export-file"}]},{"group":"Analytics and configuration","pages":[{"title":"Get project statistics","deprecated":null,"version":null,"sidebarTitle":"Get project statistics","openapi":"/api-reference/openapi/connect-backend.yaml get /stats","href":"/api-reference/connect/backend/connect-reads/get-stats"},{"title":"Get statistics over time","deprecated":null,"version":null,"sidebarTitle":"Get statistics over time","openapi":"/api-reference/openapi/connect-backend.yaml get /statsByTime","href":"/api-reference/connect/backend/connect-reads/get-statsbytime"},{"title":"List applications","deprecated":null,"version":null,"sidebarTitle":"List applications","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/applications","href":"/api-reference/connect/backend/connect-reads/get-connectapplications"},{"title":"Search Connect processes","deprecated":null,"version":null,"sidebarTitle":"Search Connect processes","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/processSearch","href":"/api-reference/connect/backend/connect-reads/post-connectprocesssearch"},{"title":"Get Connect processes by ID","deprecated":null,"version":null,"sidebarTitle":"Get Connect processes by ID","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/processList","href":"/api-reference/connect/backend/connect-reads/post-connectprocesslist"},{"title":"List process events","deprecated":null,"version":null,"sidebarTitle":"List process events","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/processes/{processID}/events","href":"/api-reference/connect/backend/connect-reads/get-connectprocesses-events"},{"title":"Get process metadata","deprecated":null,"version":null,"sidebarTitle":"Get process metadata","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/processMetadata/{processID}","href":"/api-reference/connect/backend/connect-reads/get-connectprocessmetadata"},{"title":"List subprocesses","deprecated":null,"version":null,"sidebarTitle":"List subprocesses","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/processes/{processID}/subProcesses","href":"/api-reference/connect/backend/connect-reads/get-connectprocesses-subprocesses"},{"title":"List process errors","deprecated":null,"version":null,"sidebarTitle":"List process errors","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/processErrors","href":"/api-reference/connect/backend/connect-reads/get-connectprocesserrors"},{"title":"List error patterns","deprecated":null,"version":null,"sidebarTitle":"List error patterns","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/processErrorPatterns","href":"/api-reference/connect/backend/connect-reads/get-connectprocesserrorpatterns"},{"title":"List devices for multiple users","deprecated":null,"version":null,"sidebarTitle":"List devices for multiple users","openapi":"/api-reference/openapi/connect-backend.yaml post /devices","href":"/api-reference/connect/backend/connect-reads/list-devices-for-multiple-users"},{"title":"List shared devices for a user","deprecated":null,"version":null,"sidebarTitle":"List shared devices for a user","openapi":"/api-reference/openapi/connect-backend.yaml get /sharedDevices","href":"/api-reference/connect/backend/connect-reads/get-shareddevices"},{"title":"List Android app configurations","deprecated":null,"version":null,"sidebarTitle":"List Android app configurations","openapi":"/api-reference/openapi/connect-backend.yaml get /androidappconfig","href":"/api-reference/connect/backend/connect-reads/get-androidappconfig"},{"title":"List Passkey Intelligence rulesets","deprecated":null,"version":null,"sidebarTitle":"List Passkey Intelligence rulesets","openapi":"/api-reference/openapi/connect-backend.yaml get /passkeyIntelligence/{projectID}/rulesetsMetadata","href":"/api-reference/connect/backend/connect-reads/get-passkeyintelligence-rulesetsmetadata"},{"title":"Get a Passkey Intelligence ruleset","deprecated":null,"version":null,"sidebarTitle":"Get a Passkey Intelligence ruleset","openapi":"/api-reference/openapi/connect-backend.yaml get /passkeyIntelligence/{projectID}/rulesets/{rulesetID}","href":"/api-reference/connect/backend/connect-reads/get-passkeyintelligence-rulesets"},{"title":"Get project configuration","deprecated":null,"version":null,"sidebarTitle":"Get project configuration","openapi":"/api-reference/openapi/connect-backend.yaml get /projectConfig","href":"/api-reference/connect/backend/connect-reads/get-projectconfig"}]},{"group":"App configuration","pages":[{"title":"Create an application","deprecated":null,"version":null,"sidebarTitle":"Create an application","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/applications","href":"/api-reference/connect/backend/connectmanagement/post-connectapplications"},{"title":"Create an Android app configuration","deprecated":null,"version":null,"sidebarTitle":"Create an Android app configuration","openapi":"/api-reference/openapi/connect-backend.yaml post /androidappconfig","href":"/api-reference/connect/backend/connectmanagement/post-androidappconfig"},{"title":"Update an application","deprecated":null,"version":null,"sidebarTitle":"Update an application","openapi":"/api-reference/openapi/connect-backend.yaml put /connect/applications/{applicationID}","href":"/api-reference/connect/backend/connectmanagement/put-connectapplications"},{"title":"Delete an application","deprecated":null,"version":null,"sidebarTitle":"Delete an application","openapi":"/api-reference/openapi/connect-backend.yaml delete /connect/applications/{applicationID}","href":"/api-reference/connect/backend/connectmanagement/delete-connectapplications"},{"title":"Update an Android app configuration","deprecated":null,"version":null,"sidebarTitle":"Update an Android app configuration","openapi":"/api-reference/openapi/connect-backend.yaml put /androidappconfig/{androidAppConfigID}","href":"/api-reference/connect/backend/connectmanagement/put-androidappconfig"},{"title":"Delete an Android app configuration","deprecated":null,"version":null,"sidebarTitle":"Delete an Android app configuration","openapi":"/api-reference/openapi/connect-backend.yaml delete /androidappconfig/{androidAppConfigID}","href":"/api-reference/connect/backend/connectmanagement/delete-androidappconfig"},{"title":"Create a Passkey Intelligence ruleset","deprecated":null,"version":null,"sidebarTitle":"Create a Passkey Intelligence ruleset","openapi":"/api-reference/openapi/connect-backend.yaml post /passkeyIntelligence/{projectID}/rulesets","href":"/api-reference/connect/backend/connectmanagement/post-passkeyintelligence-rulesets"},{"title":"Activate a Passkey Intelligence ruleset","deprecated":null,"version":null,"sidebarTitle":"Activate a Passkey Intelligence ruleset","openapi":"/api-reference/openapi/connect-backend.yaml post /passkeyIntelligence/{projectID}/rulesets/{rulesetID}/activate","href":"/api-reference/connect/backend/connectmanagement/post-passkeyintelligence-rulesets-activate"}]},{"group":"Rollout configuration","pages":[{"title":"Get Connect configuration","deprecated":null,"version":null,"sidebarTitle":"Get Connect configuration","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/config","href":"/api-reference/connect/backend/connectrollout/get-connectconfig"},{"title":"Update Connect configuration","deprecated":null,"version":null,"sidebarTitle":"Update Connect configuration","openapi":"/api-reference/openapi/connect-backend.yaml put /connect/config","href":"/api-reference/connect/backend/connectrollout/put-connectconfig"},{"title":"Create Connect configuration","deprecated":null,"version":null,"sidebarTitle":"Create Connect configuration","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/config","href":"/api-reference/connect/backend/connectrollout/post-connectconfig"},{"title":"List rollout rulesets","deprecated":null,"version":null,"sidebarTitle":"List rollout rulesets","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/rulesetsMetadata","href":"/api-reference/connect/backend/connectrollout/get-connectrulesetsmetadata"},{"title":"Create a rollout ruleset","deprecated":null,"version":null,"sidebarTitle":"Create a rollout ruleset","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/rulesets","href":"/api-reference/connect/backend/connectrollout/post-connectrulesets"},{"title":"Get a rollout ruleset","deprecated":null,"version":null,"sidebarTitle":"Get a rollout ruleset","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/rulesets/{rulesetID}","href":"/api-reference/connect/backend/connectrollout/get-connectrulesets"},{"title":"Update a rollout ruleset","deprecated":null,"version":null,"sidebarTitle":"Update a rollout ruleset","openapi":"/api-reference/openapi/connect-backend.yaml patch /connect/rulesets/{rulesetID}","href":"/api-reference/connect/backend/connectrollout/patch-connectrulesets"},{"title":"Activate a rollout ruleset","deprecated":null,"version":null,"sidebarTitle":"Activate a rollout ruleset","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/rulesets/{rulesetID}/activate","href":"/api-reference/connect/backend/connectrollout/post-connectrulesets-activate"},{"title":"List identifier allowlists","deprecated":null,"version":null,"sidebarTitle":"List identifier allowlists","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/identifierWhitelists","href":"/api-reference/connect/backend/connectrollout/get-connectidentifierwhitelists"},{"title":"Create an identifier allowlist","deprecated":null,"version":null,"sidebarTitle":"Create an identifier allowlist","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/identifierWhitelists","href":"/api-reference/connect/backend/connectrollout/post-connectidentifierwhitelists"},{"title":"Update an identifier allowlist","deprecated":null,"version":null,"sidebarTitle":"Update an identifier allowlist","openapi":"/api-reference/openapi/connect-backend.yaml put /connect/identifierWhitelists/{identifierWhitelistID}","href":"/api-reference/connect/backend/connectrollout/put-connectidentifierwhitelists"},{"title":"Delete an identifier allowlist","deprecated":null,"version":null,"sidebarTitle":"Delete an identifier allowlist","openapi":"/api-reference/openapi/connect-backend.yaml delete /connect/identifierWhitelists/{identifierWhitelistID}","href":"/api-reference/connect/backend/connectrollout/delete-connectidentifierwhitelists"},{"title":"List rollout simulations","deprecated":null,"version":null,"sidebarTitle":"List rollout simulations","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/rulesets/{rulesetID}/simulations","href":"/api-reference/connect/backend/connectrollout/get-connectrulesets-simulations"},{"title":"Create a rollout simulation","deprecated":null,"version":null,"sidebarTitle":"Create a rollout simulation","openapi":"/api-reference/openapi/connect-backend.yaml post /connect/rulesets/{rulesetID}/simulations","href":"/api-reference/connect/backend/connectrollout/post-connectrulesets-simulations"},{"title":"Get rollout simulation status","deprecated":null,"version":null,"sidebarTitle":"Get rollout simulation status","openapi":"/api-reference/openapi/connect-backend.yaml get /connect/rulesets/{rulesetID}/simulations/{simulationID}","href":"/api-reference/connect/backend/connectrollout/get-connectrulesets-simulations-1"}]}]}]}]},{"tab":"Passkey UI Flows","pages":[{"title":"Passkey UI Flows","href":"/passkey-ui-flows/overview"}]}]},"title":"Simulate alert rule - Corbado docs","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-WRhTSUDL.js","utils-ChMov4Kr.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-_REmC2bI.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp6nVRCu.js","snippetPresets-DZadmXoU.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CY2WdoTl.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DwYG-Q4l.js","shallow-BXQIGwv4.js","getApiPlaygroundDisplay-CK5nK5B9.js","CodeSnippet-TH4a2aGW.js","CodeSnippets-DwsQiOFS.js","Page-R3M_BF4L.js","getPastedJson-DD7kUzi_.js","icon-holE3QoJ.js","MethodPill-DUW0T8us.js","DuplicateIcon-CI_p4be-.js","createIcon-BdbRvavb.js","DynamicMarkdown-DN96a4Ur.js","SectionHeading-SCu36A9d.js","axios-vUo_bRtp.js","Markdown-CCeGv-zI.js","clsx-BGBGWFTt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Cv_O2fky.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-2C5OB2eV.js"]}