Create a metric alarm with a threshold over evaluation periods.
Set denominator_metric_name for a rate rather than a count: the datapoint becomes metric_name / denominator_metric_name and threshold reads as a fraction (0.05 = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with min_sample_count so a single failure in a quiet minute isn’t a 100% error rate.
Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means app.run.terminal_count — runs that finished in the period — and not app.run.count, which counts runs that started and includes ones still running. Mismatched pairs are rejected.
Ratio alarms also require statsum or count. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — avg would divide two means and min/max would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn’t a rate.
A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: clear_threshold (fire high, clear low) for continuous series like rates and latencies; datapoints_to_alarm for spiky ones that cross the line briefly; and missing_data: "ignore" for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery.
Use GET /orgs/{org_id}/metrics/catalog to see which metric names and labels this org is actually emitting. Two metrics won’t be listed until you alarm on them: org.credits.usage_pct (percent of the billing period’s prepaid budget consumed) and org.credits.remaining (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate’s and too heavy to run speculatively. Both are levels sampled once a minute, so use max, avg or min — sum would add one reading per minute in the period and is rejected. org.credits.remaining goes negative under overage.
Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn volume rather than budget position, alarm on org.credits.spend with sum — that one carries project_id and workforce_id dims, so it can scope to a single project or workforce the way a budget can’t.
For latency, stat accepts any percentile from p0.1 to p99.9, in tenths. Equivalent spellings are fine (p95.0 is accepted and comes back as p95), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to app.run.duration_ms, cannot be a ratio, and cannot carry label, project_env_id or dims.deployment_id — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over avg for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows.
Two different project fields, gated separately. Top-level project_id is ownership — who may see and edit the alarm afterwards — and setting it requires projects.alarms.manage on that project, while leaving it out makes an org-level alarm and requires alarms.manage. dims.project_id only narrows which metric bins are read, but it still exposes that project’s numbers through the alarm’s notifications, so it requires projects.alarms.read on the project it names.
Aggregation applied to each evaluation period. Percentiles run from p0.1 to p99.9 in tenths; equivalent spellings such as p95.0 are accepted and returned canonically as p95, while a finer value such as p95.05 is rejected rather than rounded. They are exact rather than interpolated from bins, so they are only available on app.run.duration_ms and cannot be used with denominator_metric_name.
Hysteresis: once in alarm, a period only stops counting as breaching
once it clears this value rather than threshold. Must sit on the
non-breaching side of threshold — below it for gt/gte, above for
lt/lte.
Fire at 0.05 and clear at 0.03, and a metric hovering on 5% produces
one transition instead of one per swing. Without it the only defences
against flapping are a longer period_seconds or a higher
datapoints_to_alarm, both of which also delay the first detection.
Turns the alarm into a ratio condition: each period's datapoint
becomes metric_name / denominator_metric_name, read with the same
dims, stat and period. threshold is then a rate — 0.05 for a 5%
error rate, not 5.
Omit to get a policy chosen from the metric: ignore for trace.*
(sparse — a gap is absence of data, not a recovery) and not_breaching
for everything else.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Timbal","colors":{"primary":"#000000","light":"#ffffff","dark":"#000000"},"logo":{"light":"https://mintcdn.com/timbaltechsl/pt3LfpScmY2Go19A/logo/light-small-1.svg?fit=max\u0026auto=format\u0026n=pt3LfpScmY2Go19A\u0026q=85\u0026s=fd26b0ce39e9e46d6dd08d81b611a9ea","dark":"https://mintcdn.com/timbaltechsl/pt3LfpScmY2Go19A/logo/dark-small-1.svg?fit=max\u0026auto=format\u0026n=pt3LfpScmY2Go19A\u0026q=85\u0026s=5739e93ab19cd4f38a7794d947cb547f"},"favicon":"https://mintcdn.com/timbaltechsl/SFKYoQkLzl5EA6mF/favicon.png?fit=max\u0026auto=format\u0026n=SFKYoQkLzl5EA6mF\u0026q=85\u0026s=426b0689f2269536b56cad9d7b4a8b2f","api":{"openapi":"api-reference/openapi.json"},"navbar":{"primary":{"type":"github","href":"https://github.com/timbal-ai/timbal"}},"footer":{"socials":{"website":"https://timbal.ai","github":"https://github.com/timbal-ai","linkedin":"https://linkedin.com/company/timbal-ai"}},"styling":{"codeblocks":"dark","latex":false},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"timbaltechsl","hasAudioNarration":false,"actualSubdomain":"timbaltechsl","customDomains":["docs.timbal.ai"],"gitSource":{"type":"github","owner":"timbal-ai","repo":"timbal","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ade6798f569cc6b3d4acf7e","collectionId":"be3351cf-9024-42b3-b592-146aa9c7992e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ade6798f569cc6b3d4acf7e"},"entitlements":{},"buildId":"6ade6798f569cc6b3d4acf7e","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"default","tag":"API Reference","count":210},{"language":"default","tag":"Docs","count":56},{"language":"default","tag":"Organizations","count":54},{"language":"default","tag":"Projects","count":45},{"language":"default","tag":"Knowledge Bases","count":36},{"language":"default","tag":"Agents","count":31},{"language":"default","tag":"Examples","count":29},{"language":"default","tag":"Model Reference","count":28},{"language":"default","tag":"Connectors","count":26},{"language":"default","tag":"Evals","count":22}]},"assistantConfig":{"enableStarterQuestions":false},"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":[],"page":{"pagePath":"api-reference/alarms/create","slug":"/api-reference/alarms/create","pageMetadata":{"title":"Create Alarm","openapi":"POST /orgs/{org_id}/alarms","description":"Create a metric alarm with a threshold over evaluation periods.\n\nSet `denominator_metric_name` for a **rate** rather than a count: the datapoint becomes `metric_name / denominator_metric_name` and `threshold` reads as a fraction (`0.05` = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with `min_sample_count` so a single failure in a quiet minute isn't a 100% error rate.\n\nBoth series must be binned on the same clock, since they are divided period by period. For outcome rates that means `app.run.terminal_count` — runs that *finished* in the period — and not `app.run.count`, which counts runs that *started* and includes ones still running. Mismatched pairs are rejected.\n\nRatio alarms also require `stat` `sum` or `count`. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — `avg` would divide two means and `min`/`max` would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn't a rate.\n\nA sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: `clear_threshold` (fire high, clear low) for continuous series like rates and latencies; `datapoints_to_alarm` for spiky ones that cross the line briefly; and `missing_data: \"ignore\"` for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery.\n\nUse `GET /orgs/{org_id}/metrics/catalog` to see which metric names and labels this org is actually emitting. Two metrics won't be listed until you alarm on them: `org.credits.usage_pct` (percent of the billing period's prepaid budget consumed) and `org.credits.remaining` (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate's and too heavy to run speculatively. Both are levels sampled once a minute, so use `max`, `avg` or `min` — `sum` would add one reading per minute in the period and is rejected. `org.credits.remaining` goes negative under overage.\n\nPercent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn *volume* rather than budget position, alarm on `org.credits.spend` with `sum` — that one carries `project_id` and `workforce_id` dims, so it can scope to a single project or workforce the way a budget can't.\n\nFor latency, `stat` accepts any percentile from `p0.1` to `p99.9`, in tenths. Equivalent spellings are fine (`p95.0` is accepted and comes back as `p95`), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to `app.run.duration_ms`, cannot be a ratio, and cannot carry `label`, `project_env_id` or `dims.deployment_id` — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over `avg` for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows.\n\nTwo different project fields, gated separately. Top-level `project_id` is ownership — who may see and edit the alarm afterwards — and setting it requires `projects.alarms.manage` on that project, while leaving it out makes an org-level alarm and requires `alarms.manage`. `dims.project_id` only narrows which metric bins are read, but it still exposes that project's numbers through the alarm's notifications, so it requires `projects.alarms.read` on the project it names.","href":"/api-reference/alarms/create"},"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 em: \"em\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Create a metric alarm with a threshold over evaluation periods.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Set \", _jsx(_components.code, {\n children: \"denominator_metric_name\"\n }), \" for a \", _jsx(_components.strong, {\n children: \"rate\"\n }), \" rather than a count: the datapoint becomes \", _jsx(_components.code, {\n children: \"metric_name / denominator_metric_name\"\n }), \" and \", _jsx(_components.code, {\n children: \"threshold\"\n }), \" reads as a fraction (\", _jsx(_components.code, {\n children: \"0.05\"\n }), \" = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with \", _jsx(_components.code, {\n children: \"min_sample_count\"\n }), \" so a single failure in a quiet minute isn’t a 100% error rate.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means \", _jsx(_components.code, {\n children: \"app.run.terminal_count\"\n }), \" — runs that \", _jsx(_components.em, {\n children: \"finished\"\n }), \" in the period — and not \", _jsx(_components.code, {\n children: \"app.run.count\"\n }), \", which counts runs that \", _jsx(_components.em, {\n children: \"started\"\n }), \" and includes ones still running. Mismatched pairs are rejected.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Ratio alarms also require \", _jsx(_components.code, {\n children: \"stat\"\n }), \" \", _jsx(_components.code, {\n children: \"sum\"\n }), \" or \", _jsx(_components.code, {\n children: \"count\"\n }), \". The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — \", _jsx(_components.code, {\n children: \"avg\"\n }), \" would divide two means and \", _jsx(_components.code, {\n children: \"min\"\n }), \"/\", _jsx(_components.code, {\n children: \"max\"\n }), \" would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn’t a rate.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: \", _jsx(_components.code, {\n children: \"clear_threshold\"\n }), \" (fire high, clear low) for continuous series like rates and latencies; \", _jsx(_components.code, {\n children: \"datapoints_to_alarm\"\n }), \" for spiky ones that cross the line briefly; and \", _jsx(_components.code, {\n children: \"missing_data: \\\"ignore\\\"\"\n }), \" for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use \", _jsx(_components.code, {\n children: \"GET /orgs/{org_id}/metrics/catalog\"\n }), \" to see which metric names and labels this org is actually emitting. Two metrics won’t be listed until you alarm on them: \", _jsx(_components.code, {\n children: \"org.credits.usage_pct\"\n }), \" (percent of the billing period’s prepaid budget consumed) and \", _jsx(_components.code, {\n children: \"org.credits.remaining\"\n }), \" (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate’s and too heavy to run speculatively. Both are levels sampled once a minute, so use \", _jsx(_components.code, {\n children: \"max\"\n }), \", \", _jsx(_components.code, {\n children: \"avg\"\n }), \" or \", _jsx(_components.code, {\n children: \"min\"\n }), \" — \", _jsx(_components.code, {\n children: \"sum\"\n }), \" would add one reading per minute in the period and is rejected. \", _jsx(_components.code, {\n children: \"org.credits.remaining\"\n }), \" goes negative under overage.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn \", _jsx(_components.em, {\n children: \"volume\"\n }), \" rather than budget position, alarm on \", _jsx(_components.code, {\n children: \"org.credits.spend\"\n }), \" with \", _jsx(_components.code, {\n children: \"sum\"\n }), \" — that one carries \", _jsx(_components.code, {\n children: \"project_id\"\n }), \" and \", _jsx(_components.code, {\n children: \"workforce_id\"\n }), \" dims, so it can scope to a single project or workforce the way a budget can’t.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"For latency, \", _jsx(_components.code, {\n children: \"stat\"\n }), \" accepts any percentile from \", _jsx(_components.code, {\n children: \"p0.1\"\n }), \" to \", _jsx(_components.code, {\n children: \"p99.9\"\n }), \", in tenths. Equivalent spellings are fine (\", _jsx(_components.code, {\n children: \"p95.0\"\n }), \" is accepted and comes back as \", _jsx(_components.code, {\n children: \"p95\"\n }), \"), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to \", _jsx(_components.code, {\n children: \"app.run.duration_ms\"\n }), \", cannot be a ratio, and cannot carry \", _jsx(_components.code, {\n children: \"label\"\n }), \", \", _jsx(_components.code, {\n children: \"project_env_id\"\n }), \" or \", _jsx(_components.code, {\n children: \"dims.deployment_id\"\n }), \" — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over \", _jsx(_components.code, {\n children: \"avg\"\n }), \" for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Two different project fields, gated separately. Top-level \", _jsx(_components.code, {\n children: \"project_id\"\n }), \" is ownership — who may see and edit the alarm afterwards — and setting it requires \", _jsx(_components.code, {\n children: \"projects.alarms.manage\"\n }), \" on that project, while leaving it out makes an org-level alarm and requires \", _jsx(_components.code, {\n children: \"alarms.manage\"\n }), \". \", _jsx(_components.code, {\n children: \"dims.project_id\"\n }), \" only narrows which metric bins are read, but it still exposes that project’s numbers through the alarm’s notifications, so it requires \", _jsx(_components.code, {\n children: \"projects.alarms.read\"\n }), \" on the project it names.\"]\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":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Create Alarm","openapi":"POST /orgs/{org_id}/alarms","description":"Create a metric alarm with a threshold over evaluation periods.\n\nSet `denominator_metric_name` for a **rate** rather than a count: the datapoint becomes `metric_name / denominator_metric_name` and `threshold` reads as a fraction (`0.05` = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with `min_sample_count` so a single failure in a quiet minute isn't a 100% error rate.\n\nBoth series must be binned on the same clock, since they are divided period by period. For outcome rates that means `app.run.terminal_count` — runs that *finished* in the period — and not `app.run.count`, which counts runs that *started* and includes ones still running. Mismatched pairs are rejected.\n\nRatio alarms also require `stat` `sum` or `count`. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — `avg` would divide two means and `min`/`max` would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn't a rate.\n\nA sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: `clear_threshold` (fire high, clear low) for continuous series like rates and latencies; `datapoints_to_alarm` for spiky ones that cross the line briefly; and `missing_data: \"ignore\"` for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery.\n\nUse `GET /orgs/{org_id}/metrics/catalog` to see which metric names and labels this org is actually emitting. Two metrics won't be listed until you alarm on them: `org.credits.usage_pct` (percent of the billing period's prepaid budget consumed) and `org.credits.remaining` (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate's and too heavy to run speculatively. Both are levels sampled once a minute, so use `max`, `avg` or `min` — `sum` would add one reading per minute in the period and is rejected. `org.credits.remaining` goes negative under overage.\n\nPercent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn *volume* rather than budget position, alarm on `org.credits.spend` with `sum` — that one carries `project_id` and `workforce_id` dims, so it can scope to a single project or workforce the way a budget can't.\n\nFor latency, `stat` accepts any percentile from `p0.1` to `p99.9`, in tenths. Equivalent spellings are fine (`p95.0` is accepted and comes back as `p95`), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to `app.run.duration_ms`, cannot be a ratio, and cannot carry `label`, `project_env_id` or `dims.deployment_id` — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over `avg` for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows.\n\nTwo different project fields, gated separately. Top-level `project_id` is ownership — who may see and edit the alarm afterwards — and setting it requires `projects.alarms.manage` on that project, while leaving it out makes an org-level alarm and requires `alarms.manage`. `dims.project_id` only narrows which metric bins are read, but it still exposes that project's numbers through the alarm's notifications, so it requires `projects.alarms.read` on the project it names.","href":"/api-reference/alarms/create"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["alarms"],"summary":"Create a metric alarm","description":"Create a metric alarm with a threshold over evaluation periods.\n\nSet `denominator_metric_name` for a **rate** rather than a count: the datapoint becomes `metric_name / denominator_metric_name` and `threshold` reads as a fraction (`0.05` = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with `min_sample_count` so a single failure in a quiet minute isn't a 100% error rate.\n\nBoth series must be binned on the same clock, since they are divided period by period. For outcome rates that means `app.run.terminal_count` — runs that *finished* in the period — and not `app.run.count`, which counts runs that *started* and includes ones still running. Mismatched pairs are rejected.\n\nRatio alarms also require `stat` `sum` or `count`. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — `avg` would divide two means and `min`/`max` would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn't a rate.\n\nA sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: `clear_threshold` (fire high, clear low) for continuous series like rates and latencies; `datapoints_to_alarm` for spiky ones that cross the line briefly; and `missing_data: \"ignore\"` for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery.\n\nUse `GET /orgs/{org_id}/metrics/catalog` to see which metric names and labels this org is actually emitting. Two metrics won't be listed until you alarm on them: `org.credits.usage_pct` (percent of the billing period's prepaid budget consumed) and `org.credits.remaining` (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate's and too heavy to run speculatively. Both are levels sampled once a minute, so use `max`, `avg` or `min` — `sum` would add one reading per minute in the period and is rejected. `org.credits.remaining` goes negative under overage.\n\nPercent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn *volume* rather than budget position, alarm on `org.credits.spend` with `sum` — that one carries `project_id` and `workforce_id` dims, so it can scope to a single project or workforce the way a budget can't.\n\nFor latency, `stat` accepts any percentile from `p0.1` to `p99.9`, in tenths. Equivalent spellings are fine (`p95.0` is accepted and comes back as `p95`), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to `app.run.duration_ms`, cannot be a ratio, and cannot carry `label`, `project_env_id` or `dims.deployment_id` — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over `avg` for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows.\n\nTwo different project fields, gated separately. Top-level `project_id` is ownership — who may see and edit the alarm afterwards — and setting it requires `projects.alarms.manage` on that project, while leaving it out makes an org-level alarm and requires `alarms.manage`. `dims.project_id` only narrows which metric bins are read, but it still exposes that project's numbers through the alarm's notifications, so it requires `projects.alarms.read` on the project it names.","operationId":"create_org_alarm","parameters":["efd98ba2-1a02-4f52-90a4-6a2e1fad77f7"],"requestBody":"24488a60-97a5-4f07-bdfc-b1ed06c19ebf","responses":{"201":"34c5195c-cf33-4be5-9865-2e5c3c7d79ea","400":"0bfde213-7049-4dcf-8a75-def24cc7df19","403":"9729b37f-43bf-45aa-9764-28a4dedb8fb0"},"security":["00f595f2-d902-4854-a20e-c3a1d0e349c8"],"method":"post","type":"path","servers":["063e6282-8e14-477c-a715-c7b30ccd340b","a9adc882-01d3-4459-9489-6baa7c24677b"],"path":"/orgs/{org_id}/alarms","baseUrlOptions":["https://api.timbal.ai","https://api.dev.timbal.ai"],"title":"Create a metric alarm","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"efd98ba2-1a02-4f52-90a4-6a2e1fad77f7":{"name":"org_id","in":"path","required":true,"schema":{"type":"string","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"Body for **POST** `/orgs/{org_id}/alarms`.","required":["name","metric_name","stat","comparison","threshold","channel"],"properties":{"channel":{"type":"object","description":"Channel: inline `type` + `config`, or reuse with `{ \"id\": \u003cchannel id> }` (same org).","properties":{"config":{"type":"object","description":"Omitted or null when linking by `id` only.","uniqueKey":"channel.config","typeLabel":"object"},"id":{"oneOf":[{"type":"string","description":"Existing `NotificationChannels.id` for this org. When set, `type` / `config` / `name` are ignored.","uniqueKey":"channel.id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Existing `NotificationChannels.id` for this org. When set, `type` / `config` / `name` are ignored.","uniqueKey":"channel.id.oneOf.1","typeLabel":"null"}],"uniqueKey":"channel.id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","uniqueKey":"channel.name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"channel.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"channel.name","typeLabel":"string | null"},"type":{"type":"string","enum":["email","slack"],"uniqueKey":"channel.type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"channel","typeLabel":"object"},"comparison":{"type":"string","enum":["gt","gte","lt","lte"],"isRequired":true,"uniqueKey":"comparison","typeLabel":"enum\u003cstring>"},"metric_name":{"type":"string","description":"Metric to watch, e.g. `app.run.errors`, `deployment.health`,\n`org.credits.spend`. The numerator when `denominator_metric_name` is set.","isRequired":true,"uniqueKey":"metric_name","typeLabel":"string"},"name":{"type":"string","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"stat":{"type":"string","description":"Aggregation applied to each evaluation period. Percentiles run from p0.1 to p99.9 in tenths; equivalent spellings such as p95.0 are accepted and returned canonically as p95, while a finer value such as p95.05 is rejected rather than rounded. They are exact rather than interpolated from bins, so they are only available on app.run.duration_ms and cannot be used with denominator_metric_name.","examples":["p99"],"pattern":"^(avg|sum|count|min|max|p\\d+(\\.\\d+)?)$","isRequired":true,"uniqueKey":"stat","typeLabel":"string"},"threshold":{"type":"number","format":"double","isRequired":true,"uniqueKey":"threshold","typeLabel":"number\u003cdouble>"},"clear_threshold":{"oneOf":[{"type":"number","format":"double","description":"Hysteresis: once in `alarm`, a period only stops counting as breaching\nonce it clears *this* value rather than `threshold`. Must sit on the\nnon-breaching side of `threshold` — below it for `gt`/`gte`, above for\n`lt`/`lte`.\n\nFire at `0.05` and clear at `0.03`, and a metric hovering on 5% produces\none transition instead of one per swing. Without it the only defences\nagainst flapping are a longer `period_seconds` or a higher\n`datapoints_to_alarm`, both of which also delay the *first* detection.","uniqueKey":"clear_threshold.oneOf.0","typeLabel":"number\u003cdouble>"},{"type":"null","format":"double","description":"Hysteresis: once in `alarm`, a period only stops counting as breaching\nonce it clears *this* value rather than `threshold`. Must sit on the\nnon-breaching side of `threshold` — below it for `gt`/`gte`, above for\n`lt`/`lte`.\n\nFire at `0.05` and clear at `0.03`, and a metric hovering on 5% produces\none transition instead of one per swing. Without it the only defences\nagainst flapping are a longer `period_seconds` or a higher\n`datapoints_to_alarm`, both of which also delay the *first* detection.","uniqueKey":"clear_threshold.oneOf.1","typeLabel":"null"}],"uniqueKey":"clear_threshold","typeLabel":"number\u003cdouble> | null"},"datapoints_to_alarm":{"type":"integer","format":"int32","description":"Datapoints that must breach out of the last `evaluation_periods`.","uniqueKey":"datapoints_to_alarm","typeLabel":"integer\u003cint32>"},"denominator_metric_name":{"oneOf":[{"type":"string","description":"Turns the alarm into a **ratio** condition: each period's datapoint\nbecomes `metric_name / denominator_metric_name`, read with the same\ndims, stat and period. `threshold` is then a rate — `0.05` for a 5%\nerror rate, not `5`.\n\nPair it with `min_sample_count`; see that field.","uniqueKey":"denominator_metric_name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Turns the alarm into a **ratio** condition: each period's datapoint\nbecomes `metric_name / denominator_metric_name`, read with the same\ndims, stat and period. `threshold` is then a rate — `0.05` for a 5%\nerror rate, not `5`.\n\nPair it with `min_sample_count`; see that field.","uniqueKey":"denominator_metric_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"denominator_metric_name","typeLabel":"string | null"},"dims":{"oneOf":[{"type":"null","uniqueKey":"dims.oneOf.0","typeLabel":"null"},{"type":"object","description":"Metric dimension filters. Omitted = aggregate across that dimension.\n\nNot `Copy` since `label` is owned.","properties":{"deployment_id":{"oneOf":[{"type":"string","uniqueKey":"dims.oneOf.1.deployment_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"dims.oneOf.1.deployment_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"dims.oneOf.1.deployment_id","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","description":"`Metrics.label` — the span name behind a trace-derived metric. Scopes\nthe alarm to one tool/step instead of the sum over every span the\nfilter matched.","uniqueKey":"dims.oneOf.1.label.oneOf.0","typeLabel":"string"},{"type":"null","description":"`Metrics.label` — the span name behind a trace-derived metric. Scopes\nthe alarm to one tool/step instead of the sum over every span the\nfilter matched.","uniqueKey":"dims.oneOf.1.label.oneOf.1","typeLabel":"null"}],"uniqueKey":"dims.oneOf.1.label","typeLabel":"string | null"},"project_env_id":{"oneOf":[{"type":"string","uniqueKey":"dims.oneOf.1.project_env_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"dims.oneOf.1.project_env_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"dims.oneOf.1.project_env_id","typeLabel":"string | null"},"project_id":{"oneOf":[{"type":"string","uniqueKey":"dims.oneOf.1.project_id.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"dims.oneOf.1.project_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"dims.oneOf.1.project_id","typeLabel":"string | null"},"workforce_id":{"oneOf":[{"type":"string","description":"Agent / workflow app (`OrgsApps.id`).","uniqueKey":"dims.oneOf.1.workforce_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Agent / workflow app (`OrgsApps.id`).","uniqueKey":"dims.oneOf.1.workforce_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"dims.oneOf.1.workforce_id","typeLabel":"string | null"}},"uniqueKey":"dims.oneOf.1","typeLabel":"object"}],"uniqueKey":"dims","typeLabel":"null | object"},"evaluation_periods":{"type":"integer","format":"int32","uniqueKey":"evaluation_periods","typeLabel":"integer\u003cint32>"},"min_sample_count":{"type":"integer","format":"int64","description":"Minimum denominator for a ratio period to count. Below it (or at zero)\nthe period has no datapoint and follows `missing_data`.\n\nExists because ratios are meaningless on tiny samples: 1 error out of 1\nrun is 100%. Set it to the smallest traffic level you'd actually act on.","uniqueKey":"min_sample_count","typeLabel":"integer\u003cint64>"},"missing_data":{"oneOf":[{"type":"null","uniqueKey":"missing_data.oneOf.0","typeLabel":"null"},{"type":"string","description":"Omit to get a policy chosen from the metric: `ignore` for `trace.*`\n(sparse — a gap is absence of data, not a recovery) and `not_breaching`\nfor everything else.","enum":["not_breaching","breaching","insufficient","ignore"],"uniqueKey":"missing_data.oneOf.1","typeLabel":"enum\u003cstring>"}],"uniqueKey":"missing_data","typeLabel":"null | enum\u003cstring>"},"period_seconds":{"type":"integer","format":"int32","description":"Length of one evaluation period in seconds (multiple of 60, >= 60).","uniqueKey":"period_seconds","typeLabel":"integer\u003cint32>"},"project_id":{"oneOf":[{"type":"string","description":"Scope the alarm to a project. Omit for an org-level alarm.","uniqueKey":"project_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"Scope the alarm to a project. Omit for an org-level alarm.","uniqueKey":"project_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"project_id","typeLabel":"string | null"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Credits budget above 80%":{"title":"Credits budget above 80%","value":{"name":"Credits usage","metric_name":"org.credits.usage_pct","stat":"max","period_seconds":300,"comparison":"gte","threshold":80,"clear_threshold":70,"datapoints_to_alarm":1,"evaluation_periods":1,"channel":{"type":"email","config":{"to":"finance@example.com"}}}},"Deployment down":{"title":"Deployment down","value":{"name":"API down — production","metric_name":"deployment.health","dims":{"project_env_id":"559"},"stat":"avg","period_seconds":120,"comparison":"lt","threshold":0.5,"missing_data":"breaching","channel":{"type":"slack","config":{"token":"xoxb-1234567890123-1234567890123","channel":"C0123456789"}}}},"Error count":{"title":"Error count","value":{"name":"Support agent errors","metric_name":"app.run.errors","dims":{"workforce_id":"123"},"stat":"sum","period_seconds":300,"comparison":"gte","threshold":5,"datapoints_to_alarm":2,"evaluation_periods":3,"channel":{"type":"email","config":{"to":"ops@example.com"}}}},"Error rate above 5%":{"title":"Error rate above 5%","value":{"name":"Support agent error rate","metric_name":"app.run.errors","denominator_metric_name":"app.run.terminal_count","min_sample_count":20,"dims":{"workforce_id":"123"},"stat":"sum","period_seconds":300,"comparison":"gt","threshold":0.05,"clear_threshold":0.03,"datapoints_to_alarm":2,"evaluation_periods":3,"channel":{"type":"email","config":{"to":"ops@example.com"}}}},"Fewer than 1000 credits left":{"title":"Fewer than 1000 credits left","value":{"name":"Credits headroom","metric_name":"org.credits.remaining","stat":"min","period_seconds":300,"comparison":"lt","threshold":1000,"clear_threshold":5000,"datapoints_to_alarm":1,"evaluation_periods":1,"channel":{"type":"email","config":{"to":"finance@example.com"}}}},"Sparse metric, no false recovery":{"title":"Sparse metric, no false recovery","value":{"name":"Checkout tool failures","metric_name":"trace.tool_errors","dims":{"workforce_id":"123","label":"charge_card"},"stat":"sum","period_seconds":60,"comparison":"gt","threshold":5,"missing_data":"ignore","channel":{"type":"slack","config":{"token":"xoxb-1234567890123-1234567890123","channel":"C0123456789"}}}},"p99 latency":{"title":"p99 latency","value":{"name":"Checkout p99 latency","metric_name":"app.run.duration_ms","dims":{"workforce_id":"123"},"stat":"p99","period_seconds":300,"comparison":"gt","threshold":8000,"clear_threshold":6000,"datapoints_to_alarm":2,"evaluation_periods":3,"channel":{"type":"email","config":{"to":"ops@example.com"}}}}},"exampleType":"examples"}},"required":true,"exampleType":"examples"},"responses":{"34c5195c-cf33-4be5-9865-2e5c3c7d79ea":{"description":"Alarm and channel link created","content":{"application/json":{"schema":{"type":"object","required":["id","channel_id","channel_action"],"properties":{"channel_action":{"type":"string","description":"How the request was wired to `NotificationChannels`.","enum":["linked","reused","created"],"isRequired":true,"uniqueKey":"channel_action","typeLabel":"enum\u003cstring>"},"channel_id":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"channel_id","typeLabel":"integer\u003cint64>"},"id":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"id","typeLabel":"integer\u003cint64>"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"channel_action":"linked","channel_id":123,"id":123}}},"exampleType":"generated"}},"exampleType":"generated"},"0bfde213-7049-4dcf-8a75-def24cc7df19":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code (e.g. `ALREADY_EXISTS`, `BAD_REQUEST`).","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"9729b37f-43bf-45aa-9764-28a4dedb8fb0":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code (e.g. `ALREADY_EXISTS`, `BAD_REQUEST`).","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable description.","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"00f595f2-d902-4854-a20e-c3a1d0e349c8":{"bearer_auth":{"type":"http","scheme":"bearer","description":"Timbal API key. Obtain your API key from the Timbal platform settings. See [Authentication](/api-reference/authentication) for more information.","scopes":[]}}},"servers":{"063e6282-8e14-477c-a715-c7b30ccd340b":{"url":"https://api.timbal.ai","description":"Production"},"a9adc882-01d3-4459-9489-6baa7c24677b":{"url":"https://api.dev.timbal.ai","description":"Development"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Timbal API key. Obtain your API key from the Timbal platform settings. See [Authentication](/api-reference/authentication) for more information.","scopes":[]},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Timbal API key. Obtain your API key from the Timbal platform settings. See [Authentication](/api-reference/authentication) for more information.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearer_auth","name":"Authorization"}],"title":"bearer_auth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"timbaltechsl","siteName":"Timbal","title":"Create Alarm - Timbal","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-28T10:40:38.555Z","originalFileLocation":"api-reference/alarms/create.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=\"Create a metric alarm with a threshold over evaluation periods. Set denominator_metric_name for a rate rather than a count: the datapoint becomes metric_name / denominator_metric_name and threshold reads as a fraction (0.05 = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with min_sample_count so a single failure in a quiet minute isn\u0026#x27;t a 100% error rate. Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means app.run.terminal_count — runs that finished in the period — and not app.run.count, which counts runs that started and includes ones still running. Mismatched pairs are rejected. Ratio alarms also require stat sum or count. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — avg would divide two means and min/max would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn\u0026#x27;t a rate. A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: clear_threshold (fire high, clear low) for continuous series like rates and latencies; datapoints_to_alarm for spiky ones that cross the line briefly; and missing_data: \u0026quot;ignore\u0026quot; for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery. Use GET /orgs/{org_id}/metrics/catalog to see which metric names and labels this org is actually emitting. Two metrics won\u0026#x27;t be listed until you alarm on them: org.credits.usage_pct (percent of the billing period\u0026#x27;s prepaid budget consumed) and org.credits.remaining (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate\u0026#x27;s and too heavy to run speculatively. Both are levels sampled once a minute, so use max, avg or min — sum would add one reading per minute in the period and is rejected. org.credits.remaining goes negative under overage. Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn volume rather than budget position, alarm on org.credits.spend with sum — that one carries project_id and workforce_id dims, so it can scope to a single project or workforce the way a budget can\u0026#x27;t. For latency, stat accepts any percentile from p0.1 to p99.9, in tenths. Equivalent spellings are fine (p95.0 is accepted and comes back as p95), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to app.run.duration_ms, cannot be a ratio, and cannot carry label, project_env_id or dims.deployment_id — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over avg for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows. Two different project fields, gated separately. Top-level project_id is ownership — who may see and edit the alarm afterwards — and setting it requires projects.alarms.manage on that project, while leaving it out makes an org-level alarm and requires alarms.manage. dims.project_id only narrows which metric bins are read, but it still exposes that project\u0026#x27;s numbers through the alarm\u0026#x27;s notifications, so it requires projects.alarms.read on the project it names.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Timbal\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_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/timbaltechsl/HA5uMpfE6Se4k3W2/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create Alarm - Timbal\">\u003cmeta data-mint-head property=\"og:description\" content=\"Create a metric alarm with a threshold over evaluation periods. Set denominator_metric_name for a rate rather than a count: the datapoint becomes metric_name / denominator_metric_name and threshold reads as a fraction (0.05 = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with min_sample_count so a single failure in a quiet minute isn\u0026#x27;t a 100% error rate. Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means app.run.terminal_count — runs that finished in the period — and not app.run.count, which counts runs that started and includes ones still running. Mismatched pairs are rejected. Ratio alarms also require stat sum or count. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — avg would divide two means and min/max would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn\u0026#x27;t a rate. A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: clear_threshold (fire high, clear low) for continuous series like rates and latencies; datapoints_to_alarm for spiky ones that cross the line briefly; and missing_data: \u0026quot;ignore\u0026quot; for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery. Use GET /orgs/{org_id}/metrics/catalog to see which metric names and labels this org is actually emitting. Two metrics won\u0026#x27;t be listed until you alarm on them: org.credits.usage_pct (percent of the billing period\u0026#x27;s prepaid budget consumed) and org.credits.remaining (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate\u0026#x27;s and too heavy to run speculatively. Both are levels sampled once a minute, so use max, avg or min — sum would add one reading per minute in the period and is rejected. org.credits.remaining goes negative under overage. Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn volume rather than budget position, alarm on org.credits.spend with sum — that one carries project_id and workforce_id dims, so it can scope to a single project or workforce the way a budget can\u0026#x27;t. For latency, stat accepts any percentile from p0.1 to p99.9, in tenths. Equivalent spellings are fine (p95.0 is accepted and comes back as p95), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to app.run.duration_ms, cannot be a ratio, and cannot carry label, project_env_id or dims.deployment_id — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over avg for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows. Two different project fields, gated separately. Top-level project_id is ownership — who may see and edit the alarm afterwards — and setting it requires projects.alarms.manage on that project, while leaving it out makes an org-level alarm and requires alarms.manage. dims.project_id only narrows which metric bins are read, but it still exposes that project\u0026#x27;s numbers through the alarm\u0026#x27;s notifications, so it requires projects.alarms.read on the project it names.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Timbal\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.timbal.ai/api-reference/alarms/create\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://timbaltechsl.mintlify.app/_mintlify/api/og/v2?division=Alarms\u0026amp;title=Create+Alarm\u0026amp;description=Create+a+metric+alarm+with+a+threshold+over+evaluation+periods.%0A%0ASet+%60denominator_metric_name%60+for+a+**rate**+rather+than+a+count%3A+the+datapoint+becomes+%60metric\u0026amp;theme=259c386eb829de58cc6638f3\u0026amp;signature=74d7d0bfde11213258c90ec28621d42339fc75da330adf5f65161466ef2e60cf\">\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=\"Create Alarm - Timbal\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Create a metric alarm with a threshold over evaluation periods. Set denominator_metric_name for a rate rather than a count: the datapoint becomes metric_name / denominator_metric_name and threshold reads as a fraction (0.05 = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with min_sample_count so a single failure in a quiet minute isn\u0026#x27;t a 100% error rate. Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means app.run.terminal_count — runs that finished in the period — and not app.run.count, which counts runs that started and includes ones still running. Mismatched pairs are rejected. Ratio alarms also require stat sum or count. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — avg would divide two means and min/max would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn\u0026#x27;t a rate. A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: clear_threshold (fire high, clear low) for continuous series like rates and latencies; datapoints_to_alarm for spiky ones that cross the line briefly; and missing_data: \u0026quot;ignore\u0026quot; for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery. Use GET /orgs/{org_id}/metrics/catalog to see which metric names and labels this org is actually emitting. Two metrics won\u0026#x27;t be listed until you alarm on them: org.credits.usage_pct (percent of the billing period\u0026#x27;s prepaid budget consumed) and org.credits.remaining (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate\u0026#x27;s and too heavy to run speculatively. Both are levels sampled once a minute, so use max, avg or min — sum would add one reading per minute in the period and is rejected. org.credits.remaining goes negative under overage. Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn volume rather than budget position, alarm on org.credits.spend with sum — that one carries project_id and workforce_id dims, so it can scope to a single project or workforce the way a budget can\u0026#x27;t. For latency, stat accepts any percentile from p0.1 to p99.9, in tenths. Equivalent spellings are fine (p95.0 is accepted and comes back as p95), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to app.run.duration_ms, cannot be a ratio, and cannot carry label, project_env_id or dims.deployment_id — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over avg for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows. Two different project fields, gated separately. Top-level project_id is ownership — who may see and edit the alarm afterwards — and setting it requires projects.alarms.manage on that project, while leaving it out makes an org-level alarm and requires alarms.manage. dims.project_id only narrows which metric bins are read, but it still exposes that project\u0026#x27;s numbers through the alarm\u0026#x27;s notifications, so it requires projects.alarms.read on the project it names.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://timbaltechsl.mintlify.app/_mintlify/api/og/v2?division=Alarms\u0026amp;title=Create+Alarm\u0026amp;description=Create+a+metric+alarm+with+a+threshold+over+evaluation+periods.%0A%0ASet+%60denominator_metric_name%60+for+a+**rate**+rather+than+a+count%3A+the+datapoint+becomes+%60metric\u0026amp;theme=259c386eb829de58cc6638f3\u0026amp;signature=74d7d0bfde11213258c90ec28621d42339fc75da330adf5f65161466ef2e60cf\">\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/timbaltechsl/HA5uMpfE6Se4k3W2/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Timbal\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#000000\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.timbal.ai/api-reference/alarms/create\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/alarms/create.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.timbal.ai/#organization\",\"name\":\"Timbal\",\"url\":\"https://docs.timbal.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/timbaltechsl/pt3LfpScmY2Go19A/logo/light-small-1.svg?fit=max\u0026auto=format\u0026n=pt3LfpScmY2Go19A\u0026q=85\u0026s=fd26b0ce39e9e46d6dd08d81b611a9ea\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.timbal.ai#website\",\"name\":\"Timbal\",\"url\":\"https://docs.timbal.ai\",\"publisher\":{\"@id\":\"https://docs.timbal.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.timbal.ai/api-reference/alarms/create#webpage\",\"url\":\"https://docs.timbal.ai/api-reference/alarms/create\",\"name\":\"Create Alarm\",\"description\":\"Create a metric alarm with a threshold over evaluation periods. Set denominator_metric_name for a rate rather than a count: the datapoint becomes metric_name / denominator_metric_name and threshold reads as a fraction (0.05 = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with min_sample_count so a single failure in a quiet minute isn't a 100% error rate. Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means app.run.terminal_count — runs that finished in the period — and not app.run.count, which counts runs that started and includes ones still running. Mismatched pairs are rejected. Ratio alarms also require stat sum or count. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — avg would divide two means and min/max would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn't a rate. A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: clear_threshold (fire high, clear low) for continuous series like rates and latencies; datapoints_to_alarm for spiky ones that cross the line briefly; and missing_data: \\\"ignore\\\" for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery. Use GET /orgs/{org_id}/metrics/catalog to see which metric names and labels this org is actually emitting. Two metrics won't be listed until you alarm on them: org.credits.usage_pct (percent of the billing period's prepaid budget consumed) and org.credits.remaining (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate's and too heavy to run speculatively. Both are levels sampled once a minute, so use max, avg or min — sum would add one reading per minute in the period and is rejected. org.credits.remaining goes negative under overage. Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn volume rather than budget position, alarm on org.credits.spend with sum — that one carries project_id and workforce_id dims, so it can scope to a single project or workforce the way a budget can't. For latency, stat accepts any percentile from p0.1 to p99.9, in tenths. Equivalent spellings are fine (p95.0 is accepted and comes back as p95), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to app.run.duration_ms, cannot be a ratio, and cannot carry label, project_env_id or dims.deployment_id — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over avg for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows. Two different project fields, gated separately. Top-level project_id is ownership — who may see and edit the alarm afterwards — and setting it requires projects.alarms.manage on that project, while leaving it out makes an org-level alarm and requires alarms.manage. dims.project_id only narrows which metric bins are read, but it still exposes that project's numbers through the alarm's notifications, so it requires projects.alarms.read on the project it names.\",\"dateModified\":\"2026-07-28T10:40:38.555Z\",\"isPartOf\":{\"@id\":\"https://docs.timbal.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.timbal.ai/api-reference/alarms/create#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.timbal.ai/api-reference/alarms/create#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Alarms\",\"item\":\"https://docs.timbal.ai/api-reference/alarms/list\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create Alarm\",\"item\":\"https://docs.timbal.ai/api-reference/alarms/create\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.timbal.ai/api-reference/alarms/create#apireference\",\"headline\":\"Create Alarm\",\"name\":\"Create Alarm\",\"description\":\"Create a metric alarm with a threshold over evaluation periods. Set denominator_metric_name for a rate rather than a count: the datapoint becomes metric_name / denominator_metric_name and threshold reads as a fraction (0.05 = 5%). Prefer this for anything that scales with traffic — a fixed error count pages at 3am once the org grows. Pair it with min_sample_count so a single failure in a quiet minute isn't a 100% error rate. Both series must be binned on the same clock, since they are divided period by period. For outcome rates that means app.run.terminal_count — runs that finished in the period — and not app.run.count, which counts runs that started and includes ones still running. Mismatched pairs are rejected. Ratio alarms also require stat sum or count. The stat is applied to each series and the two results divided, so only stats that add up across the minutes in a period come out as a rate — avg would divide two means and min/max would take their extremes from different minutes. Other stats are rejected rather than silently producing a number that isn't a rate. A sustained incident only ever notifies once, so repeat messages mean the alarm is flapping. Three levers fix that, and which one depends on the metric: clear_threshold (fire high, clear low) for continuous series like rates and latencies; datapoints_to_alarm for spiky ones that cross the line briefly; and missing_data: \\\"ignore\\\" for sparse ones, where a minute with no traffic is absence of evidence rather than a recovery. Use GET /orgs/{org_id}/metrics/catalog to see which metric names and labels this org is actually emitting. Two metrics won't be listed until you alarm on them: org.credits.usage_pct (percent of the billing period's prepaid budget consumed) and org.credits.remaining (credits left in it) are only sampled for orgs that have an enabled alarm on one, since the underlying read is the billing gate's and too heavy to run speculatively. Both are levels sampled once a minute, so use max, avg or min — sum would add one reading per minute in the period and is rejected. org.credits.remaining goes negative under overage. Percent and headroom are worth having separately: 95% of a large budget can still be thousands of credits, while 50% of a small one is one bad afternoon. For burn volume rather than budget position, alarm on org.credits.spend with sum — that one carries project_id and workforce_id dims, so it can scope to a single project or workforce the way a budget can't. For latency, stat accepts any percentile from p0.1 to p99.9, in tenths. Equivalent spellings are fine (p95.0 is accepted and comes back as p95), but anything finer than a tenth is rejected rather than rounded, so an alarm never silently watches a different point than the one you asked for. These are exact, computed over the individual run durations rather than interpolated from bins, which is also why they are limited to app.run.duration_ms, cannot be a ratio, and cannot carry label, project_env_id or dims.deployment_id — a run row has no such column, so those filters would silently widen the alarm to everything. Prefer a high percentile over avg for latency: an average hides the tail that users actually notice, and hides it harder as traffic grows. Two different project fields, gated separately. Top-level project_id is ownership — who may see and edit the alarm afterwards — and setting it requires projects.alarms.manage on that project, while leaving it out makes an org-level alarm and requires alarms.manage. dims.project_id only narrows which metric bins are read, but it still exposes that project's numbers through the alarm's notifications, so it requires projects.alarms.read on the project it names.\",\"url\":\"https://docs.timbal.ai/api-reference/alarms/create\",\"mainEntityOfPage\":{\"@id\":\"https://docs.timbal.ai/api-reference/alarms/create#webpage\"},\"dateModified\":\"2026-07-28T10:40:38.555Z\",\"publisher\":{\"@id\":\"https://docs.timbal.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.timbal.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Timbal\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Timbal","nav":{"global":null,"tabs":[{"tab":"Docs","pages":[{"title":"Docs","href":""}]},{"tab":"Examples","pages":[{"title":"Examples","href":"/examples"}]},{"tab":"API Reference","groups":[{"group":"API Documentation","pages":[{"title":"Introduction","href":"/api-reference/introduction"},{"title":"Authentication","href":"/api-reference/authentication"},{"title":"Errors","href":"/api-reference/errors"},{"title":"Pagination","href":"/api-reference/pagination"},{"title":"Upload file (temporary)","openapi":"POST /files","href":"/api-reference/files/upload"}]},{"group":"Me","pages":[{"title":"List Organizations","openapi":"GET /me/orgs","href":"/api-reference/me/list-orgs"},{"title":"Update Profile","openapi":"PATCH /me","href":"/api-reference/me/update"},{"group":"Profile Photo","pages":[{"title":"Upload Profile Photo","openapi":"PUT /me/photo","href":"/api-reference/me/photo/upload"},{"title":"Delete Profile Photo","openapi":"DELETE /me/photo","href":"/api-reference/me/photo/delete"}]},{"group":"API Tokens","pages":[{"title":"List API Tokens","openapi":"GET /me/tokens","href":"/api-reference/me/tokens/list"},{"title":"Create API Token","openapi":"POST /me/tokens","href":"/api-reference/me/tokens/create"},{"title":"Revoke API Token","openapi":"DELETE /me/tokens/{token_id}","href":"/api-reference/me/tokens/revoke"}]}]},{"group":"Organizations","pages":[{"title":"Create Organization","openapi":"POST /orgs","href":"/api-reference/orgs/create"},{"title":"Get Organization","openapi":"GET /orgs/{org_id}","href":"/api-reference/orgs/get"},{"title":"Update Organization","openapi":"PATCH /orgs/{org_id}","href":"/api-reference/orgs/update"},{"title":"List Account Contacts","openapi":"GET /orgs/{org_id}/contacts","href":"/api-reference/orgs/contacts/list"},{"title":"List Embedding Models","openapi":"GET /orgs/{org_id}/embedding-models","href":"/api-reference/orgs/embedding-models/list"},{"group":"Analytics","pages":[{"title":"Org Analytics — Costs","openapi":"GET /orgs/{org_id}/analytics/costs","href":"/api-reference/orgs/analytics/costs"},{"title":"Org Analytics — Usage","openapi":"GET /orgs/{org_id}/analytics/usage","href":"/api-reference/orgs/analytics/usage"},{"title":"Org Analytics — Users","openapi":"GET /orgs/{org_id}/analytics/users","href":"/api-reference/orgs/analytics/users"}]},{"group":"Billing","pages":[{"title":"Get Overage Summary","openapi":"GET /orgs/{org_id}/billing/overage","href":"/api-reference/orgs/billing/overage-summary"},{"title":"Update Overage Billing","openapi":"POST /orgs/{org_id}/billing/overage","href":"/api-reference/orgs/billing/overage"},{"title":"Get Credit Budgets","openapi":"GET /orgs/{org_id}/billing/budgets","href":"/api-reference/orgs/billing/budgets/get"},{"title":"Replace Credit Budgets","openapi":"PUT /orgs/{org_id}/billing/budgets","href":"/api-reference/orgs/billing/budgets/replace"},{"title":"Patch Credit Budgets","openapi":"PATCH /orgs/{org_id}/billing/budgets","href":"/api-reference/orgs/billing/budgets/patch"},{"title":"Get Compute Billing","openapi":"GET /orgs/{org_id}/billing/compute","href":"/api-reference/orgs/billing/compute/get"},{"title":"Set Compute Billing","openapi":"PUT /orgs/{org_id}/billing/compute","href":"/api-reference/orgs/billing/compute/put"}]},{"group":"Content","pages":[{"title":"Sign Content URL","openapi":"POST /orgs/{org_id}/content/sign","href":"/api-reference/orgs/content/sign"}]},{"group":"Organization Logo","pages":[{"title":"Upload Organization Logo","openapi":"PUT /orgs/{org_id}/photo","href":"/api-reference/orgs/photo/upload"},{"title":"Delete Organization Logo","openapi":"DELETE /orgs/{org_id}/photo","href":"/api-reference/orgs/photo/delete"}]},{"group":"Credit Grants","pages":[{"title":"List Credit Grants","openapi":"GET /orgs/{org_id}/credit-grants","href":"/api-reference/orgs/credit-grants/list"}]},{"group":"Model Policies","pages":[{"title":"List Model Policies","openapi":"GET /orgs/{org_id}/models/policies","href":"/api-reference/orgs/models/policies/list"},{"title":"Create Model Policy","openapi":"POST /orgs/{org_id}/models/policies","href":"/api-reference/orgs/models/policies/create"},{"title":"Delete Model Policy","openapi":"DELETE /orgs/{org_id}/models/policies/{policy_id}","href":"/api-reference/orgs/models/policies/delete"}]},{"group":"Templates","pages":[{"title":"List Templates","openapi":"GET /orgs/{org_id}/templates","href":"/api-reference/orgs/templates/list"}]},{"group":"Domains","pages":[{"title":"List Domains","openapi":"GET /orgs/{org_id}/domains","href":"/api-reference/orgs/domains/list"},{"title":"Create Domain","openapi":"POST /orgs/{org_id}/domains","href":"/api-reference/orgs/domains/create"},{"title":"Get Domain","openapi":"GET /orgs/{org_id}/domains/{domain_id}","href":"/api-reference/orgs/domains/get"},{"title":"Delete Domain","openapi":"DELETE /orgs/{org_id}/domains/{domain_id}","href":"/api-reference/orgs/domains/delete"}]},{"group":"IAM","pages":[{"title":"List IAM Actions","openapi":"GET /orgs/{org_id}/iam/actions","href":"/api-reference/orgs/iam/actions/list"},{"title":"List Users by Action","openapi":"GET /orgs/{org_id}/iam/actions/{action}/users","href":"/api-reference/orgs/iam/actions/users"},{"title":"List Users by Resource","openapi":"GET /orgs/{org_id}/iam/resources/{resource}/users","href":"/api-reference/orgs/iam/resources/users"},{"title":"Check IAM Permissions","openapi":"POST /orgs/{org_id}/iam/check","href":"/api-reference/orgs/iam/check"},{"group":"Roles","pages":[{"title":"List Organization Roles","openapi":"GET /orgs/{org_id}/iam/roles","href":"/api-reference/orgs/roles/list"},{"title":"Create Organization Role","openapi":"POST /orgs/{org_id}/iam/roles","href":"/api-reference/orgs/roles/create"},{"title":"Get Organization Role","openapi":"GET /orgs/{org_id}/iam/roles/{role_id}","href":"/api-reference/orgs/roles/get"},{"title":"Update Organization Role","openapi":"PATCH /orgs/{org_id}/iam/roles/{role_id}","href":"/api-reference/orgs/roles/update"},{"title":"Delete Organization Role","openapi":"DELETE /orgs/{org_id}/iam/roles/{role_id}","href":"/api-reference/orgs/roles/delete"}]},{"group":"Users","pages":[{"title":"List Users","openapi":"GET /orgs/{org_id}/iam/users","href":"/api-reference/orgs/users/list"},{"title":"Add User","openapi":"POST /orgs/{org_id}/iam/users","href":"/api-reference/orgs/users/add"},{"title":"Remove User","openapi":"DELETE /orgs/{org_id}/iam/users","href":"/api-reference/orgs/users/delete"},{"title":"Update User Roles","openapi":"PUT /orgs/{org_id}/iam/users/{user_id}/roles","href":"/api-reference/orgs/users/update"},{"title":"Batch Update User Roles","openapi":"PUT /orgs/{org_id}/iam/users/roles","href":"/api-reference/orgs/iam/users/batch-roles"},{"title":"Get User Effective Grants","openapi":"GET /orgs/{org_id}/iam/users/{user_id}/effective-grants","href":"/api-reference/orgs/iam/users/effective-grants"}]}]},{"group":"Identity Providers","pages":[{"title":"List Identity Providers","openapi":"GET /orgs/{org_id}/identity-providers","href":"/api-reference/orgs/identity-providers/list"},{"title":"Create Identity Provider","openapi":"POST /orgs/{org_id}/identity-providers","href":"/api-reference/orgs/identity-providers/create"},{"title":"Get a single SSO connection (secret masked)","openapi":"GET /orgs/{org_id}/identity-providers/{provider_id}","href":"/api-reference/orgs/identity-providers/get"},{"title":"Update Identity Provider","openapi":"PATCH /orgs/{org_id}/identity-providers/{provider_id}","href":"/api-reference/orgs/identity-providers/update"},{"title":"Delete an SSO connection (cascades to its group mappings)","openapi":"DELETE /orgs/{org_id}/identity-providers/{provider_id}","href":"/api-reference/orgs/identity-providers/delete"},{"title":"Default Role","openapi":"PUT /orgs/{org_id}/identity-providers/{provider_id}/default-role","href":"/api-reference/orgs/identity-providers/default-role"},{"title":"List external-group to role mappings for a connection","openapi":"GET /orgs/{org_id}/identity-providers/{provider_id}/group-mappings","href":"/api-reference/orgs/identity-providers/group-mappings/list"},{"title":"Map an external IdP group to a role for this connection","openapi":"POST /orgs/{org_id}/identity-providers/{provider_id}/group-mappings","href":"/api-reference/orgs/identity-providers/group-mappings/create"},{"title":"Delete a group-to-role mapping","openapi":"DELETE /orgs/{org_id}/identity-providers/{provider_id}/group-mappings/{mapping_id}","href":"/api-reference/orgs/identity-providers/group-mappings/delete"}]},{"group":"SCIM","pages":[{"title":"List SCIM Tokens","openapi":"GET /orgs/{org_id}/scim-tokens","href":"/api-reference/orgs/scim-tokens/list"},{"title":"Create SCIM Token","openapi":"POST /orgs/{org_id}/scim-tokens","href":"/api-reference/orgs/scim-tokens/create"},{"title":"Revoke SCIM Token","openapi":"DELETE /orgs/{org_id}/scim-tokens/{token_id}","href":"/api-reference/orgs/scim-tokens/revoke"}]}]},{"group":"Projects","pages":[{"title":"List Projects","openapi":"GET /orgs/{org_id}/projects","href":"/api-reference/projects/list"},{"title":"Create Project","openapi":"POST /orgs/{org_id}/projects","href":"/api-reference/projects/create"},{"title":"Get Project","openapi":"GET /orgs/{org_id}/projects/{project_id}","href":"/api-reference/projects/get"},{"title":"Update Project","openapi":"PATCH /orgs/{org_id}/projects/{project_id}","href":"/api-reference/projects/update"},{"title":"Delete Project","openapi":"DELETE /orgs/{org_id}/projects/{project_id}","href":"/api-reference/projects/delete"},{"title":"Duplicate Project","openapi":"POST /orgs/{org_id}/projects/{project_id}/duplicate","href":"/api-reference/projects/duplicate"},{"title":"Link Knowledge Base","openapi":"PUT /orgs/{org_id}/projects/{project_id}/k2","href":"/api-reference/projects/link-knowledge-base"},{"title":"Unlink Knowledge Base","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/k2","href":"/api-reference/projects/unlink-knowledge-base"},{"group":"App Auth","pages":[{"title":"Get App Auth Settings","openapi":"GET /orgs/{org_id}/projects/{project_id}/auth","href":"/api-reference/projects/auth/get"},{"title":"Update App Auth Settings","openapi":"PATCH /orgs/{org_id}/projects/{project_id}/auth","href":"/api-reference/projects/auth/update"},{"title":"Update Auth Provider","openapi":"PUT /orgs/{org_id}/projects/{project_id}/auth/providers/{provider}","href":"/api-reference/projects/auth/providers/update"}]},{"group":"Analytics","pages":[{"title":"Cost Analytics","openapi":"GET /orgs/{org_id}/projects/{project_id}/analytics/credits","href":"/api-reference/projects/analytics/credits"},{"title":"Usage Analytics","sidebarTitle":"General Analytics","openapi":"GET /orgs/{org_id}/projects/{project_id}/analytics/usage","href":"/api-reference/projects/analytics/usage"},{"title":"User Analytics","openapi":"GET /orgs/{org_id}/projects/{project_id}/analytics/users","href":"/api-reference/projects/analytics/users"}]},{"group":"Environments","pages":[{"title":"List Environments","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs","href":"/api-reference/projects/environments/list"},{"title":"Create Environment","openapi":"POST /orgs/{org_id}/projects/{project_id}/envs","href":"/api-reference/projects/environments/create"},{"title":"Delete Environment","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/envs/{env_id}","href":"/api-reference/projects/environments/delete"},{"title":"Update Branch","openapi":"PATCH /orgs/{org_id}/projects/{project_id}/envs/{env_id}/branch","href":"/api-reference/projects/environments/update-branch"},{"title":"Update Config","openapi":"PATCH /orgs/{org_id}/projects/{project_id}/envs/{env_id}/config","href":"/api-reference/projects/environments/update-config"},{"title":"Deploy","openapi":"POST /orgs/{org_id}/projects/{project_id}/envs/{env_id}/deploy","href":"/api-reference/projects/environments/deploy"},{"title":"Update Domain","openapi":"PATCH /orgs/{org_id}/projects/{project_id}/envs/{env_id}/domain","href":"/api-reference/projects/environments/update-domain"},{"title":"Get Metrics","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/metrics/{metric_type}","href":"/api-reference/projects/environments/get-metrics"},{"title":"Stop","openapi":"POST /orgs/{org_id}/projects/{project_id}/envs/{env_id}/stop","href":"/api-reference/projects/environments/stop"},{"title":"List Environment Deployments","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/deployments","href":"/api-reference/projects/environments/deployments/list"},{"title":"Get Environment Logs","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/logs","href":"/api-reference/projects/environments/logs"}]},{"group":"Runs","pages":[{"title":"List Runs","openapi":"GET /orgs/{org_id}/projects/{project_id}/runs","href":"/api-reference/projects/runs/list"},{"title":"Get Run","openapi":"GET /orgs/{org_id}/projects/{project_id}/runs/{run_id}","href":"/api-reference/projects/runs/get"},{"title":"List Reactions","openapi":"GET /orgs/{org_id}/projects/{project_id}/runs/{run_id}/reactions","href":"/api-reference/projects/runs/reactions-list"},{"title":"Add Reaction","openapi":"POST /orgs/{org_id}/projects/{project_id}/runs/{run_id}/reactions","href":"/api-reference/projects/runs/reactions-add"}]},{"group":"Variables","pages":[{"title":"List Variables","openapi":"GET /orgs/{org_id}/projects/{project_id}/vars","href":"/api-reference/projects/vars/list"},{"title":"Create Variable","openapi":"POST /orgs/{org_id}/projects/{project_id}/vars","href":"/api-reference/projects/vars/create"},{"title":"Batch Create Variables","openapi":"POST /orgs/{org_id}/projects/{project_id}/vars/batch","href":"/api-reference/projects/vars/batch-create"},{"title":"Get Variable","openapi":"GET /orgs/{org_id}/projects/{project_id}/vars/{var_id}","href":"/api-reference/projects/vars/get"},{"title":"Delete Variable","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/vars/{var_id}","href":"/api-reference/projects/vars/delete"},{"title":"Update Variable","openapi":"PATCH /orgs/{org_id}/projects/{project_id}/vars/{var_id}","href":"/api-reference/projects/vars/update"}]},{"group":"Channels","pages":[{"title":"Upsert Channel","openapi":"PUT /orgs/{org_id}/projects/{project_id}/channels/{workforce}/{provider}","href":"/api-reference/projects/channels/put"},{"title":"Delete Channel","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/channels/{workforce}/{provider}","href":"/api-reference/projects/channels/delete"}]},{"group":"Workforce","pages":[{"title":"List Workforce","openapi":"GET /orgs/{org_id}/projects/{project_id}/workforce","href":"/api-reference/projects/workforce/list"},{"title":"Create Workforce","openapi":"POST /orgs/{org_id}/projects/{project_id}/workforce","href":"/api-reference/projects/workforce/create"},{"title":"Delete Workforce","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/workforce","href":"/api-reference/projects/workforce/delete"},{"title":"Call Workforce","openapi":"POST /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/{*path}","href":"/api-reference/projects/workforce/call"},{"title":"Call Workforce (GET)","openapi":"GET /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/{*path}","href":"/api-reference/projects/workforce/call-get"},{"title":"Call Workforce (PUT)","openapi":"PUT /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/{*path}","href":"/api-reference/projects/workforce/call-put"},{"title":"Call Workforce (PATCH)","openapi":"PATCH /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/{*path}","href":"/api-reference/projects/workforce/call-patch"},{"title":"Call Workforce (DELETE)","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/{*path}","href":"/api-reference/projects/workforce/call-delete"}]}]},{"group":"Knowledge Bases","pages":[{"title":"List Knowledge Bases","openapi":"GET /orgs/{org_id}/k2","href":"/api-reference/knowledge-bases/list"},{"title":"Create Knowledge Base","openapi":"POST /orgs/{org_id}/k2","href":"/api-reference/knowledge-bases/create"},{"title":"Get Knowledge Base","openapi":"GET /orgs/{org_id}/k2/{kb_id}","href":"/api-reference/knowledge-bases/get"},{"title":"Edit Knowledge Base","openapi":"PATCH /orgs/{org_id}/k2/{kb_id}","href":"/api-reference/knowledge-bases/update"},{"title":"Delete Knowledge Base","openapi":"DELETE /orgs/{org_id}/k2/{kb_id}","href":"/api-reference/knowledge-bases/delete"},{"title":"Query","openapi":"POST /orgs/{org_id}/k2/{kb_id}/query","href":"/api-reference/knowledge-bases/query"},{"title":"Get Schema","openapi":"GET /orgs/{org_id}/k2/{kb_id}/schema","href":"/api-reference/knowledge-bases/schema"},{"title":"Upload Data","openapi":"POST /orgs/{org_id}/k2/{kb_id}/upload","href":"/api-reference/knowledge-bases/upload"},{"group":"Policies","pages":[{"title":"List Policies","openapi":"GET /orgs/{org_id}/k2/{kb_id}/policies","href":"/api-reference/knowledge-bases/policies/list"},{"title":"Create Policy","openapi":"POST /orgs/{org_id}/k2/{kb_id}/policies","href":"/api-reference/knowledge-bases/policies/create"},{"title":"Get Policy","openapi":"GET /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}","href":"/api-reference/knowledge-bases/policies/get"},{"title":"Update Policy","openapi":"PATCH /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}","href":"/api-reference/knowledge-bases/policies/update"},{"title":"Delete Policy","openapi":"DELETE /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}","href":"/api-reference/knowledge-bases/policies/delete"},{"title":"Set Governance Mode","openapi":"PUT /orgs/{org_id}/k2/{kb_id}/policies/governance-mode","href":"/api-reference/knowledge-bases/policies/governance-mode"},{"group":"Assignments","pages":[{"title":"List Policy Assignments","openapi":"GET /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}/assignments","href":"/api-reference/knowledge-bases/policies/assignments/list"},{"title":"Create Policy Assignment","openapi":"POST /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}/assignments","href":"/api-reference/knowledge-bases/policies/assignments/create"},{"title":"Get Policy Assignment","openapi":"GET /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}/assignments/{assignment_id}","href":"/api-reference/knowledge-bases/policies/assignments/get"},{"title":"Delete Policy Assignment","openapi":"DELETE /orgs/{org_id}/k2/{kb_id}/policies/{policy_id}/assignments/{assignment_id}","href":"/api-reference/knowledge-bases/policies/assignments/delete"}]}]},{"group":"Backups","pages":[{"title":"List Backups","openapi":"GET /orgs/{org_id}/k2/{kb_id}/backups","href":"/api-reference/knowledge-bases/backups/list"},{"title":"Create Backup","openapi":"POST /orgs/{org_id}/k2/{kb_id}/backups","href":"/api-reference/knowledge-bases/backups/create"},{"title":"Get Backup","openapi":"GET /orgs/{org_id}/k2/{kb_id}/backups/{backup_id}","href":"/api-reference/knowledge-bases/backups/get"},{"title":"List Restores","openapi":"GET /orgs/{org_id}/k2/{kb_id}/restores","href":"/api-reference/knowledge-bases/restores/list"},{"title":"Restore","openapi":"POST /orgs/{org_id}/k2/{kb_id}/restores","href":"/api-reference/knowledge-bases/restores/create"},{"title":"Get Restore","openapi":"GET /orgs/{org_id}/k2/{kb_id}/restores/{restore_id}","href":"/api-reference/knowledge-bases/restores/get"}]},{"group":"Files","pages":[{"title":"List Files","openapi":"GET /orgs/{org_id}/k2/{kb_id}/files","href":"/api-reference/knowledge-bases/files/list"},{"title":"Add File","openapi":"POST /orgs/{org_id}/k2/{kb_id}/files","href":"/api-reference/knowledge-bases/files/add"},{"title":"Create Directory","openapi":"POST /orgs/{org_id}/k2/{kb_id}/directories","href":"/api-reference/knowledge-bases/files/create-dir"},{"title":"Get File","openapi":"GET /orgs/{org_id}/k2/{kb_id}/files/{file_id}","href":"/api-reference/knowledge-bases/files/get"},{"title":"Delete File","openapi":"DELETE /orgs/{org_id}/k2/{kb_id}/files/{file_id}","href":"/api-reference/knowledge-bases/files/delete"},{"group":"Chunks","pages":[{"title":"List Chunks","openapi":"GET /orgs/{org_id}/k2/{kb_id}/files/{file_id}/chunks","href":"/api-reference/knowledge-bases/files/chunks/list"},{"title":"Insert Chunk","openapi":"POST /orgs/{org_id}/k2/{kb_id}/files/{file_id}/chunks","href":"/api-reference/knowledge-bases/files/chunks/insert"},{"title":"Get Chunk","openapi":"GET /orgs/{org_id}/k2/{kb_id}/files/{file_id}/chunks/{chunk_uid}","href":"/api-reference/knowledge-bases/files/chunks/get"},{"title":"Update Chunk","openapi":"PATCH /orgs/{org_id}/k2/{kb_id}/files/{file_id}/chunks/{chunk_uid}","href":"/api-reference/knowledge-bases/files/chunks/update"},{"title":"Delete Chunk","openapi":"DELETE /orgs/{org_id}/k2/{kb_id}/files/{file_id}/chunks/{chunk_uid}","href":"/api-reference/knowledge-bases/files/chunks/delete"}]}]}]},{"group":"Evals","pages":[{"title":"List Eval Definitions","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/definitions","href":"/api-reference/evals/definitions"},{"group":"Jobs","pages":[{"title":"List Eval Jobs","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/jobs","href":"/api-reference/evals/jobs/list"},{"title":"Get Eval Job","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/jobs/{job_uid}","href":"/api-reference/evals/jobs/get"},{"title":"Create Eval Job","openapi":"POST /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/jobs","href":"/api-reference/evals/jobs/create"}]},{"group":"Runs","pages":[{"title":"List Eval Runs","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs","href":"/api-reference/evals/runs/list"},{"title":"Get Eval Run","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}","href":"/api-reference/evals/runs/get"},{"title":"Stream Eval Run Events","openapi":"GET /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}/events","href":"/api-reference/evals/runs/events"},{"title":"Create Eval Run","openapi":"POST /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs","href":"/api-reference/evals/runs/create"},{"title":"Delete Eval Run","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/envs/{env_id}/evals/runs/{eval_run_id}","href":"/api-reference/evals/runs/delete"}]}]},{"group":"ACE","tag":"Pro","pages":[{"title":"Create from Agent","openapi":"POST /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/ace","href":"/api-reference/ace/create-from-workforce"},{"title":"Link to Agent","openapi":"PUT /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/ace","href":"/api-reference/ace/link"},{"title":"Unlink from Agent","openapi":"DELETE /orgs/{org_id}/projects/{project_id}/workforce/{workforce}/ace","href":"/api-reference/ace/unlink"},{"title":"List Policies","openapi":"GET /ace/{ace_uid}/policies","href":"/api-reference/ace/list-policies"},{"title":"List Context Variables","openapi":"GET /ace/{ace_uid}/vars","href":"/api-reference/ace/list-context-vars"},{"title":"Chat Completions","openapi":"POST /ace/{ace_uid}/v1/chat/completions","href":"/api-reference/ace/chat-completions"},{"group":"Jobs","pages":[{"title":"List Jobs","openapi":"GET /ace/{ace_uid}/jobs","href":"/api-reference/ace/jobs/list"},{"title":"Enqueue Job","openapi":"POST /ace/{ace_uid}/jobs","href":"/api-reference/ace/jobs/create"},{"title":"Get Job","openapi":"GET /ace/{ace_uid}/jobs/{job_uid}","href":"/api-reference/ace/jobs/get"},{"title":"Cancel Job","openapi":"POST /ace/{ace_uid}/jobs/{job_uid}/cancel","href":"/api-reference/ace/jobs/cancel"},{"title":"Retry Job","openapi":"POST /ace/{ace_uid}/jobs/{job_uid}/retry","href":"/api-reference/ace/jobs/retry"}]}]},{"group":"Alarms","pages":[{"title":"List Alarms","openapi":"GET /orgs/{org_id}/alarms","description":"The metric alarms you can see in this org, with current state and channels.\n\nFiltered per alarm, not per request: org-level alarms (credits, org-wide spend) need `alarms.read`, and an alarm tagged to a project needs `projects.alarms.read` on that project. Holding one and not the other returns the matching subset rather than a `403`, so a role scoped to a single project sees exactly that project's alarms.","href":"/api-reference/alarms/list"},{"title":"Create Alarm","openapi":"POST /orgs/{org_id}/alarms","href":"/api-reference/alarms/create"},{"title":"Get Alarm","openapi":"GET /orgs/{org_id}/alarms/{alarm_id}","description":"One alarm's configuration, current state and linked channels.\n\nSame shape as an entry in `GET /orgs/{org_id}/alarms`, for refreshing a detail view without refetching the whole list.\n\nNeeds `alarms.read` for an org-level alarm, or `projects.alarms.read` on the owning project for a project alarm.","href":"/api-reference/alarms/get"},{"title":"Update Alarm","openapi":"PATCH /orgs/{org_id}/alarms/{alarm_id}","href":"/api-reference/alarms/update"},{"title":"Delete Alarm","openapi":"DELETE /orgs/{org_id}/alarms/{alarm_id}","href":"/api-reference/alarms/delete"},{"title":"Alarms Health","openapi":"GET /orgs/{org_id}/alarms/health","href":"/api-reference/alarms/health"},{"title":"Alarm History","openapi":"GET /orgs/{org_id}/alarms/{alarm_id}/history","href":"/api-reference/alarms/history"},{"title":"Attach Channel to Alarm","openapi":"POST /orgs/{org_id}/alarms/{alarm_id}/channels","href":"/api-reference/alarms/attach-channel"},{"title":"Detach Channel from Alarm","openapi":"DELETE /orgs/{org_id}/alarms/{alarm_id}/channels/{channel_id}","href":"/api-reference/alarms/detach-channel"},{"group":"Channels","pages":[{"title":"List Channels","openapi":"GET /orgs/{org_id}/channels","href":"/api-reference/alarms/channels/list"},{"title":"Create Channel","openapi":"POST /orgs/{org_id}/channels","href":"/api-reference/alarms/channels/create"},{"title":"Delete Channel","openapi":"DELETE /orgs/{org_id}/channels/{channel_id}","href":"/api-reference/alarms/channels/delete"}]},{"group":"Metrics","pages":[{"title":"Query Metric","openapi":"GET /orgs/{org_id}/metrics","href":"/api-reference/alarms/metrics/query"},{"title":"Metrics Catalog","openapi":"GET /orgs/{org_id}/metrics/catalog","href":"/api-reference/alarms/metrics/catalog"},{"group":"Definitions","pages":[{"title":"List Metric Definitions","openapi":"GET /orgs/{org_id}/metrics/definitions","href":"/api-reference/alarms/metrics/definitions/list"},{"title":"Create Metric Definition","openapi":"POST /orgs/{org_id}/metrics/definitions","href":"/api-reference/alarms/metrics/definitions/create"},{"title":"Preview Metric Definition","openapi":"POST /orgs/{org_id}/metrics/definitions/preview","href":"/api-reference/alarms/metrics/definitions/preview"},{"title":"Update Metric Definition","openapi":"PATCH /orgs/{org_id}/metrics/definitions/{definition_id}","href":"/api-reference/alarms/metrics/definitions/update"},{"title":"Delete Metric Definition","openapi":"DELETE /orgs/{org_id}/metrics/definitions/{definition_id}","href":"/api-reference/alarms/metrics/definitions/delete"}]}]}]},{"group":"Connectors","pages":[{"title":"List Connectors","openapi":"GET /orgs/{org_id}/connectors","href":"/api-reference/connectors/list"},{"title":"Get Connector","openapi":"GET /orgs/{org_id}/connectors/{connector_id}","href":"/api-reference/connectors/get"},{"title":"Update Connector","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/update","href":"/api-reference/connectors/update"},{"title":"Push Local Config","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/local-config","href":"/api-reference/connectors/local-config"},{"title":"Query Connector","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/query","href":"/api-reference/connectors/query"},{"title":"Rebind Connector","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/rebind","href":"/api-reference/connectors/rebind"},{"title":"Revoke Connector","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/revoke","href":"/api-reference/connectors/revoke"},{"title":"Copy Filesystem to Knowledge Base","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/filesystems/copy","href":"/api-reference/connectors/filesystems/copy"},{"group":"Enrollment Tokens","pages":[{"title":"Create Enrollment Token","openapi":"POST /orgs/{org_id}/connectors/enrollment-tokens","href":"/api-reference/connectors/enrollment-tokens/create"}]},{"group":"Jobs","pages":[{"title":"List Connector Jobs","openapi":"GET /orgs/{org_id}/connectors/jobs","href":"/api-reference/connectors/jobs/list"},{"title":"Create Connector Job","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/jobs","href":"/api-reference/connectors/jobs/create"},{"title":"Stop Connector Job","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/jobs/{job_id}/stop","href":"/api-reference/connectors/jobs/stop"}]},{"group":"Syncs","pages":[{"title":"List Connector Syncs","openapi":"GET /orgs/{org_id}/connectors/syncs","href":"/api-reference/connectors/syncs/list"},{"title":"Create Connector Sync","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/syncs","href":"/api-reference/connectors/syncs/create"},{"title":"Get Connector Sync","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/syncs/{sync_id}","href":"/api-reference/connectors/syncs/get"},{"title":"Update Connector Sync","openapi":"PATCH /orgs/{org_id}/connectors/{connector_id}/syncs/{sync_id}","href":"/api-reference/connectors/syncs/update"},{"title":"Delete Connector Sync","openapi":"DELETE /orgs/{org_id}/connectors/{connector_id}/syncs/{sync_id}","href":"/api-reference/connectors/syncs/delete"},{"title":"Run Sync Now","openapi":"POST /orgs/{org_id}/connectors/{connector_id}/syncs/{sync_id}/run","href":"/api-reference/connectors/syncs/run"}]},{"group":"Browse","pages":[{"title":"Browse Connections","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/connections","href":"/api-reference/connectors/browse/connections"},{"title":"Browse Tables","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/tables","href":"/api-reference/connectors/browse/tables"},{"title":"Browse Table","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/table","href":"/api-reference/connectors/browse/table"},{"title":"Browse Columns","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/columns","href":"/api-reference/connectors/browse/columns"},{"group":"Filesystems","pages":[{"title":"List Filesystems","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/filesystems","href":"/api-reference/connectors/browse/filesystems/list"},{"title":"List Filesystem Entries","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/filesystems/entries","href":"/api-reference/connectors/browse/filesystems/entries"},{"title":"Search Filesystem","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/filesystems/search","href":"/api-reference/connectors/browse/filesystems/search"},{"title":"Summarize Filesystem","openapi":"GET /orgs/{org_id}/connectors/{connector_id}/browse/filesystems/summary","href":"/api-reference/connectors/browse/filesystems/summary"}]}]}]}]},{"tab":"Model Reference","pages":[{"title":"Model Reference","href":"/models/overview"}]},{"tab":"MCP Integration","pages":[{"title":"MCP Integration","href":"/mcp-integration"}]}]},"title":"Create Alarm - Timbal","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}