{"openapi":"3.1.0","info":{"title":"Dash0 API","version":"1.0.0","description":"## Selecting a dataset\n\nEndpoints that operate on a single dataset take it from the `dataset` query parameter, or from the `Dash0-Dataset` request header when the query parameter is absent. When both are present the query parameter wins.\n\nIf neither is given, the request falls back to the organization's `default` dataset — a token that is restricted to specific datasets is rejected with `403 Forbidden` in that case, so always select a dataset explicitly when using a dataset-restricted token.\n\n## Request body size limit\n\nMost API endpoints enforce a maximum request body size of 256KB. Bulk\nendpoints accept a larger body size per request to accommodate batched\npayloads.\n\nRequests exceeding the applicable limit are rejected with a\n`413 Content Too Large` response.\n"},"servers":[{"url":"https://api.eu-west-1.aws.dash0.com","description":"API endpoint for AWS region EU (Ireland)"},{"url":"https://api.eu-central-1.aws.dash0.com","description":"API endpoint for AWS region EU (Germany)"},{"url":"https://api.us-west-2.aws.dash0.com","description":"API endpoint for AWS region US (Oregon)"},{"url":"https://api.europe-west4.gcp.dash0.com","description":"API endpoint for GCP region EU (Netherlands)"}],"tags":[{"name":"Query Telemetry"},{"name":"Query SQL"},{"name":"Prometheus API"},{"name":"Manage Alerting"},{"name":"Manage Dashboards"},{"name":"Manage Notification Channels"},{"name":"Manage Recording Rules"},{"name":"Manage Sampling Rules"},{"name":"Manage Operation Pattern Rules (Private BETA)"},{"name":"Manage SLOs (Private BETA)"},{"name":"Manage Spam Filters"},{"name":"Manage Time Series Aggregations (Private BETA)"},{"name":"Manage Synthetic Checks"},{"name":"Manage Views"},{"name":"Manage Teams and Members"},{"name":"OAuth 2.0"},{"name":"Manage Signal To Metrics (BETA)"},{"name":"Edge Collectors"},{"name":"Manage Agent0 Automations"}],"paths":{"/.well-known/oauth-authorization-server":{"get":{"summary":"OAuth 2.0 Authorization Server Metadata","description":"Returns the OAuth 2.0 Authorization Server Metadata document (RFC 8414).\nClients use this endpoint to discover authorization server capabilities\nand endpoint locations.\n","tags":["OAuth 2.0"],"responses":{"200":{"description":"Authorization server metadata document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthAuthorizationServerMetadata"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"summary":"OAuth 2.0 Protected Resource Metadata","description":"Returns the OAuth 2.0 Protected Resource Metadata document (RFC 9728).\nMCP clients use this endpoint to discover which authorization server(s)\ncan issue tokens accepted by this resource server.\n","tags":["OAuth 2.0"],"responses":{"200":{"description":"Protected resource metadata document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthProtectedResourceMetadata"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/agentic-workflows":{"get":{"summary":"List all automations for the organization","description":"Returns all automations configured for your organization.","tags":["Manage Agent0 Automations"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}},{"name":"folderPath","in":"query","description":"Filter by folder path (exact match on dash0.com/folder-path annotation).","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of automations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetAgenticWorkflowsResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new automation","description":"Create a new automation for your organization.","tags":["Manage Agent0 Automations"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenticWorkflowCreateRequest"}}}},"responses":{"200":{"description":"The created automation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenticWorkflowResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/agentic-workflows/{originOrId}":{"get":{"summary":"Get a specific automation by origin or ID","description":"Returns a specific automation identified by its origin label or UUID.","tags":["Manage Agent0 Automations"],"parameters":[{"name":"originOrId","in":"path","description":"Automation origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested automation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenticWorkflowResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or create an automation by origin or ID","description":"Updates an existing automation or creates a new one if it doesn't exist. Useful for Infrastructure-as-Code workflows.","tags":["Manage Agent0 Automations"],"parameters":[{"name":"originOrId","in":"path","description":"Automation origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenticWorkflowResponse"}}}},"responses":{"200":{"description":"The updated or created automation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenticWorkflowResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete an automation by origin or ID","description":"Deletes a specific automation identified by its origin label or UUID.","tags":["Manage Agent0 Automations"],"parameters":[{"name":"originOrId","in":"path","description":"Automation origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successfully deleted"},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/alerting/check-rules":{"get":{"summary":"Retrieve a list of check rule ids","tags":["Manage Alerting"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}},{"name":"idPrefix","in":"query","description":"If provided, only check rules for which the origin starts with the given string are returned. (deprecated)\n\nThe `originPrefix` query parameter takes precedence over this parameter if both are provided.\n","schema":{"type":"string"},"deprecated":true},{"name":"originPrefix","in":"query","description":"If provided, only check rules for which the origin starts with the given string are returned.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response in case the list of check rules could be retrieved.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusAlertRuleApiListItem"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new check rule","tags":["Manage Alerting"],"parameters":[{"name":"dataset","in":"query","description":"The associated dataset.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"responses":{"200":{"description":"Create a new check rule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/alerting/check-rules/bulk":{"post":{"summary":"Bulk create check rules","description":"Atomically create up to 1000 Prometheus alert rules in a single request.\nCreate-only — every item produces a brand-new check rule. The public\nschema uses `id` as the user-defined origin; per-item resolution\npriority mirrors the single-rule POST handler (id → server-generated\nUUID with \"api-\" prefix). Any item whose resolved origin or id\ncollides with an existing rule (including soft-deleted rules whose\norigin is still reserved by the unique constraint) is rejected with a\nper-item diagnostic.\n\nIf any item fails validation (PromQL, intervals, summary length,\ntemplate functions, origin/id collision, etc.) the whole batch is\nrejected with a 400 that carries per-item diagnostics in the message;\nnothing is written. On any DB failure the entire batch is rolled back\nand 500 is returned. The endpoint is not idempotent — a successful\nbatch retried verbatim will 400 on every item the second time.\n\nThis endpoint accepts request bodies up to 2 MB (vs. the 256 KB default\nfor other endpoints) to accommodate batched payloads of up to 1000\nrules per request.\n","tags":["Manage Alerting"],"parameters":[{"name":"dataset","in":"query","description":"The dataset to deploy rules into. Required to prevent accidental deployment to the wrong dataset.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRuleBulkCreateRequest"}}}},"responses":{"200":{"description":"All items were successfully created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRuleBulkCreateResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/alerting/check-rules/{originOrId}":{"get":{"summary":"Retrieve a specific check rule (Prometheus alert rule) by its origin or id","tags":["Manage Alerting"],"parameters":[{"name":"originOrId","in":"path","description":"Check rule origin or id","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successful response in case the check rule could be retrieved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or insert a specific check rule (Prometheus alert rule) by origin or id","tags":["Manage Alerting"],"parameters":[{"name":"originOrId","in":"path","description":"Check rule origin or id","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"responses":{"200":{"description":"Successful response in case the check rule was updated. The response contains the updated rule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific check rule (Prometheus alert rule) by origin or id","tags":["Manage Alerting"],"parameters":[{"name":"originOrId","in":"path","description":"Check rule origin or id","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successful response in case the check rule was deleted"},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dashboards":{"get":{"summary":"Receive a list of dashboards","description":"Receive a list of your organization dashboards","tags":["Manage Dashboards"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Receive a list of dashboards.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DashboardApiListItem"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a dashboard","description":"Create a dashboard.","tags":["Manage Dashboards"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"responses":{"200":{"description":"The created dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dashboards/{originOrId}":{"get":{"summary":"Receive a specific dashboard by its origin or id","description":"Receive a specific dashboard by its **origin** or **id**.","tags":["Manage Dashboards"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the dashboard.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Receive a specific dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or insert a specific dashboard by its origin or id","description":"Update or insert a specific dashboard by its **origin** or **id**. In case a dashboard with the given **origin** or **id** is found it will be updated. If there is no dashboard found a new dashboard will be created and the given `originOrId` is used as **origin**.","tags":["Manage Dashboards"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the dashboard.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"responses":{"200":{"description":"The updated or created dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific dashboard by its origin or id","description":"Delete a specific dashboard by its **origin** or **id**.","tags":["Manage Dashboards"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the dashboard.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The specific dashboard was deleted."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/edge/settings":{"get":{"summary":"Retrieve settings for the organization identified by the provided Dash0 auth token","description":"Returns the aggregate settings payload (dataset settings, signal-to-metrics rules,\ntelemetry transformation rules, observed patterns, etc.) for the organization that\nowns the provided bearer token. Designed for edge collectors running in customer\nenvironments that need their full configuration in one request.\n","tags":["Edge Collectors"],"responses":{"200":{"description":"Settings for the organization identified by the auth token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsPerOrganizationAndDatasetInfo"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/import/check-rule":{"post":{"summary":"Import a check rule","description":"This endpoint allows you **to import an existing check rule** into your organization. It's intended for one-time migrations rather than ongoing check rule management.\nUnlike the standard API, this endpoint supports importing check rules **with full editability**, allowing you to modify check rules that were previously created elsewhere.\n**Note:**\nThis endpoint is **not recommended for Infrastructure-as-Code (IaC)** workflows. Using it in IaC scenarios can cause configuration drift and inconsistencies between your source configuration and the imported check rule state.\nImporting a check rule without an id will create a new check rule and return the created asset with a generated id.\nImporting a check rule with an existing id (metadata>dash0Extensions>id) will override the corresponding check rule definition. In case there is no check rule with the given id a new check rule will be created.\n","tags":["Manage Alerting"],"parameters":[{"name":"dataset","in":"query","description":"The associated dataset.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"responses":{"200":{"description":"The imported check rule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/import/check-rules":{"post":{"summary":"Import multiple check rules in one batch","description":"Bulk variant of `/api/import/check-rule`. Atomically imports up to 1000\nPrometheus alert rules into your organization with **full editability**\n— the resulting rules behave like UI-created assets, not API-managed\nones, so they can be modified in the Dash0 UI afterwards. Intended for\none-time migrations rather than ongoing Infrastructure-as-Code\nmanagement.\n\nPer-item id/origin resolution mirrors the single-rule import handler:\nitems without an `id` receive a server-generated UUID; items with an\n`id` reuse it. Generated origins are **not** prefixed with `api-` and\nthe rules remain UI-editable.\n\nBehaves like the regular bulk endpoint in every other respect: items\nare validated up-front, the whole batch is rejected on any item\nfailure, nothing is written on rollback, and the endpoint is not\nidempotent. This endpoint accepts request bodies up to 2 MB (vs. the\n256 KB default for other endpoints) to accommodate batched payloads of\nup to 1000 rules per request.\n","tags":["Manage Alerting"],"parameters":[{"name":"dataset","in":"query","description":"The associated dataset.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRuleBulkCreateRequest"}}}},"responses":{"200":{"description":"All items were successfully imported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusAlertRuleBulkCreateResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/import/dashboard":{"post":{"summary":"Import a dashboard","description":"This endpoint allows you **to import an existing dashboard** into your organization. It's intended for one-time migrations rather than ongoing dashboard management.\nUnlike the standard API, this endpoint supports importing dashboards **with full editability**, allowing you to modify dashboards that were previously created elsewhere.\n**Note:**\nThis endpoint is **not recommended for Infrastructure-as-Code (IaC)** workflows. Using it in IaC scenarios can cause configuration drift and inconsistencies between your source configuration and the imported dashboard state.\nImporting a dashboard without an id will create a new dashboard and return the created asset with a generated id.\nImporting a dashboard with an existing id (metadata>dash0Extensions>id) will override the corresponding dashboard definition. In case there is no dashboard with the given id a new dashboard will be created.\n","tags":["Manage Dashboards"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"responses":{"200":{"description":"The imported dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/import/signal-to-metrics":{"put":{"summary":"Bulk upsert signal-to-metrics configs","description":"Atomically upserts up to 500 signal-to-metrics configurations at once. If any item\nfails validation or cannot be written, the entire batch is rejected and no\nconfigurations are changed.\n\nThis endpoint is designed for Infrastructure-as-Code (IaC) workflows (Terraform,\nthe operator, CLI scripts). Rules are matched by their `origin` values across\nrepeated invocations, making the operation idempotent.\n\nThis endpoint accepts request bodies up to 2 MB (vs. the 256 KB default for other\nendpoints) to accommodate batched payloads of up to 500 rules per request.\n","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"dataset","in":"query","description":"The dataset to deploy rules into. Required to prevent accidental deployment to the wrong dataset.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsBulkUpsertRequest"}}}},"responses":{"200":{"description":"All items were successfully upserted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsBulkUpsertResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/import/synthetic-check":{"post":{"summary":"Import a synthetic check","description":"This endpoint allows you **to import an existing synthetic check** into your organization. It's intended for one-time migrations rather than ongoing synthetic check management.\nUnlike the standard API, this endpoint supports importing synthetic checks **with full editability**, allowing you to modify synthetic checks that were previously created elsewhere.\n**Note:**\nThis endpoint is **not recommended for Infrastructure-as-Code (IaC)** workflows. Using it in IaC scenarios can cause configuration drift and inconsistencies between your source configuration and the imported synthetic check state.\nImporting a synthetic check without an id will create a new synthetic check and return the created asset with a generated id.\nImporting a synthetic check with an existing id (metadata>dash0Extensions>id) will override the corresponding synthetic check definition. In case there is no synthetic check with the given id a new dashboard will be created.\n","tags":["Manage Synthetic Checks"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"responses":{"200":{"description":"The imported synthetic check.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/import/view":{"post":{"summary":"Import a view","description":"This endpoint allows you **to import an existing view** into your organization. It's intended for one-time migrations rather than ongoing view management.\nUnlike the standard API, this endpoint supports importing views **with full editability**, allowing you to modify views that were previously created elsewhere.\n**Note:**\nThis endpoint is **not recommended for Infrastructure-as-Code (IaC)** workflows. Using it in IaC scenarios can cause configuration drift and inconsistencies between your source configuration and the imported view state.\nImporting a view without an id will create a new view and return the created asset with a generated id.\nImporting a view with an existing id (metadata>dash0Extensions>id) will override the corresponding view definition. In case there is no view with the given id a new view will be created.\n","tags":["Manage Views"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"responses":{"200":{"description":"The imported view.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/logs":{"post":{"summary":"Returns OTLP logs records","tags":["Query Telemetry"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetLogRecordsRequest"}}}},"responses":{"200":{"description":"Returns log records in OTLP format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetLogRecordsResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/logs/download":{"post":{"summary":"Download OTLP log records as a file","description":"Returns the log records matching the given query as a downloadable file in the\nrequested format (`txt`, `ndjson`, `yaml` or `csv`).\n\n**A single export is capped at 5000 log records.** A `limit` above that cap is\nrejected rather than silently clamped: the response is a client error naming the cap.\nWhen the query matches more than 5000 records, the export carries the first 5000 in\nresult-set order. Use the Dash0 CLI (`dash0 logs query`) to export larger volumes.\n\nThe records are the same ones `POST /api/logs` returns for the same query, except that\nadaptive sampling is always disabled for exports: an exported file is never a sample,\nwhatever the query and whatever the data volume.\n\nThe response is streamed as pages are retrieved and therefore carries no\n`Content-Length`. Because the response headers are committed before the first record\nis written, a failure partway through cannot be reported as a status code — it\nterminates the transfer instead. Clients MUST confirm the body was received completely\nbefore treating the download as a successful export.\n","tags":["Query Telemetry"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogRecordsDownloadRequest"}}}},"responses":{"200":{"description":"The exported log records. The body's actual content type matches the requested\nformat (`text/plain` for `txt`, `application/x-ndjson` for `ndjson`,\n`application/yaml` for `yaml`, `text/csv` for `csv`).\n","headers":{"Content-Type":{"schema":{"type":"string","example":"text/csv"}},"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"logs-2026-07-27T10-15-00Z.csv\""}}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request is invalid, for example a `limit` above the 5000-record cap or a time\nrange exceeding the maximum permitted query range. No partial file is produced.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - the requested dataset is not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/members":{"get":{"summary":"Receive a list of organization members","description":"Receive a list of all members in your organization.","tags":["Manage Teams and Members"],"responses":{"200":{"description":"Receive a list of members.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberDefinition"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Invite a member to the organization","description":"Sends an invitation to join the organization to the given email address.","tags":["Manage Teams and Members"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteMemberRequest"}}}},"responses":{"200":{"description":"Successfully invited the member."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/members/{memberID}":{"delete":{"summary":"Remove a member from the organization","description":"Removes the given member from the organization.","tags":["Manage Teams and Members"],"parameters":[{"name":"memberID","in":"path","description":"The internal ID of the member to remove.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully removed the member."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/notification-channels":{"get":{"summary":"List all notification channels for the organization","description":"Returns all notification channels configured for your organization as CRD-enveloped resources.\n","tags":["Manage Notification Channels"],"responses":{"200":{"description":"List of notification channels","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelDefinitions"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new notification channel","description":"Create a new notification channel for your organization.\n","tags":["Manage Notification Channels"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelDefinition"}}}},"responses":{"200":{"description":"The created notification channel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelDefinition"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/notification-channels/{originOrId}":{"get":{"summary":"Get a specific notification channel","description":"Returns a specific notification channel identified by its UUID or origin.\n","tags":["Manage Notification Channels"],"parameters":[{"name":"originOrId","in":"path","description":"Notification channel origin or UUID.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The requested notification channel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update a notification channel","description":"Updates an existing notification channel.\n","tags":["Manage Notification Channels"],"parameters":[{"name":"originOrId","in":"path","description":"Notification channel origin or UUID.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelDefinition"}}}},"responses":{"200":{"description":"The updated notification channel","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelDefinition"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a notification channel","description":"Deletes a specific notification channel identified by its UUID or origin.","tags":["Manage Notification Channels"],"parameters":[{"name":"originOrId","in":"path","description":"Notification channel origin or UUID.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Successfully deleted"},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/operation-pattern-rules":{"get":{"summary":"List Operation Pattern Rules","description":"Returns Operation Pattern Rules in the given dataset. Omitting `serviceNamespace`\nand `serviceName` returns every rule in the dataset across all services; supplying\nboth scopes the response to that single service.\n","tags":["Manage Operation Pattern Rules (Private BETA)"],"parameters":[{"name":"dataset","in":"query","description":"The dataset to list Pattern Rules from.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}},{"name":"serviceNamespace","in":"query","description":"Filter to rules scoped to this OpenTelemetry `service.namespace`. Requires `serviceName` to also be set.","required":false,"schema":{"type":"string"}},{"name":"serviceName","in":"query","description":"Filter to rules scoped to this OpenTelemetry `service.name`.","required":false,"schema":{"type":"string"}},{"name":"ownership","in":"query","description":"Filter to rules with this ownership.","required":false,"schema":{"$ref":"#/components/schemas/OperationPatternRuleOwnership"}},{"name":"status","in":"query","description":"Filter to rules with this status.","required":false,"schema":{"$ref":"#/components/schemas/OperationPatternRuleStatus"}},{"name":"limit","in":"query","description":"Maximum number of rules to return.","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","description":"Number of rules to skip.","required":false,"schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"List of Operation Pattern Rules","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationPatternRuleListResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new Operation Pattern Rule","description":"Creates a new user-defined Operation Pattern Rule. The server compiles `spec.pattern`\ninto its canonical representation and rejects it with 400 if it is malformed, exceeds\nthe placeholder/length limits, or is not specific enough (needs at least one\nnon-placeholder path segment). `spec.ownership` is always `user_defined` on create --\nany client-supplied value is ignored.\n\nThe `dataset` query parameter is authoritative over `metadata.labels[\"dash0.com/dataset\"]` in the\nrequest body whenever both are present.\n\n`metadata.labels[\"dash0.com/origin\"]` is stamped per this API's standard\norigin-stamping convention: a client-provided value wins; a machine-token caller that\nomits it gets a server-generated `api-<uuid>` fallback; a UI (Clerk) or OAuth caller\nthat omits it keeps a `null` origin. A client-supplied origin that itself looks like a\nUUID is rejected with 400.\n","tags":["Manage Operation Pattern Rules (Private BETA)"],"parameters":[{"name":"dataset","in":"query","description":"The dataset to create the Pattern Rule in.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationPatternRuleCreateRequest"}}}},"responses":{"200":{"description":"The created Operation Pattern Rule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationPatternRuleResponse"}}}},"400":{"description":"Bad request. Possible reasons include: `metadata.labels[\"dash0.com/id\"]` was\nprovided in the request body, `metadata.labels[\"dash0.com/origin\"]` looks like a\nUUID, the given `dash0.com/origin` is already in use within this dataset,\n`spec.pattern` is malformed or not specific enough, or the per-partition rule\nlimit has been reached.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The resulting pattern collides (by its anonymized canonical form) with an\nexisting rule in this partition -- most commonly a race against the Operation\nMiner inserting the same pattern, or two concurrent creates of an\nequivalent pattern. The error response references the existing rule's id and\nownership so the client can act on it directly instead of retrying blind.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/operation-pattern-rules/{originOrId}":{"get":{"summary":"Get an Operation Pattern Rule by origin or ID","description":"Returns a specific Operation Pattern Rule, identified either by its server-generated\n`dash0.com/id` or its client-chosen `dash0.com/origin`.\n","tags":["Manage Operation Pattern Rules (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"The Operation Pattern Rule's `dash0.com/origin` or `dash0.com/id`.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","description":"The dataset the Pattern Rule belongs to.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested Operation Pattern Rule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationPatternRuleResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or create an Operation Pattern Rule by origin or ID","description":"Upsert semantics, per this API's standard `{originOrId}` convention: if `{originOrId}`\nresolves to an existing rule, it's updated; if it doesn't resolve to anything, a new\nrule is created for non-UI (machine token/OAuth) callers only --\n  - if `{originOrId}` looks like a UUID, the new rule is created with that UUID as its\n    `dash0.com/id` (`metadata.labels[\"dash0.com/origin\"]` in the body, if any, is\n    stamped normally per `POST`'s rules);\n  - otherwise, `{originOrId}` itself becomes the new rule's `dash0.com/origin` and a\n    fresh `dash0.com/id` is generated.\n\nA UI (Clerk session token) caller gets a strict 404 instead of a create when\n`{originOrId}` doesn't resolve -- the UI creates rules via `POST` only, matching this\nAPI's other single-`/api/`-family resources.\n\n`metadata.labels[\"dash0.com/origin\"]` is immutable after creation: a value supplied on\nupdate is silently ignored, never rejected, so a normal GET -> edit spec -> PUT round\ntrip doesn't need to strip it back out.\n\n`metadata.labels[\"dash0.com/dataset\"]`/`spec.serviceNamespace`/`spec.serviceName` are immutable; a value that\ndisagrees with the stored row is rejected with 400 and the row is left unchanged.\nSetting `spec.ownership` to `auto_derived` is rejected with 400; the only accepted\ntransition is `auto_derived` -> `user_defined` (promoting a Miner-inferred rule).\nUnlike `POST`, `spec.status` is required on every `PUT` -- there is no default, since\nomitting it could otherwise silently reactivate or deactivate a rule the caller did\nnot intend to touch.\n\nIf the incoming payload is identical to what's already stored, the write is skipped\nentirely and the existing rule is returned as-is, without bumping\n`dash0.com/updated-at` -- so re-applying the same manifest (a normal IaC workflow)\nnever spuriously conflicts with itself.\n","tags":["Manage Operation Pattern Rules (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"The Operation Pattern Rule's `dash0.com/origin` or `dash0.com/id`.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","description":"The dataset the Pattern Rule belongs to.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationPatternRuleUpdateRequest"}}}},"responses":{"200":{"description":"The updated or newly-created Operation Pattern Rule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationPatternRuleResponse"}}}},"400":{"description":"Bad request. Possible reasons include: a missing or stale\n`metadata.annotations[\"dash0.com/updated-at\"]` for a UI caller (`SupersededVersion`),\na `metadata.labels[\"dash0.com/dataset\"]`/`spec.serviceNamespace`/`spec.serviceName` that disagrees with the\nstored row, `spec.pattern` is malformed or not specific enough, `spec.status` was\nomitted, setting `spec.ownership` to `auto_derived`, or -- on the create-via-upsert\npath -- the given `dash0.com/origin` is already in use within this dataset.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The edited pattern collides (by its anonymized canonical form) with a different,\npre-existing rule in this partition. The error response references that rule's id\nand ownership so the client can act on it directly instead of retrying blind.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete an Operation Pattern Rule by origin or ID","description":"Permanently deletes an Operation Pattern Rule, identified either by its\nserver-generated `dash0.com/id` or its client-chosen `dash0.com/origin`. This is a hard\ndelete, unlike the soft-delete-with-revert-on-PUT behavior used by most other resources\nin this API -- deleted rules cannot be recovered.\n","tags":["Manage Operation Pattern Rules (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"The Operation Pattern Rule's `dash0.com/origin` or `dash0.com/id`.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","description":"The dataset the Pattern Rule belongs to.","required":true,"schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successfully deleted"},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/prometheus/api/v1/format_query":{"get":{"summary":"Evaluates and returns a formatted version of the query","tags":["Prometheus API"],"parameters":[{"name":"query","in":"query","description":"PromQL expression to validate and pretty-print. The response `data` is the\nformatted expression. If the query contains Dash0 template variables (e.g.\n`$__range`, `$__interval`), the original query is returned unmodified.\n","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Evaluated and formatted query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusFormatQueryResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Evaluates and returns a formatted version of the query","tags":["Prometheus API"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusFormatQueryRequest"}}}},"responses":{"200":{"description":"Evaluated and formatted query.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusFormatQueryResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/label/{label_name}/values":{"get":{"summary":"Returns a list of label values for a provided label name","tags":["Prometheus API"],"parameters":[{"name":"label_name","in":"path","description":"The label name whose values are returned.","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","description":"Start timestamp to restrict the set of returned label values.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"end","in":"query","description":"End timestamp to restrict the set of returned label values.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"match[]","in":"query","description":"Repeated series selector that restricts the label values returned.","schema":{"type":"array","items":{"type":"string","format":"series_selector"}}},{"name":"limit","in":"query","description":"Maximum number of results. Defaults to and is capped at the server-configured maximum.","schema":{"type":"integer","format":"int64","minimum":1}},{"name":"dataset","in":"query","description":"Dataset to query. Defaults to the organization's default dataset.","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Returns a list of label values for a provided label name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Returns a list of label values for a provided label name","tags":["Prometheus API"],"parameters":[{"name":"label_name","in":"path","description":"The label name whose values are returned.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesRequest"}}}},"responses":{"200":{"description":"Returns a list of label values for a provided label name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/labels":{"get":{"summary":"Returns a list of label names","tags":["Prometheus API"],"parameters":[{"name":"start","in":"query","description":"Start timestamp to restrict the set of returned label names.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"end","in":"query","description":"End timestamp to restrict the set of returned label names.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"match[]","in":"query","description":"Repeated series selector that restricts the label names returned.","schema":{"type":"array","items":{"type":"string","format":"series_selector"}}},{"name":"limit","in":"query","description":"Maximum number of results. Defaults to and is capped at the server-configured maximum.","schema":{"type":"integer","format":"int64","minimum":1}},{"name":"dataset","in":"query","description":"Dataset to query. Defaults to the organization's default dataset.","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Returns a list of label names.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Returns a list of label names","tags":["Prometheus API"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesRequest"}}}},"responses":{"200":{"description":"Returns a list of label names.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/metadata":{"get":{"summary":"Returns metadata about metrics currently scraped from targets","tags":["Prometheus API"],"parameters":[{"name":"limit","in":"query","description":"Maximum number of metrics to return. When omitted, all metrics are returned.","schema":{"type":"integer","format":"int64"}},{"name":"limit_per_metric","in":"query","description":"Maximum number of metadata entries to return per metric.","schema":{"type":"integer","format":"int64"}},{"name":"metric","in":"query","description":"If provided, only metadata for this metric name is returned. When omitted,\nmetadata for all metrics is returned.\n","schema":{"type":"string"}},{"name":"start","in":"query","description":"Start timestamp. Must be provided together with `end`.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"end","in":"query","description":"End timestamp. Must be provided together with `start`.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"dataset","in":"query","description":"Dataset to query. Defaults to the organization's default dataset.","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Metric metadata keyed by metric name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusMetadataResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Returns metadata about metrics currently scraped from targets","tags":["Prometheus API"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusMetadataRequest"}}}},"responses":{"200":{"description":"Metric metadata keyed by metric name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusMetadataResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/query":{"get":{"summary":"Evaluates an instant query at a single point in time","tags":["Prometheus API"],"parameters":[{"name":"query","in":"query","description":"PromQL expression to evaluate.","required":true,"schema":{"type":"string"}},{"name":"time","in":"query","description":"Evaluation timestamp. Defaults to the current server time when omitted.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"timeout","in":"query","description":"Per-query timeout, clamped to the server-configured maximum.","schema":{"type":"string","format":"duration"}},{"name":"limit","in":"query","description":"Maximum number of returned series. Defaults to and is capped at the\nserver-configured maximum.\n","schema":{"type":"integer","format":"int64","minimum":1}},{"name":"dataset","in":"query","description":"Dataset to query. Defaults to the organization's default dataset.","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Evaluated instant query at a single point in time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusQueryResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Evaluates an instant query at a single point in time","tags":["Prometheus API"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusQueryRequest"}}}},"responses":{"200":{"description":"Evaluated instant query at a single point in time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusQueryResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/query_range":{"get":{"summary":"Evaluates a PromQL expression over a range of time","tags":["Prometheus API"],"parameters":[{"name":"query","in":"query","description":"PromQL expression to evaluate.","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","description":"Start timestamp of the range (inclusive).","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"end","in":"query","description":"End timestamp of the range (inclusive). Must not be before `start`.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"step","in":"query","description":"Query resolution step width, as a duration or a number of seconds.","required":true,"schema":{"type":"string","format":"duration | float_seconds"}},{"name":"timeout","in":"query","description":"Per-query timeout, clamped to the server-configured maximum.","schema":{"type":"string","format":"duration"}},{"name":"limit","in":"query","description":"Maximum number of returned series. Defaults to and is capped at the\nserver-configured maximum.\n","schema":{"type":"integer","format":"int64","minimum":1}},{"name":"dataset","in":"query","description":"Dataset to query. Defaults to the organization's default dataset.","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Evaluated range query. The result is always a matrix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusQueryResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Evaluates a PromQL expression over a range of time","tags":["Prometheus API"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusQueryRangeRequest"}}}},"responses":{"200":{"description":"Evaluated range query. The result is always a matrix.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusQueryResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/series":{"get":{"summary":"Returns the list of time series that match a label selector","tags":["Prometheus API"],"parameters":[{"name":"start","in":"query","description":"Start timestamp to restrict the set of returned series.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"end","in":"query","description":"End timestamp to restrict the set of returned series.","schema":{"type":"string","format":"rfc3339 | unix_timestamp"}},{"name":"match[]","in":"query","description":"Repeated series selector that selects the series to return. Upstream\nPrometheus requires at least one selector.\n","schema":{"type":"array","items":{"type":"string","format":"series_selector"}}},{"name":"limit","in":"query","description":"Maximum number of results. Defaults to and is capped at the server-configured maximum.","schema":{"type":"integer","format":"int64","minimum":1}},{"name":"dataset","in":"query","description":"Dataset to query. Defaults to the organization's default dataset.","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The list of matching time series, each represented by its label set.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusSeriesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}},"post":{"summary":"Returns the list of time series that match a label selector","tags":["Prometheus API"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusLabelNamesOrValuesRequest"}}}},"responses":{"200":{"description":"The list of matching time series, each represented by its label set.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusSeriesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/status/buildinfo":{"get":{"summary":"Returns various build information properties about the Prometheus-compatible server","tags":["Prometheus API"],"responses":{"200":{"description":"Build information about the server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusBuildInfoResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/prometheus/api/v1/status/runtimeinfo":{"get":{"summary":"Returns various runtime information properties about the Prometheus-compatible server","tags":["Prometheus API"],"responses":{"200":{"description":"Runtime information about the server.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusRuntimeInfoResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusErrorResponse"}}}}}}},"/api/recording-rules":{"get":{"summary":"Retrieve a list of recording rules","tags":["Manage Recording Rules"],"parameters":[{"name":"dataset","in":"query","description":"Filter by dataset.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}},{"name":"originPrefix","in":"query","description":"Filter by origin prefix.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of recording rules.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusRule"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a recording rule","tags":["Manage Recording Rules"],"parameters":[{"name":"dataset","in":"query","description":"Target dataset. Overrides dash0.com/dataset in metadata.labels if both are provided.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusRule"}}}},"responses":{"200":{"description":"The recording rule was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/recording-rules/{originOrId}":{"get":{"summary":"Retrieve the latest version of a specific recording rule","tags":["Manage Recording Rules"],"parameters":[{"name":"originOrId","in":"path","description":"Recording rule origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested recording rule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update a specific recording rule","tags":["Manage Recording Rules"],"parameters":[{"name":"originOrId","in":"path","description":"Recording rule origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","description":"Target dataset. Overrides dash0.com/dataset in metadata.labels if both are provided.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusRule"}}}},"responses":{"200":{"description":"The recording rule was updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrometheusRule"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific recording rule","tags":["Manage Recording Rules"],"parameters":[{"name":"originOrId","in":"path","description":"Recording rule origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The recording rule was deleted."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/sampling-rules":{"get":{"summary":"List all sampling rules for the organization","description":"Returns all sampling rules configured for your organization.","tags":["Manage Sampling Rules"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"List of sampling rules","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSamplingRulesResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new sampling rule","description":"Create a new sampling rule for your organization.","tags":["Manage Sampling Rules"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SamplingRuleCreateRequest"}}}},"responses":{"200":{"description":"The created sampling rule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SamplingRuleResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/sampling-rules/{originOrId}":{"get":{"summary":"Get a specific sampling rule by origin or ID","description":"Returns a specific sampling rule identified by its origin label or UUID.","tags":["Manage Sampling Rules"],"parameters":[{"name":"originOrId","in":"path","description":"Sampling rule origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested sampling rule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SamplingRuleResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or create a sampling rule by origin or ID","description":"Updates an existing sampling rule or creates a new one if it doesn't exist. Useful for Infrastructure-as-Code workflows.","tags":["Manage Sampling Rules"],"parameters":[{"name":"originOrId","in":"path","description":"Sampling rule origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SamplingRuleResponse"}}}},"responses":{"200":{"description":"The updated or created sampling rule","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SamplingRuleResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a sampling rule by origin or ID","description":"Deletes a specific sampling rule identified by its origin label or UUID.","tags":["Manage Sampling Rules"],"parameters":[{"name":"originOrId","in":"path","description":"Sampling rule origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successfully deleted"},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/signal-to-metrics":{"get":{"summary":"List all signal-to-metrics configs for the organization","description":"Returns all signal-to-metrics configurations for your organization.","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}},{"name":"limit","in":"query","description":"Maximum number of items to return.","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","description":"Number of items to skip.","required":false,"schema":{"type":"integer","minimum":0,"default":0}},{"name":"originPrefix","in":"query","description":"Filter by origin prefix.","required":false,"schema":{"type":"string"}},{"name":"name","in":"query","description":"Case-insensitive substring search on the rule name.","required":false,"schema":{"type":"string"}},{"name":"signal","in":"query","description":"Filter by signal type.","required":false,"schema":{"$ref":"#/components/schemas/SignalToMetricsSignalType"}},{"name":"enabled","in":"query","description":"Filter by enabled state.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"List of signal-to-metrics configs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSignalToMetricsResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new signal-to-metrics config","description":"Create a new signal-to-metrics configuration for your organization.","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsCreateRequest"}}}},"responses":{"200":{"description":"The created signal-to-metrics config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/signal-to-metrics/test":{"post":{"summary":"Test a signal-to-metrics config","description":"Validates a signal-to-metrics definition and simulates its match filter\nagainst real signals in the selected dataset over a recent time window.\nReturns the number of matching signals on success. A 4xx error is returned\nwhen the definition fails validation or the request is otherwise invalid.\nNothing is persisted.\n","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsTestRequest"}}}},"responses":{"200":{"description":"The test result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsTestResponse"}}}},"400":{"description":"The request is invalid — either the body is missing/malformed, the\ntime range is unparseable or out of range, or the definition fails\nvalidation. The response payload lists the specific failures.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/signal-to-metrics/{originOrId}":{"get":{"summary":"Get a specific signal-to-metrics config by origin or ID","description":"Returns a specific signal-to-metrics configuration identified by its origin label or UUID.","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"Signal-to-metrics config origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested signal-to-metrics config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or create a signal-to-metrics config by origin or ID","description":"Updates an existing signal-to-metrics configuration or creates a new one if it doesn't exist. Useful for Infrastructure-as-Code workflows.","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"Signal-to-metrics config origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsResponse"}}}},"responses":{"200":{"description":"The updated or created signal-to-metrics config","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignalToMetricsResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a signal-to-metrics config by origin or ID","description":"Deletes a specific signal-to-metrics configuration identified by its origin label or UUID.","tags":["Manage Signal To Metrics (BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"Signal-to-metrics config origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successfully deleted"},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/slos":{"get":{"summary":"Retrieve a list of SLOs","tags":["Manage SLOs (Private BETA)"],"parameters":[{"name":"dataset","in":"query","description":"Filter by dataset.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}},{"name":"originPrefix","in":"query","description":"Filter by origin prefix.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"List of SLOs.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SloDefinition"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create an SLO","tags":["Manage SLOs (Private BETA)"],"parameters":[{"name":"dataset","in":"query","description":"Target dataset. Overrides dash0.com/dataset in metadata.labels if both are provided.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloDefinition"}}}},"responses":{"200":{"description":"The SLO was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/slos/{originOrId}":{"get":{"summary":"Retrieve the latest version of a specific SLO","tags":["Manage SLOs (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"SLO origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested SLO.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update a specific SLO","tags":["Manage SLOs (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"SLO origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","description":"Target dataset. Overrides dash0.com/dataset in metadata.labels if both are provided.","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloDefinition"}}}},"responses":{"200":{"description":"The SLO was updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SloDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific SLO","tags":["Manage SLOs (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"SLO origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The SLO was deleted."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/spam-filters":{"get":{"summary":"List all spam filters for the organization","description":"Returns all spam filters configured for your organization.","tags":["Manage Spam Filters"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"List of spam filters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSpamFiltersResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new spam filter","description":"Create a new spam filter for your organization. Provide either structured `filter`\ncriteria or a raw OTTL `condition` in the spec, but not both.\n\nIf `metadata.labels[\"dash0.com/origin\"]` is provided, it must be unique within\nthe organization and dataset. A request with a duplicate origin returns 400.\nIf no origin is provided, the server auto-generates one (`api-<uuid>`).\n","tags":["Manage Spam Filters"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamFilterCreateRequest"}}}},"responses":{"200":{"description":"The created spam filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamFilterResponse"}}}},"400":{"description":"Bad request. Possible reasons include: a spam filter with the submitted\norigin already exists in this organization and dataset, or `dash0.com/id`\nwas provided in the request body.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/spam-filters/{originOrId}":{"get":{"summary":"Get a specific spam filter by origin or ID","description":"Returns a specific spam filter identified by its origin label or UUID.","tags":["Manage Spam Filters"],"parameters":[{"name":"originOrId","in":"path","description":"Spam filter origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested spam filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamFilterResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or create a spam filter by origin or ID","description":"Updates an existing spam filter or creates a new one if it doesn't exist.\nUseful for Infrastructure-as-Code workflows. Provide either structured `filter`\ncriteria or a raw OTTL `condition` in the spec, but not both.\n","tags":["Manage Spam Filters"],"parameters":[{"name":"originOrId","in":"path","description":"Spam filter origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamFilterResponse"}}}},"responses":{"200":{"description":"The updated or created spam filter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpamFilterResponse"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a spam filter by origin or ID","description":"Deletes a specific spam filter identified by its origin label or UUID.","tags":["Manage Spam Filters"],"parameters":[{"name":"originOrId","in":"path","description":"Spam filter origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successfully deleted"},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/spans":{"post":{"summary":"Returns OTLP spans","tags":["Query Telemetry"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSpansRequest"}}}},"responses":{"200":{"description":"Returns spans in OTLP format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSpansResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/spans/download":{"post":{"summary":"Download OTLP spans as a file","description":"Returns the spans matching the given query as a downloadable file in the requested\nformat (`txt`, `ndjson`, `yaml` or `csv`).\n\n**A single export is capped at 5000 spans.** A `limit` above that cap is rejected\nrather than silently clamped: the response is a client error naming the cap. When the\nquery matches more than 5000 spans, the export carries the first 5000 in result-set\norder. Use the Dash0 CLI (`dash0 spans query`) to export larger volumes.\n\nThe spans are the same ones `POST /api/spans` returns for the same query, except that\nadaptive sampling is always disabled for exports: an exported file is never a sample,\nwhatever the query and whatever the data volume. This request accordingly takes no\n`sampling`, and one sent anyway is ignored.\n\nThe response is streamed as pages are retrieved and therefore carries no\n`Content-Length`. Because the response headers are committed before the first span\nis written, a failure partway through cannot be reported as a status code — it\nterminates the transfer instead. Clients MUST confirm the body was received completely\nbefore treating the download as a successful export.\n","tags":["Query Telemetry"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpansDownloadRequest"}}}},"responses":{"200":{"description":"The exported spans. The body's actual content type matches the requested\nformat (`text/plain` for `txt`, `application/x-ndjson` for `ndjson`,\n`application/yaml` for `yaml`, `text/csv` for `csv`).\n","headers":{"Content-Type":{"schema":{"type":"string","example":"text/csv"}},"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"spans-2026-07-27T10-15-00Z.csv\""}}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request is invalid, for example a `limit` above the 5000-record cap, an\nunsupported ordering, or a time range exceeding the maximum permitted query\nrange. No partial file is produced.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - the requested dataset is not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/sql":{"post":{"summary":"Execute a SQL query and return results as JSON","tags":["Query SQL"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteSqlRequest"}}}},"responses":{"200":{"description":"Returns the SQL query results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteSqlResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/synthetic-checks":{"get":{"summary":"Receive a list of synthetic checks","description":"Receive a list of your organization synthetic checks","tags":["Manage Synthetic Checks"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Receive a list of synthetic checks.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SyntheticChecksApiListItem"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a synthetic check","description":"Create a synthetic check.","tags":["Manage Synthetic Checks"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"responses":{"200":{"description":"The created synthetic check.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/synthetic-checks/locations":{"get":{"summary":"Retrieve the synthetic check locations available to the organization","description":"Returns Dash0 public regions and the organization's private synthetic locations as one\nlist. `kind` distinguishes them.\n\nThe `id` of an entry is what a synthetic check definition stores to target it: the region\nidentifier for a public region, and the Dash0-assigned opaque id for a private location. A\nprivate location's customer-chosen `locationId` is a label only and never identifies it.\n\nDeleted private locations are omitted.\n\nPrivate locations carry `health`, derived from the workers currently connected to them.\n`health.status` is `unknown` when Dash0 cannot determine the connection state; that is\ndistinct from `offline`, which reports that no worker is connected.\n","tags":["Manage Synthetic Checks"],"responses":{"200":{"description":"The locations the organization can target.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SyntheticCheckLocationEntry"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/synthetic-checks/test":{"post":{"summary":"Trigger a test run of a synthetic check","description":"Triggers an immediate test execution of a synthetic check.","tags":["Manage Synthetic Checks"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSyntheticCheckRequest"}}}},"responses":{"200":{"description":"Receive a list of synthetic check runs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestSyntheticCheckResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/synthetic-checks/{originOrId}":{"get":{"summary":"Receive a specific synthetic check by its origin or id","tags":["Manage Synthetic Checks"],"parameters":[{"name":"originOrId","in":"path","description":"Synthetic check origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Receive a specific synthetic check.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or insert a specific synthetic check by its origin or id","tags":["Manage Synthetic Checks"],"parameters":[{"name":"originOrId","in":"path","description":"Synthetic check origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"responses":{"200":{"description":"Update a specific synthetic check.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific synthetic check by origin or id","tags":["Manage Synthetic Checks"],"parameters":[{"name":"originOrId","in":"path","description":"Synthetic check origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Delete a specific synthetic check."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/teams":{"get":{"summary":"Receive a list of teams","description":"Receive a list of your organization teams","tags":["Manage Teams and Members"],"responses":{"200":{"description":"Receive a list of teams.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamsListItem"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new team","description":"Create a new team in the organization.","tags":["Manage Teams and Members"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDefinitionV1Alpha1"}}}},"responses":{"200":{"description":"Successfully created the team.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDefinitionV1Alpha1"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/teams/{originOrId}":{"get":{"summary":"Receive a specific team by its origin or id","description":"Receive a specific team by its **origin** or **id**.","tags":["Manage Teams and Members"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the team.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Receive a specific team.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTeamResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or insert a specific team by its origin or id","description":"Update or insert a specific team by its **origin** or **id**. In case a team with the given **origin** or **id** is found it will be updated. If there is no team found a new team will be created and the given `originOrId` is used as **origin**.\n\n`spec.display` fully replaces the existing display values. `spec.members` is reconciled declaratively — the resulting membership is exactly the set given in the request body (adds and removes are computed against the current membership).\n","tags":["Manage Teams and Members"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the team.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDefinitionV1Alpha1"}}}},"responses":{"200":{"description":"The updated or created team.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDefinitionV1Alpha1"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific team by its origin or id","description":"Delete a specific team by its **origin** or **id**.","tags":["Manage Teams and Members"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the team.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Team deleted successfully."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/teams/{originOrId}/display":{"put":{"summary":"Update a specific team display option","description":"Update the display name, description, and color of a team.","tags":["Manage Teams and Members"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the team.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamDisplay"}}}},"responses":{"204":{"description":"Successfully updated team display."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/teams/{originOrId}/members":{"post":{"summary":"Add members to a team","description":"Adds the given members to the team.","tags":["Manage Teams and Members"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the team.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTeamMembersRequest"}}}},"responses":{"201":{"description":"The members are added."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/teams/{originOrId}/members/{memberID}":{"delete":{"summary":"Remove a member from a team","description":"Removes the given member from the team.","tags":["Manage Teams and Members"],"parameters":[{"name":"originOrId","in":"path","description":"The **origin** or **id** of the team.","required":true,"schema":{"type":"string"}},{"name":"memberID","in":"path","description":"The **id** of the member.","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"The member is removed."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/time-series-aggregations":{"get":{"summary":"List all time series aggregations for the organization","description":"Returns all time series aggregation rules configured for your organization.","tags":["Manage Time Series Aggregations (Private BETA)"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"List of time series aggregations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesAggregationListResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a new time series aggregation","description":"Create a new time series aggregation rule for your organization. If\n`metadata.labels[\"dash0.com/origin\"]` is provided, it must be unique within the\norganization and dataset; a request with a duplicate origin returns 400. If no\norigin is provided, the server auto-generates one.\n","tags":["Manage Time Series Aggregations (Private BETA)"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}}}},"responses":{"200":{"description":"The created time series aggregation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/time-series-aggregations/{originOrId}":{"get":{"summary":"Get a specific time series aggregation by origin or ID","description":"Returns a specific time series aggregation identified by its origin label or UUID.","tags":["Manage Time Series Aggregations (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"Time series aggregation origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"The requested time series aggregation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or create a time series aggregation by origin or ID","description":"Updates an existing time series aggregation or creates a new one if it doesn't exist.\nUseful for Infrastructure-as-Code workflows.\n","tags":["Manage Time Series Aggregations (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"Time series aggregation origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}}}},"responses":{"200":{"description":"The updated or created time series aggregation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}}}},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a time series aggregation by origin or ID","description":"Deletes a specific time series aggregation identified by its origin label or UUID.","tags":["Manage Time Series Aggregations (Private BETA)"],"parameters":[{"name":"originOrId","in":"path","description":"Time series aggregation origin or UUID","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Successfully deleted"},"403":{"description":"Forbidden - Admin access required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/trace/details":{"post":{"summary":"Returns the OTLP spans and log records (if any) associated with the trace ID","tags":["Query Telemetry"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTraceRequest"}}}},"responses":{"200":{"description":"Returns spans and log records (if any) in OTLP format.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTraceResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/trace/ids":{"post":{"summary":"Returns unique trace IDs matching the given filters","description":"Lightweight endpoint that returns only the unique trace IDs of traces containing\nat least one span matching the request filters. Useful for two-step workflows: first\nfind matching trace IDs, then fetch full trace details via `GetTrace`\n(`POST /api/trace/details`). Significantly faster and lighter-weight than\n`GetSpans` (`POST /api/spans`) when only trace IDs are needed.\n","tags":["Query Telemetry"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTraceIdsRequest"}}}},"responses":{"200":{"description":"Returns unique trace IDs as hex-encoded strings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTraceIdsResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/views":{"get":{"summary":"Receive a list of views","description":"Receive a list of your organization views","tags":["Manage Views"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Receive a list of views.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ViewApiListItem"}}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"summary":"Create a view","description":"Create a view.","tags":["Manage Views"],"parameters":[{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"responses":{"200":{"description":"The created view.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/views/{originOrId}":{"get":{"summary":"Receive a specific view by its origin or id","tags":["Manage Views"],"parameters":[{"name":"originOrId","in":"path","description":"View origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Receive a specific view.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"summary":"Update or insert a specific view by its origin or id","tags":["Manage Views"],"parameters":[{"name":"originOrId","in":"path","description":"View origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"responses":{"200":{"description":"Update a specific view.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewDefinition"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"summary":"Delete a specific view by origin or id","tags":["Manage Views"],"parameters":[{"name":"originOrId","in":"path","description":"View origin or id.","required":true,"schema":{"type":"string"}},{"name":"dataset","in":"query","schema":{"$ref":"#/components/schemas/Dataset"}}],"responses":{"200":{"description":"Delete a specific view."},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/web-events/download":{"post":{"summary":"Download web events as a file","description":"Returns the web events matching the given query as a downloadable file in the\nrequested format (`txt`, `ndjson`, `yaml` or `csv`).\n\n**A single export is capped at 5000 web events.** A `limit` above that cap is rejected\nrather than silently clamped: the response is a client error naming the cap. When the\nquery matches more than 5000 events, the export carries the first 5000 in result-set\norder; there is no CLI equivalent for web events, so a larger export has to be taken\nas several narrower queries.\n\nThe events are the same ones `POST /api/web-events` returns for the same query.\nWeb-event retrieval does not sample, so no sampling has to be disabled for the file to\nbe the query's whole result set.\n\nThe response is streamed as pages are retrieved and therefore carries no\n`Content-Length`. Because the response headers are committed before the first event\nis written, a failure partway through cannot be reported as a status code — it\nterminates the transfer instead. Clients MUST confirm the body was received completely\nbefore treating the download as a successful export.\n","tags":["Query Telemetry"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebEventsDownloadRequest"}}}},"responses":{"200":{"description":"The exported web events. The body's actual content type matches the requested\nformat (`text/plain` for `txt`, `application/x-ndjson` for `ndjson`,\n`application/yaml` for `yaml`, `text/csv` for `csv`).\n","headers":{"Content-Type":{"schema":{"type":"string","example":"text/csv"}},"Content-Disposition":{"schema":{"type":"string","example":"attachment; filename=\"web-events-2026-07-27T10-15-00Z.csv\""}}},"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request is invalid, for example a `limit` above the 5000-record cap, an\nunsupported ordering, or a time range exceeding the maximum permitted query\nrange. No partial file is produced.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden - the requested dataset is not accessible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/oauth/authorize":{"get":{"summary":"OAuth 2.0 Authorization Endpoint (Unauthenticated)","description":"Unauthenticated authorization endpoint (RFC 6749 section 3.1). Validates the client,\nredirect URI, PKCE parameters, and scopes. Creates a pending authorization request\nand always redirects to the consent UI.\n","tags":["OAuth 2.0"],"parameters":[{"name":"response_type","in":"query","description":"Must be \"code\" for the authorization code flow.","required":true,"schema":{"type":"string"}},{"name":"client_id","in":"query","description":"The client identifier obtained during registration.","required":true,"schema":{"type":"string"}},{"name":"redirect_uri","in":"query","description":"Must match one of the client's registered redirect URIs.","required":true,"schema":{"type":"string","format":"uri"}},{"name":"scope","in":"query","description":"Space-separated list of requested scopes.","required":false,"schema":{"type":"string"}},{"name":"state","in":"query","description":"Opaque value for CSRF protection, returned unchanged in the redirect.","required":false,"schema":{"type":"string"}},{"name":"code_challenge","in":"query","description":"PKCE code challenge (RFC 7636).","required":true,"schema":{"type":"string"}},{"name":"code_challenge_method","in":"query","description":"Must be \"S256\".","required":true,"schema":{"type":"string"}},{"name":"prompt","in":"query","description":"Space-separated list of prompt directives. Supported value: \"consent\".\n","required":false,"schema":{"type":"string"}}],"responses":{"302":{"description":"Always redirects to the consent UI with authorization_request_id and\nclient metadata as query parameters.\n"},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/oauth/register":{"post":{"summary":"Register a new OAuth client","description":"Dynamic Client Registration endpoint (RFC 7591). Allows clients to register\nthemselves and obtain a client_id for use in the authorization code flow.\n","tags":["OAuth 2.0"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthClientRegistrationRequest"}}}},"responses":{"201":{"description":"Client successfully registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthClientRegistrationResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/oauth/revoke":{"post":{"summary":"OAuth 2.0 Token Revocation","description":"Token revocation endpoint (RFC 7009). Revokes an access or refresh token.\nThe server responds with HTTP 200 regardless of whether the token was valid,\nto prevent token scanning attacks.\n","tags":["OAuth 2.0"],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/OAuthRevocationRequest"}}}},"responses":{"200":{"description":"Token revocation request processed. Returns 200 regardless of whether the token was valid."},"400":{"description":"Revocation request failed (RFC 7009 section 2.2.1). Error presentation follows\nRFC 6749 section 5.2 — e.g. missing or empty `client_id` → `invalid_request`.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/oauth/token":{"post":{"summary":"OAuth 2.0 Token Endpoint","description":"Token endpoint (RFC 6749 section 3.2). Exchanges an authorization code for\naccess and refresh tokens (authorization_code grant), or exchanges a refresh\ntoken for new tokens (refresh_token grant).\n","tags":["OAuth 2.0"],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/OAuthTokenRequest"}}}},"responses":{"200":{"description":"Tokens issued successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenResponse"}}}},"400":{"description":"Token request failed (invalid grant, expired code, etc.).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenErrorResponse"}}}},"default":{"description":"In case any error happens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AccessibleAsset":{"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"description":"returns for views the information which type of view it is","type":"string"},"permittedActions":{"type":"array","items":{"$ref":"#/components/schemas/Action"}},"createdAt":{"$ref":"#/components/schemas/FixedTime"},"creator":{"$ref":"#/components/schemas/MemberDefinition"},"dataset":{"$ref":"#/components/schemas/Dataset"},"hasAccess":{"description":"returns the information if the logged-in user has access to this asset","type":"boolean"}},"required":["id","name","permittedActions","createdAt","dataset","hasAccess"]},"Action":{"description":"Not defined as an enum, because we will eventually support wildcards like `ingest:*`.\n","type":"string"},"AddTeamMembersRequest":{"properties":{"memberIds":{"description":"Add an existing organization member to this team.\n","type":"array","items":{"type":"string"}}},"required":["memberIds"]},"AgenticWorkflowAction":{"type":"string","enum":["agentic_workflow:read","agentic_workflow:write","agentic_workflow:delete"]},"AgenticWorkflowAnnotations":{"properties":{"dash0.com/created-at":{"description":"The time at which this automation was originally created.","type":"string","format":"date-time","readOnly":true},"dash0.com/created-by":{"description":"The member ID of the user who originally created this automation.","type":"string","readOnly":true},"dash0.com/last-updated-at":{"description":"The time at which the current version of this automation was created.","type":"string","format":"date-time","readOnly":true},"dash0.com/last-updated-by":{"description":"The member ID of the user who created the current version of this automation.","type":"string","readOnly":true},"dash0.com/deleted-at":{"type":"string","format":"date-time"},"dash0.com/folder-path":{"description":"Optional UI folder path for organising groups (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"dash0.com/sharing":{"description":"Comma-separated list of principals to grant read access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Sharing is honored only on assets that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API). Setting it on an asset that declares no dash0.com/origin is rejected with a 400 — manage that asset's access via the UI share dialog instead.","type":"string"},"dash0.com/webhook-secret":{"description":"The plaintext webhook secret, returned exactly once: immediately after the backend\nauto-provisions it on create or update (the first time a webhook trigger is added).\nAbsent on every other response, including subsequent reads of the same workflow — it\nis stored only as an encrypted value and cannot be retrieved again. Use\n`POST .../webhook` (regenerate) to obtain a new one if this value was missed.\n","type":"string","readOnly":true},"dash0.com/webhook-trigger-enabled":{"description":"Webhook-trigger-scoped feature flag, independent of the workflow's own `spec.enabled`.\nClient-settable on write (via PUT/upsert), defaults to `\"true\"`. `\"true\"` if the\nwebhook trigger is active, `\"false\"` if it is paused. Pausing keeps the secret and\nwebhook id intact; incoming requests are silently accepted but not forwarded.\n","type":"string"}}},"AgenticWorkflowConcurrency":{"properties":{"policy":{"$ref":"#/components/schemas/AgenticWorkflowConcurrencyPolicy","description":"Defaults to `parallel`.\n"},"maxParallel":{"description":"The maximum number of parallel executions allowed. Only meaningful when `policy` is set to `parallel`.\nDefaults to `50`.\n","type":"integer","minimum":1}},"required":["policy"]},"AgenticWorkflowConcurrencyPolicy":{"description":"The concurrency policy to apply when an automation is triggered while a previous execution is still running.\n\n- `queue`: Queue the new execution and run it after the current one completes.\n- `skip`: Skip the new execution entirely.\n- `supersede`: Cancel the current execution and start the new one.\n- `parallel`: Run executions in parallel, up to `maxParallel`.\n","type":"string","enum":["queue","skip","supersede","parallel"]},"AgenticWorkflowCreateRequest":{"$ref":"#/components/schemas/AgenticWorkflowDefinition"},"AgenticWorkflowCreditBudget":{"properties":{"credits":{"description":"The maximum number of credits this workflow may consume within the rolling window.\n","type":"number"},"window":{"$ref":"#/components/schemas/Duration","description":"The rolling time window over which credit spend is summed (e.g. `24h`, `7d`, `4w`).\n"},"warningThreshold":{"description":"Optional warning threshold, as a percentage (0-100) of `credits`. A `budget_warning`\nnotification is dispatched once, to `notifications.onBudgetWarningChannels`, the first time\na completed run pushes rolling spend across this percentage of the budget. Leave unset to\ndisable budget warnings.\n","type":"number","minimum":0,"maximum":100}},"required":["credits","window"]},"AgenticWorkflowDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0AgenticWorkflow"]},"metadata":{"$ref":"#/components/schemas/AgenticWorkflowMetadata"},"spec":{"$ref":"#/components/schemas/AgenticWorkflowSpec"}},"required":["kind","metadata","spec"]},"AgenticWorkflowDisplay":{"properties":{"name":{"type":"string"},"description":{"type":"string"}},"required":["name"]},"AgenticWorkflowGuardrails":{"properties":{"timeout":{"$ref":"#/components/schemas/Duration","description":"Optional timeout after which the Agent0 automation will be aborted. Defaults to ten minutes.\n"},"allowedTools":{"description":"Optionally restrict which tools are allowed. By default, all tools are allowed to be used. You can use the\n`*` character to allow all tools matching a pattern.\n","type":"array","items":{"type":"string"}},"requiredToolCalls":{"description":"Optionally enforce that the Agent0 automation has executed these tool calls. If the agent is concluding is\nautomation, but hasn't called these tools, the agent receives a follow-up prompt to call these tools. This\nauto-correction of the LLM behavior is only attempted once.\n\nThis is useful if you wanna ensure that the agent makes specific tool calls to external systems, e.g., to\nleave a message on Slack or GitHub.\n","type":"array","items":{"type":"string"}},"concurrency":{"$ref":"#/components/schemas/AgenticWorkflowConcurrency"},"debounce":{"$ref":"#/components/schemas/Duration","description":"How long to wait before firing if the same trigger fires repeatedly. This is useful to avoid redundant\nautomation executions when triggers fire in rapid succession. Defaults to 10s, which is also the\nminimum: a shorter non-zero value is raised to 10s. Set to \"0s\" to disable debouncing.\n"},"toolParameterOverrides":{"description":"Pre-configure tool parameters that are enforced at invocation time. When a listed\ntool is called by the agent, these parameters are merged into the tool's arguments,\noverriding any values the LLM may have provided.\nKeys can be either fully qualified with namespace (e.g., \"dash0.slackSendMessage\")\nor bare tool names without namespace (e.g., \"slackSendMessage\"). Namespaced keys\ntake precedence and allow disambiguation when multiple integrations expose tools\nwith the same name.\nValues are objects of key-value pairs merged into tool arguments.\nValues support {{variable}} substitution using built-in variables, constants,\nand trigger variables.\n","type":"object","additionalProperties":{"$ref":"#/components/schemas/AgenticWorkflowToolParameterOverride"}},"networkLevel":{"$ref":"#/components/schemas/NetworkLevel","description":"Controls outbound network access for the sandbox running the automation.\n"},"creditBudgetWindow":{"$ref":"#/components/schemas/AgenticWorkflowCreditBudget","description":"Optional rolling-window credit budget across all runs of this workflow. A new run is\nnot started when the budget is already exhausted, and an in-flight run is aborted the\nmoment it would push spend past the budget. Leave unset for no budget.\n"},"mcpTools":{"description":"Per-automation overrides for MCP server tools. Each entry sets whether a specific MCP\ntool is available to this automation, overriding the tool's enabled/disabled state in\nthe organization's MCP integration settings. Tools not listed here fall back to their\nintegration-settings default. This lets an automation enable a tool that is disabled in\nsettings, or disable a tool that is enabled there, scoped to this automation only.\n","type":"array","items":{"$ref":"#/components/schemas/AgenticWorkflowMcpTool"}}},"required":["networkLevel"]},"AgenticWorkflowLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/origin":{"type":"string"},"dash0.com/version":{"type":"string"},"dash0.com/dataset":{"type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"},"dash0.com/webhook-id":{"type":"string"}}},"AgenticWorkflowMcpTool":{"type":"object","properties":{"server":{"description":"The MCP server (integration) display name, kebab-cased — matches the name agent0 uses for the server.","type":"string"},"tool":{"description":"The tool name as reported by the MCP server.","type":"string"},"enabled":{"description":"Whether this MCP tool is available to this automation, overriding the integration-settings default.","type":"boolean"}},"required":["server","tool","enabled"]},"AgenticWorkflowMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/AgenticWorkflowLabels"},"annotations":{"$ref":"#/components/schemas/AgenticWorkflowAnnotations"}},"required":["name"]},"AgenticWorkflowNotifications":{"description":"Notification channels to notify when an automation run completes, grouped by outcome.\nBoth lists are optional; omit one to skip notifying on that outcome.\n","properties":{"onSuccessChannels":{"description":"Notification channels to notify when an automation run completes successfully. Each value is an\nopaque channel identifier: either the channel's UUID or its origin (the stable identifier\ninfrastructure-as-code tooling assigns). Identifiers are resolved at dispatch time, so an\nautomation authored via Terraform or the operator can reference channels without knowing their\nper-environment UUID. An empty or absent list notifies no channels on success.\n","type":"array","items":{"type":"string"}},"onFailureChannels":{"description":"Notification channels to notify when an automation run fails. Each value is an opaque channel\nidentifier: either the channel's UUID or its origin. An empty or absent list notifies no\nchannels on failure.\n","type":"array","items":{"type":"string"}},"onBudgetWarningChannels":{"description":"Notification channels to notify when this workflow's rolling credit budget crosses its\nwarning threshold (`guardrails.creditBudgetWindow.warningThreshold`). Each value is an opaque channel\nidentifier: either the channel's UUID or its origin. An empty or absent list notifies no\nchannels on budget warnings.\n","type":"array","items":{"type":"string"}}}},"AgenticWorkflowParent":{"description":"Establish as a parent-child hierarchy between automations. You will not want to set this explicitly; instead,\nthis is going to be set by the automation engine when one automation is deciding to create another.\n","properties":{"workflowId":{"description":"The parent automation's ID.","type":"string"},"runId":{"type":"string"},"version":{"type":"string"}},"required":["workflowId","runId","version"]},"AgenticWorkflowPermission":{"properties":{"teamId":{"type":"string"},"userId":{"type":"string"},"role":{"type":"string"},"actions":{"type":"array","items":{"$ref":"#/components/schemas/AgenticWorkflowAction"}}},"required":["actions"]},"AgenticWorkflowPrompt":{"properties":{"user":{"type":"string"}},"required":["user"]},"AgenticWorkflowResponse":{"$ref":"#/components/schemas/AgenticWorkflowDefinition"},"AgenticWorkflowSpec":{"properties":{"enabled":{"type":"boolean"},"display":{"$ref":"#/components/schemas/AgenticWorkflowDisplay"},"parent":{"$ref":"#/components/schemas/AgenticWorkflowParent"},"triggers":{"type":"array","items":{"$ref":"#/components/schemas/AgenticWorkflowTrigger","minItems":1}},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/AgenticWorkflowPermission"}},"permittedActions":{"description":"Computed, read-only. The set of actions the requesting user is permitted to perform on this automation, derived from their org role, dataset permissions, team memberships, and explicit permission entries. Ignored on write.","type":"array","items":{"$ref":"#/components/schemas/AgenticWorkflowAction"},"readOnly":true},"prompt":{"$ref":"#/components/schemas/AgenticWorkflowPrompt"},"guardrails":{"$ref":"#/components/schemas/AgenticWorkflowGuardrails"},"constants":{"description":"Static key-value pairs available as {{variable.name}} in the prompt and\ntool parameter overrides. Constants are always available regardless of trigger type.\nTrigger variables take precedence over constants on conflict.\n","type":"object","additionalProperties":{"type":"string"}},"notifications":{"$ref":"#/components/schemas/AgenticWorkflowNotifications","description":"Optional notification channels to notify when an automation run completes. Channels are\ngrouped by outcome, so a run can notify different channels on success and on failure.\n"}},"required":["enabled","display","triggers","prompt","guardrails"]},"AgenticWorkflowToolParameterOverride":{"description":"Key-value pairs merged into tool arguments at invocation time. Keys are parameter\nnames (use dot notation for nested parameters, e.g. \"timeframe.from\"), values are\nthe enforced parameter values. Values can contain {{variables}} resolved from\nbuilt-in variables, constants, and trigger variables.\n","type":"object","additionalProperties":{"type":"string"}},"AgenticWorkflowTrigger":{"anyOf":[{"$ref":"#/components/schemas/ScheduledAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/FailedCheckAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/SlackBotFailedCheckAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/SlackBotMessageAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/SlackBotReactionAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubDeploymentAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubDeploymentStatusAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubPullRequestAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubPullRequestReviewAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubPullRequestReviewCommentAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubIssueCommentAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubReleaseAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubWorkflowRunAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubWorkflowJobAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubWorkflowDispatchAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubCheckRunAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitHubCheckSuiteAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitLabMergeRequestAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/GitLabNoteAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/LinearCommentAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/LinearLabelAddedAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/WebhookAgenticWorkflowTrigger"},{"$ref":"#/components/schemas/ManualAgenticWorkflowTrigger"}]},"AgenticWorkflowTriggerDelivery":{"description":"How a trigger delivers its event to an agent. An automation is the agent definition;\ntriggers are the pipes into it, and each pipe is configured independently.\n\n- `spawn`: Start a new agent thread for this event. This is today's behavior.\n- `continue`: Route the event into the existing agent thread that owns the matching\n  entity, falling back to spawning a fresh thread when none is active\n  (resume-or-spawn). Only valid on continuation-capable triggers that carry an entity\n  ref to route by; spawn-only triggers (e.g. `schedule`, `webhook`,\n  `failed_check.new`) must not set it.\n","type":"string","enum":["spawn","continue"]},"AgenticWorkflowTriggerKind":{"description":"The kind of event that triggers the Agent0 automation.\n\n- `schedule`: Cron-based scheduled trigger.\n- `failed_check.new`: Triggered directly when a new check failure is detected, without requiring Slack configuration.\n- `slack_bot.failed_check.new`: Triggered when a new failed check is detected via Slack bot.\n- `slack_bot.message`: Triggered when a Slack message matches a pattern.\n- `slack_bot.reaction`: Triggered when a specific emoji reaction is added in Slack.\n- `github.deployment`: Triggered when a GitHub deployment event occurs.\n- `github.deployment_status`: Triggered when a GitHub deployment status changes.\n- `github.pull_request`: Triggered when a GitHub pull request event occurs.\n- `github.pull_request_review`: Triggered when a GitHub pull request review event occurs.\n- `github.pull_request_review_comment`: Triggered when a GitHub pull request review comment event occurs.\n- `github.issue_comment`: Triggered when a comment is created, edited, or deleted on a GitHub pull request or issue.\n- `github.release`: Triggered when a GitHub release event occurs.\n- `github.workflow_run`: Triggered when a GitHub Actions workflow run completes (or is requested / in progress).\n- `github.workflow_job`: Triggered when a job within a GitHub Actions workflow run is queued, waiting, started, or completed.\n- `github.workflow_dispatch`: Triggered when a GitHub Actions workflow is manually dispatched via the UI, API, or CLI.\n- `github.check_run`: Triggered when a GitHub check run (a single check, from any CI system connected via the Checks API) is created, completed, or rerequested.\n- `github.check_suite`: Triggered when a GitHub check suite (the group of check runs GitHub associates with one commit) is requested, rerequested, or completed.\n- `gitlab.merge_request`: Triggered when a GitLab merge request event occurs.\n- `gitlab.note`: Triggered when a comment is created on a GitLab merge request, issue, commit, or snippet.\n- `linear.comment`: Triggered when the Dash0 agent is @mentioned or delegated in a Linear comment whose text contains the configured keyword.\n- `linear.label_added`: Triggered when a specific Linear label is added to an issue, optionally scoped to one or more Linear teams.\n- `webhook`: Triggered via an external webhook call.\n- `manual`: Triggered manually via the UI. Runtime-only — not valid in `spec.triggers[]`.\n","type":"string","enum":["schedule","failed_check.new","slack_bot.failed_check.new","slack_bot.message","slack_bot.reaction","github.deployment","github.deployment_status","github.pull_request","github.pull_request_review","github.pull_request_review_comment","github.issue_comment","github.release","github.workflow_run","github.workflow_job","github.workflow_dispatch","github.check_run","github.check_suite","gitlab.merge_request","gitlab.note","linear.comment","linear.label_added","webhook","manual"]},"AgenticWorkflowTriggerTask":{"description":"Optional per-trigger task/instruction prompt. When set, it is rendered with the same\n`{{variable.name}}` substitution as `spec.prompt.user` and used as the task turn for\ninvocations from this trigger: the kickoff framing when the trigger spawns a new agent,\nor the event framing when it continues an existing one. When omitted, the\nautomation-level `spec.prompt.user` (on spawn) or a connector-default event summary (on\ncontinue) is used instead. The automation-level standing prompt is injected only once,\non spawn, and is not re-sent on continue.\n","type":"string"},"AllQuietConfig":{"properties":{"url":{"type":"string","format":"url"}},"required":["url"]},"AnomalyDirection":{"description":"Which deviations from the prediction are treated as anomalous.\n\n- `both`: Deviations in either direction are anomalous.\n- `above`: Only values above the prediction are anomalous.\n- `below`: Only values below the prediction are anomalous.\n","type":"string","enum":["both","above","below"]},"AnyValue":{"description":"AnyValue is used to represent any type of attribute value. AnyValue may contain a primitive value such as a string or integer or it may contain an arbitrary nested object containing arrays, key-value lists and primitives.","type":"object","properties":{"stringValue":{"type":"string"},"boolValue":{"type":"boolean"},"intValue":{"type":"string","format":"int64"},"doubleValue":{"type":"number","format":"double"},"bytesValue":{"type":"string","format":"byte"}}},"AttributeFilter":{"type":"object","properties":{"key":{"$ref":"#/components/schemas/AttributeFilterKey"},"operator":{"$ref":"#/components/schemas/AttributeFilterOperator"},"value":{"oneOf":[{"$ref":"#/components/schemas/AttributeFilterStringValue"},{"$ref":"#/components/schemas/AttributeFilterAnyValue"}]},"values":{"description":"List of values to match against. This parameter is mandatory for the is_one_of and is_not_one_of operators.\n","type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/AttributeFilterStringValue"},{"$ref":"#/components/schemas/AttributeFilterAnyValue"}]}}},"required":["key","operator"]},"AttributeFilterAnyValue":{"$ref":"#/components/schemas/AnyValue","description":"AttributeFilterAnyValue may contain any AnyValue value."},"AttributeFilterKey":{"description":"The attribute key to be filtered.","type":"string"},"AttributeFilterOperator":{"description":"The match operation for filtering attributes.\n\n#### Equality Operators\n- `is` - equals (attribute exists and has a matching value)\n- `is_not` - not equals (attribute exists and has a different value)\n\n#### Existence Operators\n- `is_set` - is set (attribute exists)\n- `is_not_set` - is not set (attribute does not exist)\n\n#### Multiple Value Operators\n- `is_one_of` - is any of (attribute exists and has a value that is in the specified values)\n- `is_not_one_of` - is not any of (attribute exists and has a value that is not in the specified values)\n\n#### Comparison Operators\n- `gt` - greater than\n- `lt` - less than\n- `gte` - greater than or equal\n- `lte` - less than or equal\n\n#### Pattern Matching Operators\n- `matches` - match regex expression (attribute exists and matches the regular expression)\n- `does_not_match` - does not match regex expression (attribute exists and does not match the regular expression)\n\n#### String Operators\n- `contains` - contains (attribute exists and contains the specified value)\n- `does_not_contain` - does not contain (attribute exists and does not contain the specified value)\n- `starts_with` - starts with (attribute exists and starts with the specified value)\n- `does_not_start_with` - does not start with (attribute exists and does not start with the specified value)\n- `ends_with` - ends with (attribute exists and ends with the specified value)\n- `does_not_end_with` - does not end with (attribute exists and does not end with the specified value)\n\n#### Special Operators\n- `is_any` - matches any value, ignoring whether the key exists or not\n","type":"string","enum":["is","is_not","is_set","is_not_set","is_one_of","is_not_one_of","gt","lt","gte","lte","matches","does_not_match","contains","does_not_contain","starts_with","does_not_start_with","ends_with","does_not_end_with","is_any"]},"AttributeFilterStringValue":{"description":"AttributeFilterStringValue may contain a primitive value such as a regex pattern or string.","type":"string"},"AxisScale":{"type":"string","enum":["linear","log10"]},"CardholderDataRedactionSettings":{"description":"Opt-in detection and redaction of payment card numbers and related sensitive data in ingested\ntelemetry, applied before Dash0 persists the signal. Matching values are masked or replaced in\nplace; signals are never dropped. Detection is pattern-based and cannot catch encoded, encrypted,\nor split card numbers, so filtering at the source remains the primary mechanism.\nAbsent means disabled.\n","type":"object","properties":{"enabled":{"description":"Whether cardholder-data redaction is enabled for this dataset.\n","type":"boolean"}},"required":["enabled"]},"ChangeGateComparison":{"description":"How the change gate's `value` is compared against the observed quantity's recent level.\n\n- `absolute_delta`: The observed quantity must differ from its recent level by at least\n  `value`, in the unit of the observed quantity itself and in the worsening direction defined\n  by the rule's absolute threshold comparator.\n- `relative_factor`: The observed quantity must differ from its recent level by at least\n  `value` times in the worsening direction defined by the rule's absolute threshold comparator.\n","type":"string","enum":["absolute_delta","relative_factor"]},"CheckThresholdBaseline":{"description":"Adaptive baseline detector configuration. Its presence on `CheckThresholds` re-interprets\n`degraded` and `failed` as z-score cutoffs against the check rule's own predicted value and\ntypical spread.\n","properties":{"direction":{"$ref":"#/components/schemas/AnomalyDirection","description":"Which deviations from the prediction fail the check. For a hand-written expression there\nis no `parsedExpression` and therefore no `thresholdComparator`, so this is the sole\nsource of truth for directionality.\n"},"spreadFloor":{"description":"Optional minimum seasonal spread, expressed as a fraction of the prediction. The server\ndefault is used when omitted. For example, `0.05` makes a sensitivity cutoff of `3`\nrequire at least a 15% deviation when the measured spread is smaller.\n","type":"number","format":"double","minimum":0,"exclusiveMinimum":true},"volumeFloor":{"description":"Optional minimum predicted volume required for the detector to evaluate. The unit is\nthe observed quantity's unit, so suitable values depend on the selected signal.\n","type":"number","format":"double","minimum":0,"exclusiveMinimum":true}},"required":["direction"]},"CheckThresholdChangeGate":{"description":"Change gate configuration. Its presence on `CheckThresholds` leaves `degraded` and `failed`\nabsolute, but additionally requires the observed quantity to be materially worse than it was\nover `baselineWindow` before the check fails. The check rule expression must provide the\nabsolute threshold comparator through its parsed expression or a hand-written top-level\ncomparison; otherwise the write is rejected.\n","properties":{"comparison":{"$ref":"#/components/schemas/ChangeGateComparison"},"value":{"description":"The minimum change required, interpreted according to `comparison`.\n","type":"number","format":"double"},"baselineWindow":{"$ref":"#/components/schemas/Duration","description":"The window the observed quantity's recent level is derived from.\n"},"volumeFloor":{"description":"Optional minimum windowed recent level required for the detector to evaluate. The unit\nis the observed quantity's unit, so suitable values depend on the selected signal.\n","type":"number","format":"double","minimum":0,"exclusiveMinimum":true}},"required":["comparison","value","baselineWindow"]},"CheckThresholds":{"description":"Thresholds to use for the `$__threshold` variable in the expression field.\n\nBy default `degraded` and `failed` are absolute values. The optional `baseline` and\n`changeGate` sub-objects are detector configuration: **the presence of one of them is the\ndiscriminator** that changes how `degraded` and `failed` are interpreted.\n\n- Neither present: `degraded` and `failed` are absolute values compared against the\n  expression's own value, as they always have been.\n- `baseline` present: `degraded` and `failed` are re-interpreted as z-score cutoffs —\n  multiples of the watched entity's own typical spread away from its prediction — rather\n  than as absolute values. Each configured cutoff must be greater than `0` and less than\n  `1000000`, the detector score cap.\n- `changeGate` present: `degraded` and `failed` stay absolute, but the check additionally\n  requires the value to have become materially worse than it recently was before it fails.\n\nAt most one of `baseline` and `changeGate` may be set. A request setting both is rejected\nwith a `400`; the mutual exclusion is enforced by the server rather than by this schema,\nmatching the existing treatment of `metric` versus `servicesMetricQuery`.\n","properties":{"degraded":{"description":"The threshold value that defines when the check is in a degraded state. The value will be\ninterpolated into the expression field as `$__threshold`.\n\nInterpreted as a z-score cutoff rather than an absolute value when `baseline` is set.\n","type":"number","format":"double"},"failed":{"description":"The threshold value that defines when the check is in a failed state. The value will be\ninterpolated into the expression field as `$__threshold`.\n\nInterpreted as a z-score cutoff rather than an absolute value when `baseline` is set.\n","type":"number","format":"double"},"baseline":{"$ref":"#/components/schemas/CheckThresholdBaseline","description":"Compare the check rule's observed quantity against its own past instead of against an\nabsolute value. Setting this re-interprets `degraded` and `failed` as z-score cutoffs.\n\nMutually exclusive with `changeGate`.\n"},"changeGate":{"$ref":"#/components/schemas/CheckThresholdChangeGate","description":"Require the observed quantity to have changed materially compared to a recent window\nbefore the absolute `degraded` / `failed` thresholds are allowed to fail the check.\n`degraded` and `failed` remain absolute values.\n\nMutually exclusive with `baseline`.\n"}}},"CrdSource":{"description":"Origin of a Dash0 resource, derived from `dash0.com/origin` on read.\n- `ui`: created interactively in the Dash0 UI.\n- `terraform`: managed via the Dash0 Terraform provider.\n- `operator`: managed via the Dash0 Kubernetes operator.\n- `dash0-cli`: managed via the Dash0 CLI.\n- `platform`: owned by Dash0 rather than by anyone in your organization. Covers both\n  resources Dash0 generates from another resource you own (the recording rules an SLO\n  produces) and resources Dash0 ships with the product (the built-in views).\n- `api`: created directly through the API, and the fallback for any origin whose\n  prefix is not recognized.\n\nNew values may be added over time. Treat an unrecognized value as `api`\nrather than rejecting the response.\n","type":"string","enum":["ui","terraform","operator","dash0-cli","platform","api"]},"Cursor":{"description":"The cursor to another set of results. The value of this field is opaque to the\nclient and may be used as a parameter to the next request to get the another set of results.\nCursors do not implement any ordering.\n","type":"string"},"CursorPagination":{"description":"Cursor pagination is a technique for paging through a result set using a cursor. It is\nsimilar to offset pagination except that the cursor is an opaque value that encodes the\nposition within the result set. This allows for fetching the next page of results from\nthe current position without having to skip over a potentially large number of rows.\n\nIt is also more resilient against late-arriving data which otherwise would cause issues\nwith offset pagination. For example, if a row is inserted between two pages of results\nthen the second page would contain a duplicate row and the third page would be missing.\n","properties":{"cursor":{"$ref":"#/components/schemas/Cursor"},"limit":{"description":"The maximum number of results to return. If not set, there is a default limit to the number of results returned.\n","type":"integer","format":"int64","example":10}}},"D0QLWarnings":{"type":"array","items":{"type":"string"}},"DarkplaneConfig":{"description":"Darkplane-specific opt-ins for this dataset.\n","properties":{"respectNativeCodingAgentTelemetry":{"$ref":"#/components/schemas/RespectNativeCodingAgentTelemetry","description":"Darkplane processing of OpenTelemetry telemetry natively emitted by coding agents.\nDefaults to `disabled` for new and existing datasets.\n"}}},"DashboardAnnotations":{"properties":{"dash0.com/deleted-at":{"type":"string","format":"date-time"},"dash0.com/folder-path":{"description":"Optional UI folder path for organising groups (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"dash0.com/sharing":{"description":"Comma-separated list of principals to grant read access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Sharing is honored only on assets that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API). Setting it on an asset that declares no dash0.com/origin is rejected with a 400 — manage that asset's access via the UI share dialog instead.","type":"string"}}},"DashboardApiListItem":{"properties":{"id":{"type":"string"},"origin":{"type":"string"},"dataset":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}},"required":["id","dataset","tags"]},"DashboardDefinition":{"description":"A dashboard definition that is compatible with Perses' dashboarding system.\n","properties":{"kind":{"type":"string","enum":["Dashboard"]},"metadata":{"$ref":"#/components/schemas/DashboardMetadata"},"spec":{"type":"object"}},"required":["kind","metadata","spec"]},"DashboardLabels":{"properties":{"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}}},"DashboardMetadata":{"properties":{"name":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"version":{"type":"integer","format":"int64","minimum":0},"project":{"type":"string"},"dash0Extensions":{"$ref":"#/components/schemas/DashboardMetadataExtensions"},"labels":{"$ref":"#/components/schemas/DashboardLabels"},"annotations":{"$ref":"#/components/schemas/DashboardAnnotations"}},"required":["name"]},"DashboardMetadataExtensions":{"properties":{"tags":{"type":"array","items":{"type":"string"}},"dataset":{"$ref":"#/components/schemas/Dataset"},"id":{"description":"An immutable id field to support automatic dashboard creation based on Kubernetes CRDs. This\nfield essentially acts as an external ID for the dashboard. We support a way to upsert dashboards based\non this field.\n","type":"string"},"origin":{"description":"This field is deprecated and is replaced by id field.\n","type":"string","deprecated":true},"createdBy":{"description":"The member ID of the user who created this dashboard or dashboard version.","type":"string"}}},"Dataset":{"description":"Optional dataset to query across. Defaults to whatever is configured to be the default dataset for the organization.","type":"string","pattern":"^[a-zA-Z0-9_-]{3,26}$"},"DatasetAction":{"type":"string","enum":["dataset:read","dataset:write","dataset:delete","dataset:createSyntheticCheck","dataset:createCheckRule","dataset:createRecordingRuleGroup","dataset:createSLO","dataset:createAgent0Automation"]},"DatasetLoggingSettings":{"type":"object","properties":{"retention":{"$ref":"#/components/schemas/RetentionClass"}},"required":["retention"]},"DatasetMetricsSettings":{"type":"object","properties":{"retention":{"$ref":"#/components/schemas/RetentionClass"}},"required":["retention"]},"DatasetPermission":{"properties":{"teamId":{"type":"string"},"userId":{"type":"string"},"role":{"type":"string"},"actions":{"type":"array","items":{"$ref":"#/components/schemas/DatasetAction"}}},"required":["actions"]},"DatasetProfilingSettings":{"type":"object","properties":{"retention":{"$ref":"#/components/schemas/RetentionClass"}},"required":["retention"]},"DatasetRestriction":{"type":"string","enum":["restricted","unrestricted"]},"DatasetSettings":{"properties":{"slug":{"$ref":"#/components/schemas/Dataset"},"name":{"type":"string"},"version":{"type":"integer"},"preferred":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"tracing":{"$ref":"#/components/schemas/DatasetTracingSettings"},"logging":{"$ref":"#/components/schemas/DatasetLoggingSettings"},"metrics":{"$ref":"#/components/schemas/DatasetMetricsSettings"},"profiling":{"$ref":"#/components/schemas/DatasetProfilingSettings"},"webEvents":{"$ref":"#/components/schemas/DatasetWebEventsSettings"},"semanticConventionUpgrades":{"$ref":"#/components/schemas/SemanticConventionUpgrades"},"telemetryFilters":{"type":"array","items":{"$ref":"#/components/schemas/TelemetryFilter"}},"ipAddresses":{"$ref":"#/components/schemas/IpAddressesSettings"},"geoLocation":{"$ref":"#/components/schemas/GeoLocationSettings"},"genAiAttributeRedaction":{"$ref":"#/components/schemas/GenAIAttributeRedactionSettings","description":"Controls redaction of supported GenAI attributes before Collector export.\nAbsent policies default to `disabled` for new and existing datasets.\n"},"cardholderDataRedaction":{"$ref":"#/components/schemas/CardholderDataRedactionSettings","description":"Controls detection and redaction of payment card numbers and related sensitive data before\nDash0 persists the signal. Absent means disabled for new and existing datasets.\n"},"darkplane":{"$ref":"#/components/schemas/DarkplaneConfig","description":"Darkplane-specific opt-ins for this dataset.\nAbsent opt-ins default to `disabled` for new and existing datasets.\n"},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/DatasetPermission"}},"permittedActions":{"type":"array","items":{"$ref":"#/components/schemas/DatasetAction"}}},"required":["slug","name","tracing","logging","metrics","profiling","webEvents","semanticConventionUpgrades","telemetryFilters","ipAddresses","geoLocation"]},"DatasetTracingSettings":{"type":"object","properties":{"retention":{"$ref":"#/components/schemas/RetentionClass"},"convertSpanEventsToLogRecords":{"description":"When enabled, span events are automatically converted to log records correlated with the parent span\nvia traceId and spanId. This supports the migration away from the deprecated Span Event API towards\nthe unified OTel event model where events are log records with names. Converted log records are tagged\nwith the `dash0.span_event.converted` attribute.\n","type":"boolean","default":false}},"required":["retention"]},"DatasetWebEventsSettings":{"type":"object","properties":{"retention":{"$ref":"#/components/schemas/RetentionClass"}},"required":["retention"]},"DiscordWebhookConfig":{"properties":{"url":{"type":"string","format":"url"}},"required":["url"]},"Duration":{"type":"string","pattern":"(\\d+(ms|s|m|h|d|w|M|Q|y))+"},"EmailConfig":{"properties":{"recipient":{"type":"string","format":"email"},"plaintext":{"type":"boolean"}},"required":["recipient"],"deprecated":true,"x-deprecated-reason":"Superseded by EmailV2Config"},"EmailV2Config":{"properties":{"recipients":{"type":"array","items":{"type":"string","format":"email"}},"plaintext":{"type":"boolean"}},"required":["recipients"]},"EmptyAgenticWorkflowTriggerSpec":{"properties":{},"required":[]},"Error":{"properties":{"code":{"description":"HTTP status code.\n","type":"integer"},"type":{"description":"Stable `snake_case` identifier for the kind of error, safe for clients to branch on. Not\nan enum: treat an unrecognized value the same as an absent one and fall back to `message`,\nso a new error kind never breaks the contract. Optional — absent means unclassified, not\nsuccess.\n","type":"string"},"message":{"description":"Human-readable description of the error. Safe to display.\n","type":"string"},"traceId":{"description":"Trace ID for the request that produced the error, for correlating with logs and traces.\n","type":"string"}},"required":["code","message"]},"ErrorAssertion":{"properties":{"kind":{"type":"string","enum":["error"]},"spec":{"$ref":"#/components/schemas/ErrorAssertionSpec"}},"required":["kind","spec"]},"ErrorAssertionSpec":{"properties":{"value":{"$ref":"#/components/schemas/SyntheticHttpErrorType"}},"required":["value"]},"ErrorResponse":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/Error"}},"required":["error"]},"ExecuteSqlRequest":{"properties":{"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"query":{"type":"string"}},"required":["timeRange","query"]},"ExecuteSqlResponse":{"properties":{"executionTime":{"$ref":"#/components/schemas/FixedTime"},"timeRange":{"$ref":"#/components/schemas/TimeRange"},"error":{"type":"string"},"queryError":{"$ref":"#/components/schemas/QueryError"},"progress":{"$ref":"#/components/schemas/Progress"},"resultRows":{"$ref":"#/components/schemas/ResultRows"},"warnings":{"$ref":"#/components/schemas/D0QLWarnings"}},"required":["executionTime","timeRange","warnings"]},"FailedCheckAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["failed_check.new"]}]},"spec":{"$ref":"#/components/schemas/FailedCheckAgenticWorkflowTriggerSpec"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"FailedCheckAgenticWorkflowTriggerSpec":{"type":"object","properties":{"checkRuleIDs":{"description":"Optional list of check rule IDs. When specified, only failed checks\nwhose rule ID matches one of the listed values trigger the automation.\n","type":"array","items":{"type":"string"}},"labelFilters":{"$ref":"#/components/schemas/FilterCriteria","description":"Optional filters applied to check labels at dispatch time. When defined\nand not empty, only failed checks whose labels satisfy all filter criteria\ntrigger this automation (AND semantics). Each criterion specifies a label key\nand a matching operator (e.g., is, contains, starts_with, matches).\n"},"annotationFilters":{"$ref":"#/components/schemas/FilterCriteria","description":"Optional filters applied to check annotations at dispatch time. When defined\nand not empty, only failed checks whose annotations satisfy all filter\ncriteria trigger this automation (AND semantics). Each criterion specifies an\nannotation key and a matching operator (e.g., is, contains, starts_with, matches).\n"},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"$ref":"#/components/schemas/FailedCheckTriggerVariableName"},"readOnly":true}}},"FailedCheckTriggerVariableName":{"description":"Variables provided by the `failed_check.new` trigger.\n\n- `check.id`: The ID of the check rule that failed.\n- `check.name`: The name of the check rule that failed.\n- `issue.identifier`: The specific issue that fired. One rule can have several concurrent issues, so this identifies which one triggered the run. Absent when the dispatching producer predates the field.\n","type":"string","enum":["check.id","check.name","issue.identifier"]},"FailedHttpCheckAssertion":{"description":"Information about a failed HTTP check assertion","properties":{"assertion":{"$ref":"#/components/schemas/HttpCheckAssertion","description":"The assertion that"},"actualValue":{"description":"The actual value that was received in the response","type":"string"},"explanation":{"description":"A human-readable message explaining why the assertion failed","type":"string"}},"required":["assertion","explanation"]},"FilterCriteria":{"type":"array","items":{"$ref":"#/components/schemas/AttributeFilter"},"example":[{"key":"service.name","operator":"is","value":"foo"}]},"FixedTime":{"description":"A fixed point in time represented as an RFC 3339 date-time string.\n\n**Format**: `YYYY-MM-DDTHH:MM:SSZ` (UTC) or `YYYY-MM-DDTHH:MM:SS±HH:MM` (with timezone offset)\n\n**Examples**:\n- `2024-01-15T14:30:00Z`\n- `2024-01-15T14:30:00+08:00`\n","type":"string","format":"date-time"},"FixedTimeUnix":{"description":"The time corresponding to the given unix time in seconds and nanoseconds (as decimal places) since January 1, 1970 UTC.","type":"string"},"GenAIAttributeRedaction":{"description":"Controls whether sensitive GenAI attribute values are redacted by the Collector.\n\n- `disabled`: Preserve GenAI attribute values unchanged.\n- `redact`: Replace the affected GenAI attribute content with a redacted value.\n","type":"string","enum":["disabled","redact"]},"GenAIAttributeRedactionSettings":{"description":"Fine-grained redaction policies for GenAI attributes, applied by the Collector before export.\nConversation content, tool-call I/O and tool-call error messages are controlled independently,\ne.g. to keep conversation content private while still storing tool input/output.\n","properties":{"conversation":{"$ref":"#/components/schemas/GenAIAttributeRedaction","description":"Redaction of conversation content: `gen_ai.input.messages`, `gen_ai.output.messages`,\nand `gen_ai.system_instructions`.\nDefaults to `disabled` for new and existing datasets.\n"},"toolCalls":{"$ref":"#/components/schemas/GenAIAttributeRedaction","description":"Redaction of tool-call input and output: `gen_ai.tool.call.arguments` and\n`gen_ai.tool.call.result`.\nDefaults to `disabled` for new and existing datasets.\n"},"errors":{"$ref":"#/components/schemas/GenAIAttributeRedaction","description":"Redaction of tool-call error messages: the span status message and `exception.message`\nattributes on spans, span events and log records that carry a `gen_ai.tool.name`\nattribute.\nDefaults to `disabled` for new and existing datasets.\n"}}},"GeoLocationSettings":{"properties":{"endUserGeoLocationStorageStrategy":{"$ref":"#/components/schemas/GeoLocationStorageStrategy","description":"When we derive IP addresses from X-FORWARDED-FOR/X-REAL-IP HTTP headers, we will apply these rules.\n"}},"required":["endUserGeoLocationStorageStrategy"]},"GeoLocationStorageStrategy":{"description":"What kind of geolocation information we are allowed to derive and store.","type":"string","enum":["up_to_city","up_to_country","do_not_store"]},"GetAgenticWorkflowsResponse":{"properties":{"agenticWorkflows":{"type":"array","items":{"$ref":"#/components/schemas/AgenticWorkflowDefinition"}}},"required":["agenticWorkflows"]},"GetLogRecordsRequest":{"properties":{"filter":{"$ref":"#/components/schemas/FilterCriteria"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"sampling":{"$ref":"#/components/schemas/Sampling"},"ordering":{"$ref":"#/components/schemas/OrderingCriteria","description":"The ordering criteria for the returned logs.\nSupported ordering key: `otel.log.time` (log timestamp, defaults to descending)\n"},"pagination":{"$ref":"#/components/schemas/CursorPagination","description":"Cursor pagination for log records.\n- Maximum and default limit: 200 elements per page\n- We do not guarantee that the requested number of elements will be returned per page\n- Multiple pages may be required to retrieve the requested number of signals\n"}},"required":["timeRange"]},"GetLogRecordsResponse":{"description":"Response for the `GetLogRecords` API. The response contains the log records that match the request.\n\nThis API deliberately reuses the full OTLP JSON format for logs. This is done to aid compatibility\nwith existing OTLP consumers.\n","properties":{"executionTime":{"$ref":"#/components/schemas/FixedTime","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"timeRange":{"$ref":"#/components/schemas/TimeRange","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"cursors":{"$ref":"#/components/schemas/NextCursors","description":"The cursors for the next sets of results. This property is included\nto support pagination through the result set when additional pages are available.\n"},"resourceLogs":{"description":"There is one `ResourceLogs` per resource. This is aligned to the data most OTLP batching algorithms would\nproduce, where there is one `ResourceLogs` per resource. This is done to aid compatibility with existing\nOTLP consumers.\n\n`ResourceLogs` are **NOT** sorted. There is no guarantee that `ResourceLogs` are sorted or that\n`LogRecord`s within them are sorted. However, it is guaranteed that all data is sorted across paged\nrequests.\n\nClients are advised to implement sorting within a page descending by the `LogRecord`'s `timeUnixNano`,\n`observedTimeUnixNano` and then `id`.\n","type":"array","items":{"$ref":"#/components/schemas/ResourceLogs"}}},"required":["resourceLogs"]},"GetSamplingRulesResponse":{"properties":{"samplingRules":{"type":"array","items":{"$ref":"#/components/schemas/SamplingDefinition"}}},"required":["samplingRules"]},"GetSignalToMetricsResponse":{"properties":{"signalToMetrics":{"type":"array","items":{"$ref":"#/components/schemas/SignalToMetricsDefinition"}},"hasMore":{"description":"Whether there are more results beyond the current page. Only present when pagination is used.","type":"boolean"},"total":{"description":"Total number of rules matching the request filters, ignoring pagination.","type":"integer"},"counts":{"$ref":"#/components/schemas/SignalToMetricsCounts","description":"Rule counts per source signal, matching the request filters and ignoring pagination.\nPresent under the same conditions as `total`, and absent rather than zero-filled when\nunavailable — a consumer must not read a missing `counts` as \"no rules\".\n"}},"required":["signalToMetrics"]},"GetSpamFiltersResponse":{"properties":{"spamFilters":{"type":"array","items":{"$ref":"#/components/schemas/SpamFilterDefinition"}}},"required":["spamFilters"]},"GetSpansRequest":{"properties":{"filter":{"$ref":"#/components/schemas/FilterCriteria"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"sampling":{"$ref":"#/components/schemas/Sampling"},"ordering":{"$ref":"#/components/schemas/OrderingCriteria","description":"The ordering criteria for the returned spans.\nSupported ordering key: `otel.span.start_time` (span start timestamp, defaults to descending)\n"},"pagination":{"$ref":"#/components/schemas/CursorPagination","description":"Cursor pagination for spans.\n- Maximum and default limit: 200 elements per page\n- We do not guarantee that the requested number of elements will be returned per page\n- Multiple pages may be required to retrieve the requested number of signals\n"}},"required":["timeRange"]},"GetSpansResponse":{"description":"Response for the `GetSpans` API. The response contains the spans that match the request.\n\nThis API deliberately reuses the full OTLP JSON format for spans. This is done to aid compatibility\nwith existing OTLP consumers.\n","properties":{"executionTime":{"$ref":"#/components/schemas/FixedTime","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"timeRange":{"$ref":"#/components/schemas/TimeRange","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"cursors":{"$ref":"#/components/schemas/NextCursors","description":"The cursors for the next sets of results. This property is included\nto support pagination through the result set when additional pages are available.\n"},"resourceSpans":{"description":"There is one `ResourceSpan` per resource. This is aligned to the data most OTLP batching algorithms would\nproduce, where there is one `ResourceSpan` per resource. This is done to aid compatibility with existing\nOTLP consumers.\n\n`Spans` nested in `ResourceSpans` are **ONLY** sorted if an explicit ordering has been defined. However,\nit is guaranteed that all data is sorted across paged requests.\n","type":"array","items":{"$ref":"#/components/schemas/ResourceSpans"}}},"required":["resourceSpans"]},"GetTeamResponse":{"properties":{"team":{"$ref":"#/components/schemas/TeamDefinitionV1Alpha1"},"members":{"type":"array","items":{"$ref":"#/components/schemas/MemberDefinition"}},"dashboards":{"type":"array","items":{"$ref":"#/components/schemas/AccessibleAsset"}},"checkRules":{"type":"array","items":{"$ref":"#/components/schemas/AccessibleAsset"}},"syntheticChecks":{"type":"array","items":{"$ref":"#/components/schemas/AccessibleAsset"}},"views":{"type":"array","items":{"$ref":"#/components/schemas/AccessibleAsset"}},"datasets":{"type":"array","items":{"$ref":"#/components/schemas/AccessibleAsset"}}},"required":["team","members","dashboards","checkRules","syntheticChecks","views","datasets"]},"GetTraceIdsRequest":{"description":"Request to retrieve unique trace IDs of traces that contain at least one span matching the\ngiven filters. This is a lightweight alternative to `GetSpans` for two-step workflows where\nonly trace IDs are needed first, and full trace details are subsequently retrieved via\n`GetTrace` (`POST /api/trace/details`).\n","properties":{"filter":{"$ref":"#/components/schemas/FilterCriteria"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"sampling":{"$ref":"#/components/schemas/Sampling"},"ordering":{"$ref":"#/components/schemas/OrderingCriteria","description":"The ordering criteria for the returned trace IDs. Only `otel.trace.start_time` descending\nis supported (this is also the default when omitted). Any other key, ascending direction,\nor multiple criteria will be rejected with a 400 response. A trace's start time is the\ntimestamp of its earliest matching span; trace IDs are returned ordered by that value.\n"},"pagination":{"$ref":"#/components/schemas/CursorPagination","description":"Cursor pagination for trace IDs.\n- Maximum and default limit: 5000 elements per page\n- Multiple pages may be required to retrieve all matching trace IDs\n"}},"required":["timeRange"]},"GetTraceIdsResponse":{"description":"Response for the `GetTraceIds` API. Contains an array of unique trace IDs that match the\nrequest filters, ordered by the timestamp of their earliest matching span (descending).\n","properties":{"traceIds":{"description":"Array of unique trace IDs as hex-encoded strings, ordered by the timestamp of each\ntrace's earliest matching span (descending).\n","type":"array","items":{"type":"string"}},"cursors":{"$ref":"#/components/schemas/NextCursors","description":"The cursors for the next sets of results. This property is included to support\npagination through the result set when additional pages are available.\n"}},"required":["traceIds"]},"GetTraceRequest":{"properties":{"dataset":{"$ref":"#/components/schemas/Dataset"},"traceId":{"type":"string"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange","description":"Optional time range hint to bound the trace metadata lookup. When provided, the backend\nrestricts the `AggregatedTraceMetadata` query to this window (with a small buffer) and\nwill not fall back to a full-table scan. When absent, the backend uses a default short\nwindow with a full-scan fallback for backward compatibility — this fallback can be\nexpensive on large datasets. API consumers are strongly encouraged to provide a\n`timeRange` covering when the trace occurred.\n"},"includeLinkedTraces":{"description":"If true, recursively fetches all traces referenced via forward links (dash0ForwardLinks)\nand returns them in `additionalResourceSpans`. Implies includeOTLPSchemaExtensions=true.\n","type":"boolean","default":false}},"required":["traceId"]},"GetTraceResponse":{"description":"Response for the `GetTrace` API. The response contains the spans and logs that match the request.\n\nThis API deliberately reuses the full OTLP JSON format for spans and logs. This is done to aid compatibility\nwith existing OTLP consumers.\n","properties":{"resourceSpans":{"type":"array","items":{"$ref":"#/components/schemas/ResourceSpans"}},"resourceLogs":{"type":"array","items":{"$ref":"#/components/schemas/ResourceLogs"}},"webEvents":{"type":"array","items":{"$ref":"#/components/schemas/ResourceLogs"},"minItems":0,"maxItems":1},"syntheticCheckAttemptDetails":{"$ref":"#/components/schemas/SyntheticCheckAttemptDetails"},"additionalResourceSpans":{"description":"Resource spans from linked traces. Only populated when includeLinkedTraces=true.\n","type":"array","items":{"$ref":"#/components/schemas/ResourceSpans"}}},"required":["resourceSpans","resourceLogs","webEvents"]},"GitHubAgenticWorkflowTriggerSpec":{"properties":{"actions":{"description":"Optional list of GitHub event actions to filter on.\nWhen specified, only events with a matching action trigger the workflow.\nWhen omitted, events with any action match.\n\nNote: `github.deployment`, `github.deployment_status`, and `github.workflow_dispatch` fire no action field; this filter has no effect for those trigger kinds. `github.deployment_status` filters on `states` instead.\n\nValid values per trigger kind:\n- `github.pull_request`: `assigned`, `auto_merge_disabled`, `auto_merge_enabled`, `closed`, `converted_to_draft`, `demilestoned`, `dequeued`, `edited`, `enqueued`, `labeled`, `locked`, `milestoned`, `opened`, `ready_for_review`, `reopened`, `review_request_removed`, `review_requested`, `synchronize`, `unassigned`, `unlabeled`, `unlocked`\n- `github.pull_request_review`: `dismissed`, `edited`, `submitted`\n- `github.pull_request_review_comment`: `created`, `deleted`, `edited`\n- `github.issue_comment`: `created`, `deleted`, `edited`, `pinned`, `unpinned`\n- `github.release`: `created`, `deleted`, `edited`, `prereleased`, `published`, `released`, `unpublished`\n- `github.workflow_run`: `completed`, `requested`, `in_progress`\n- `github.workflow_job`: `queued`, `waiting`, `in_progress`, `completed`\n- `github.check_run`: `completed`, `created`, `requested_action`, `rerequested`\n- `github.check_suite`: `completed`, `requested`, `rerequested`\n","type":"array","items":{"type":"string"}},"organizations":{"description":"Optional list of GitHub organization logins to filter on (e.g., `my-org`). An\n\"organization\" here is the account the Dash0 GitHub App is installed on — usually a\nGitHub organization, but a personal account for personal installations.\nWhen specified, only events from these organizations trigger the automation.\nWhen omitted, events from any organization match.\n\nReplaces the deprecated `accounts` field. When both are set, they must carry the\nsame values; requests where they contradict each other are rejected.\n","type":"array","items":{"type":"string"}},"allOrganizations":{"description":"When true, the automation deliberately matches events from every organization, now and\nin the future. Mutually exclusive with a non-empty `organizations` list. This flag\nexists to distinguish an explicit \"all organizations\" choice from an unconfigured\ntrigger: a GitHub trigger with no `organizations`, no `allOrganizations`, no\n`repositories`, no `allRepositories`, and (for comment kinds) no `keyword` is rejected\non write as an accidental match-everything catch-all.\n\n`organizations`/`allOrganizations` and `repositories`/`allRepositories` are independent\nalternatives, not nested: an event matching either the organization filter or the\nrepository filter triggers the automation.\n\nReplaces the deprecated `allAccounts` field. When both are set, they must carry the\nsame value; requests where they contradict each other are rejected.\n","type":"boolean"},"accounts":{"description":"Deprecated: use `organizations` instead. Kept for backwards compatibility; reads\nmirror the value of `organizations` and writes are folded into it.\n","type":"array","items":{"type":"string"},"deprecated":true},"allAccounts":{"description":"Deprecated: use `allOrganizations` instead. Kept for backwards compatibility; reads\nmirror the value of `allOrganizations` and writes are folded into it.\n","type":"boolean","deprecated":true},"repositories":{"description":"Optional list of repository full names to filter on (e.g., `owner/repo`).\nWhen specified, only events from these repositories trigger the automation.\nWhen omitted, events from any repository match.\n","type":"array","items":{"type":"string"}},"allRepositories":{"description":"When true, the automation deliberately matches events from every repository, now and\nin the future. Mutually exclusive with a non-empty `repositories` list. This flag\nexists to distinguish an explicit \"all repositories\" choice from an unconfigured\ntrigger, mirroring `allOrganizations`.\n","type":"boolean"},"states":{"description":"Optional list of deployment statuses to filter on. Only `github.deployment_status` uses\nthis filter; it has no effect for other trigger kinds. When specified, only\ndeployment-status events whose `state` matches trigger the automation. When omitted, any\nstatus matches.\n\nValid values: `error`, `failure`, `inactive`, `pending`, `success`, `queued`, `in_progress`.\n","type":"array","items":{"type":"string"}},"checkRunStatuses":{"description":"Optional list of check run statuses to filter on. Only `github.deployment_status` uses this\nfilter; it has no effect for other trigger kinds. The `deployment_status` event payload may\ncarry an associated `check_run`; when specified, only events whose `check_run.status` matches\ntrigger the automation. When omitted, any check run status (or none) matches.\n\nValid values: `queued`, `in_progress`, `completed`, `waiting`, `pending`.\n","type":"array","items":{"type":"string"}},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubTriggerVariableName"},"readOnly":true}}},"GitHubCheckActivityAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"branches":{"description":"Optional list of branch names to filter on, matched against the check's associated\ncommit branch. When omitted, checks on any branch match.\n","type":"array","items":{"type":"string"}}}}]},"GitHubCheckRunAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.check_run"]}]},"spec":{"$ref":"#/components/schemas/GitHubCheckRunAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the pull request\nthe check ran on, falling back to the branch when no pull request is associated.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubCheckRunAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubCheckActivityAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"conclusions":{"description":"Optional list of conclusions to filter on. Only applies to `completed` events.\nWhen omitted, check runs with any conclusion match.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubCheckRunConclusion"}},"statuses":{"description":"Optional list of statuses to filter on. Applies to check runs at any lifecycle\nstage, not only completed ones. When omitted, check runs with any status match.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubCheckRunStatus"}}}}]},"GitHubCheckRunConclusion":{"description":"The conclusion of a GitHub check run.\n\n- `success`: The check run completed successfully.\n- `failure`: The check run failed.\n- `neutral`: The check run completed with a neutral result.\n- `cancelled`: The check run was cancelled.\n- `timed_out`: The check run timed out.\n- `action_required`: The check run requires manual action.\n- `stale`: The check run went stale (its check suite was superseded by a newer commit).\n- `skipped`: The check run was skipped.\n- `startup_failure`: The check run failed to start.\n- `waiting`: The check run is waiting on an external condition.\n- `pending`: The check run is pending.\n","type":"string","enum":["success","failure","neutral","cancelled","timed_out","action_required","stale","skipped","startup_failure","waiting","pending"]},"GitHubCheckRunStatus":{"description":"The status of a GitHub check run.\n\n- `queued`: The check run is queued.\n- `in_progress`: The check run is in progress.\n- `completed`: The check run has completed (see `conclusions` for the outcome).\n- `pending`: The check run is pending.\n","type":"string","enum":["queued","in_progress","completed","pending"]},"GitHubCheckSuiteAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.check_suite"]}]},"spec":{"$ref":"#/components/schemas/GitHubCheckSuiteAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the pull request\nthe check suite ran on, falling back to the branch when no pull request is associated.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubCheckSuiteAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubCheckActivityAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"conclusions":{"description":"Optional list of conclusions to filter on. Only applies to `completed` events.\nWhen omitted, check suites with any conclusion match.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubCheckSuiteConclusion"}},"statuses":{"description":"Optional list of statuses to filter on. Applies to check suites at any lifecycle\nstage, not only completed ones. When omitted, check suites with any status match.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubCheckSuiteStatus"}}}}]},"GitHubCheckSuiteConclusion":{"description":"The conclusion of a GitHub check suite.\n\n- `success`: Every check run in the suite completed successfully.\n- `failure`: At least one check run in the suite failed.\n- `neutral`: The suite completed with a neutral result.\n- `cancelled`: The suite was cancelled.\n- `timed_out`: The suite timed out.\n- `action_required`: The suite requires manual action.\n- `stale`: The suite went stale (superseded by a newer commit).\n- `skipped`: The suite was skipped.\n- `startup_failure`: The suite failed to start.\n","type":"string","enum":["success","failure","neutral","cancelled","timed_out","action_required","stale","skipped","startup_failure"]},"GitHubCheckSuiteStatus":{"description":"The status of a GitHub check suite.\n\n- `requested`: The check suite was requested.\n- `in_progress`: The check suite is in progress.\n- `completed`: The check suite has completed (see `conclusions` for the outcome).\n- `queued`: The check suite is queued.\n- `pending`: The check suite is pending.\n","type":"string","enum":["requested","in_progress","completed","queued","pending"]},"GitHubCommentAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"keyword":{"description":"Optional keyword the comment body must contain. Evaluated as a\ncase-insensitive substring match (e.g., \"investigate\" matches any\ncomment containing \"investigate\"). When absent or empty, any comment\nfires the automation.\n","type":"string"}}}]},"GitHubDeploymentAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.deployment"]}]},"spec":{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the\ndeployment, so its `github.deployment_status` events resume the same thread.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubDeploymentStatusAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.deployment_status"]}]},"spec":{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the\ndeployment (the `github.deployment` event that created it).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubIssueCommentAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.issue_comment"]}]},"spec":{"$ref":"#/components/schemas/GitHubCommentAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the pull\nrequest (`github.pull_request`), keyed by the PR number from the comment's issue.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubPullRequestAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.pull_request"]}]},"spec":{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the pull\nrequest (`github.pull_request`).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubPullRequestReviewAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.pull_request_review"]}]},"spec":{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the pull\nrequest (`github.pull_request`).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubPullRequestReviewCommentAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.pull_request_review_comment"]}]},"spec":{"$ref":"#/components/schemas/GitHubCommentAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the pull\nrequest (`github.pull_request`).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubReleaseAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.release"]}]},"spec":{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the\nrelease (keyed by release tag).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubTriggerVariableName":{"description":"Variables provided by all GitHub-based triggers.\n\n- `github.action`: The GitHub event action (e.g., `opened`, `created`, `completed`).\n- `github.account`: The GitHub account login (organization or user).\n- `github.repository`: Full repository name (e.g., `owner/repo`).\n- `github.installation.id`: The GitHub App installation id the event came from.\n- `github.pull_request.number`: The pull request number. Present on pull-request, review,\n  review-comment, and issue-comment triggers (when the comment is on a PR; these are the\n  triggers that can continue an agent by PR).\n- `github.deployment.id`: The deployment id. Present on deployment and deployment-status\n  triggers; routes \"continue\" triggers back to the agent thread owning the deployment.\n- `github.deployment.environment`: The deployment environment (e.g., `production`). Present\n  on deployment and deployment-status triggers.\n- `github.deployment_status.state`: The deployment status state (e.g., `success`, `failure`,\n  `pending`). Present on deployment-status triggers only.\n- `github.check_run.status`: The check run status (e.g., `completed`, `in_progress`). Present\n  on deployment-status triggers when a check run accompanies the event, and on check_run\n  triggers directly.\n- `github.release.tag`: The release tag name (e.g., `v1.2.3`). Present on release triggers;\n  routes \"continue\" triggers back to the agent thread owning the release.\n- `github.comment.body`: The body text of the comment. Present on\n  `github.pull_request_review_comment` and `github.issue_comment` triggers only.\n- `github.workflow_run.id`: The workflow run id. Present on workflow_run triggers.\n- `github.workflow_run.name`: The name of the workflow (e.g., `CI`). Present on\n  workflow_run triggers.\n- `github.workflow_run.head_branch`: The branch the workflow ran on. Present on\n  workflow_run triggers.\n- `github.workflow_run.conclusion`: The conclusion of the run (e.g., `success`,\n  `failure`). Present on `completed` workflow_run events; empty otherwise.\n- `github.workflow_run.url`: The HTML URL of the workflow run. Present on workflow_run\n  triggers.\n- `github.workflow_job.id`: The workflow job id. Present on workflow_job triggers.\n- `github.workflow_job.name`: The job's own name (e.g., `test (3.9)`). Present on\n  workflow_job triggers.\n- `github.workflow_job.workflow_name`: The name of the workflow the job belongs to (e.g.,\n  `CI`). Present on workflow_job triggers.\n- `github.workflow_job.head_branch`: The branch the job ran on, blank when the run came\n  from a fork. Present on workflow_job triggers.\n- `github.workflow_job.conclusion`: The conclusion of the job (e.g., `success`,\n  `failure`). Present on `completed` workflow_job events; empty otherwise.\n- `github.workflow_job.url`: The HTML URL of the workflow job. Present on workflow_job\n  triggers.\n- `github.workflow_dispatch.ref`: The branch or tag the workflow was dispatched against.\n  Present on workflow_dispatch triggers.\n- `github.workflow_dispatch.workflow`: The dispatched workflow's file path relative to\n  the repository root (e.g., `.github/workflows/ci.yml`), not its display name. Present\n  on workflow_dispatch triggers.\n- `github.check_run.id`: The check run id. Present on check_run triggers.\n- `github.check_run.name`: The name of the check (e.g., `lint`). Present on check_run\n  triggers.\n- `github.check_run.head_branch`: The branch the check ran on. Present on check_run\n  triggers.\n- `github.check_run.conclusion`: The conclusion of the check run (e.g., `success`,\n  `failure`). Present on `completed` check_run events; empty otherwise.\n- `github.check_run.url`: The HTML URL of the check run. Present on check_run triggers.\n- `github.check_suite.id`: The check suite id. Present on check_suite triggers.\n- `github.check_suite.head_branch`: The branch the check suite ran on. Present on\n  check_suite triggers.\n- `github.check_suite.conclusion`: The summary conclusion for all check runs in the\n  suite (e.g., `success`, `failure`). Present on `completed` check_suite events; empty\n  otherwise.\n- `github.check_suite.status`: The check suite status (e.g., `completed`, `in_progress`).\n  Present on check_suite triggers.\n","type":"string","enum":["github.action","github.account","github.repository","github.installation.id","github.pull_request.number","github.deployment.id","github.deployment.environment","github.deployment_status.state","github.check_run.status","github.release.tag","github.comment.body","github.workflow_run.id","github.workflow_run.name","github.workflow_run.head_branch","github.workflow_run.conclusion","github.workflow_run.url","github.workflow_job.id","github.workflow_job.name","github.workflow_job.workflow_name","github.workflow_job.head_branch","github.workflow_job.conclusion","github.workflow_job.url","github.workflow_dispatch.ref","github.workflow_dispatch.workflow","github.check_run.id","github.check_run.name","github.check_run.head_branch","github.check_run.conclusion","github.check_run.url","github.check_suite.id","github.check_suite.head_branch","github.check_suite.conclusion","github.check_suite.status"]},"GitHubWorkflowActivityAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"branches":{"description":"Optional list of branch (or, for workflow_dispatch, branch or tag) names to filter\non. When omitted, events on any branch match.\n","type":"array","items":{"type":"string"}},"workflowNames":{"description":"Optional list of workflow names to filter on. For workflow_run/workflow_job this is\nthe workflow's display name (e.g., `CI`, `Deploy`); for workflow_dispatch it is the\nworkflow's file path relative to the repository root (e.g.,\n`.github/workflows/ci.yml`). When omitted, events from any workflow match.\n","type":"array","items":{"type":"string"}}}}]},"GitHubWorkflowDispatchAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.workflow_dispatch"]}]},"spec":{"$ref":"#/components/schemas/GitHubWorkflowDispatchAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubWorkflowDispatchAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubWorkflowActivityAgenticWorkflowTriggerSpec"}]},"GitHubWorkflowJobAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.workflow_job"]}]},"spec":{"$ref":"#/components/schemas/GitHubWorkflowJobAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubWorkflowJobAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubWorkflowActivityAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"conclusions":{"description":"Optional list of conclusions to filter on. Only applies to\n`completed` events. When omitted, jobs with any conclusion match.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubWorkflowJobConclusion"}}}}]},"GitHubWorkflowJobConclusion":{"description":"The conclusion of a GitHub Actions workflow job. GitHub's workflow_job payload carries a\nnarrower set than workflow_run: no `stale`.\n\n- `success`: The job completed successfully.\n- `failure`: The job failed.\n- `cancelled`: The job was cancelled.\n- `skipped`: The job was skipped.\n- `timed_out`: The job timed out.\n- `action_required`: The job requires manual action.\n- `neutral`: The job completed with a neutral result.\n","type":"string","enum":["success","failure","cancelled","skipped","timed_out","action_required","neutral"]},"GitHubWorkflowRunAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["github.workflow_run"]}]},"spec":{"$ref":"#/components/schemas/GitHubWorkflowRunAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitHubWorkflowRunAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitHubWorkflowActivityAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"conclusions":{"description":"Optional list of conclusions to filter on. Only applies to\n`completed` events. When omitted, runs with any conclusion match.\n","type":"array","items":{"$ref":"#/components/schemas/GitHubWorkflowRunConclusion"}}}}]},"GitHubWorkflowRunConclusion":{"description":"The conclusion of a GitHub Actions workflow run.\n\n- `success`: The workflow run completed successfully.\n- `failure`: The workflow run failed.\n- `cancelled`: The workflow run was cancelled.\n- `skipped`: The workflow run was skipped.\n- `timed_out`: The workflow run timed out.\n- `action_required`: The workflow run requires manual action.\n- `neutral`: The workflow run completed with a neutral result.\n- `stale`: The workflow run went stale.\n- `startup_failure`: The workflow run failed to start.\n","type":"string","enum":["success","failure","cancelled","skipped","timed_out","action_required","neutral","stale","startup_failure"]},"GitLabAgenticWorkflowTriggerSpec":{"description":"Scope shared by the GitLab trigger kinds.\n\nA GitLab webhook is registered by the customer on a group, and each Dash0 GitLab\nintegration is anchored to one instance — so unlike the GitHub App, Dash0 cannot declare\nwhich events it receives. Which of these triggers ever fire depends on the event checkboxes\nticked when the webhook was created.\n","properties":{"actions":{"description":"Optional list of merge request actions to filter on: `open`, `close`, `reopen`,\n`update`, `merge`, `approved`, `unapproved`.\n\nOnly `gitlab.merge_request` uses this; a note carries no action, so the filter is\nskipped for `gitlab.note` rather than blocking every event.\n","type":"array","items":{"type":"string"}},"instances":{"description":"Optional list of GitLab instance hosts to filter on, e.g. `gitlab.com`,\n`gitlab.acme.io`. Omit to match every instance the organization has connected.\n\nOnly worth setting when an organization has more than one GitLab integration: a group or\nproject path is unique within an instance but not across instances, so `acme/backend` on\ngitlab.com and on a self-managed host are different groups that a path filter alone\ncannot tell apart.\n","type":"array","items":{"type":"string"}},"groups":{"description":"Optional list of group full paths to filter on, e.g. `acme/backend`. A group covers every\nproject beneath it at any depth, so `acme/backend` matches `acme/backend/api` and\n`acme/backend/tools/lint`, but not `acme/frontend/web` — nor `acme/backend-legacy/api`,\nwhich is a different group.\n\nA group given as a numeric id rather than a path matches nothing: ids and paths cannot be\ncompared, and a filter that quietly matched everything would be worse than one that\nvisibly matches nothing.\n","type":"array","items":{"type":"string"}},"allGroups":{"description":"Explicitly match every group on the instance. Required to be set when no `groups` and\nno `projects` are given, so that a match-everything trigger is always a deliberate\nchoice rather than an omission — mirroring `allOrganizations` on GitHub.\n","type":"boolean"},"projects":{"description":"Optional list of project full paths to filter on, e.g. `acme/backend/api`.\n","type":"array","items":{"type":"string"}},"allProjects":{"description":"Explicitly match every project on the instance. See `allGroups`.\n","type":"boolean"},"availableVariables":{"type":"array","items":{"$ref":"#/components/schemas/GitLabTriggerVariableName"},"readOnly":true}}},"GitLabMergeRequestAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["gitlab.merge_request"]}]},"spec":{"$ref":"#/components/schemas/GitLabAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the merge\nrequest (keyed by instance, project path, and IID).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitLabNoteAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["gitlab.note"]}]},"spec":{"$ref":"#/components/schemas/GitLabNoteAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, a note on a merge request routes into the agent\nthat owns it. A note on anything else carries no merge request to route by and spawns.\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"GitLabNoteAgenticWorkflowTriggerSpec":{"allOf":[{"$ref":"#/components/schemas/GitLabAgenticWorkflowTriggerSpec"},{"type":"object","properties":{"keyword":{"description":"Optional. Fires only when the note contains this keyword as a whole, isolated word,\ncase-insensitively — so a keyword of `review` is not matched by `review-agent`.\nLeading and trailing punctuation next to the keyword still matches.\n\nAbsent or empty fires on every note, which on a busy project is a great many.\n","type":"string"}}}]},"GitLabTriggerVariableName":{"description":"Variables provided by the GitLab triggers.\n\n- `gitlab.instance`: Host of the GitLab instance the event came from (e.g. `gitlab.com`).\n  Always present, and what makes the rest unambiguous — every other identifier below is\n  unique only within one GitLab instance.\n- `gitlab.project`: The project's full path, e.g. `acme/backend/api`.\n- `gitlab.group`: The project's namespace — its full path without the project, e.g.\n  `acme/backend`. Empty for a project directly under a user or a top-level group.\n- `gitlab.user`: Username of the person whose action produced the event.\n- `gitlab.action`: The merge request action (`open`, `close`, `reopen`, `update`, `merge`,\n  `approved`, `unapproved`). Absent for `gitlab.note`, which carries no action.\n- `gitlab.merge_request.iid`: The merge request's number within its project — the one people\n  cite, not the instance-wide id. Present on `gitlab.merge_request`, and on `gitlab.note`\n  only when the comment was left on a merge request.\n- `gitlab.merge_request.title`, `gitlab.merge_request.url`: Present under the same condition\n  as the IID.\n- `gitlab.comment.body`: The comment's text. `gitlab.note` only.\n- `gitlab.noteable_type`: What the comment was left on — `MergeRequest`, `Issue`, `Commit`,\n  or `Snippet`. `gitlab.note` only.\n","type":"string","enum":["gitlab.instance","gitlab.action","gitlab.project","gitlab.group","gitlab.user","gitlab.merge_request.iid","gitlab.merge_request.title","gitlab.merge_request.url","gitlab.comment.body","gitlab.noteable_type"]},"GoogleChatWebhookConfig":{"properties":{"url":{"type":"string","format":"url"}},"required":["url"]},"Gradient":{"description":"A color gradient from one color to another.","properties":{"from":{"type":"string"},"to":{"type":"string"}},"required":["from","to"]},"HttpBasicAuthentication":{"properties":{"username":{"type":"string"},"password":{"type":"string"}},"required":["username","password"]},"HttpCheckAssertion":{"anyOf":[{"$ref":"#/components/schemas/HttpResponseStatusCodeAssertion"},{"$ref":"#/components/schemas/HttpResponseHeaderAssertion"},{"$ref":"#/components/schemas/HttpResponseJsonBodyAssertion"},{"$ref":"#/components/schemas/HttpResponseTextBodyAssertion"},{"$ref":"#/components/schemas/TimingAssertion"},{"$ref":"#/components/schemas/ErrorAssertion"},{"$ref":"#/components/schemas/SslCertificateAssertion"}]},"HttpCheckAssertions":{"type":"array","items":{"$ref":"#/components/schemas/HttpCheckAssertion"}},"HttpHeaders":{"type":"array","items":{"$ref":"#/components/schemas/NameValuePair"}},"HttpQueryParameters":{"type":"array","items":{"$ref":"#/components/schemas/NameValuePair"}},"HttpRedirects":{"type":"string","enum":["follow","disabled"]},"HttpRequestBody":{"properties":{"kind":{"$ref":"#/components/schemas/HttpRequestBodyKind"},"spec":{"properties":{"content":{"type":"string","maxLength":2048}},"required":["content"]}},"required":["kind","spec"]},"HttpRequestBodyKind":{"type":"string","enum":["json","graphql","form","raw"]},"HttpRequestMethod":{"type":"string","enum":["get","post","put","delete","head","patch"]},"HttpRequestSpec":{"properties":{"method":{"$ref":"#/components/schemas/HttpRequestMethod"},"url":{"type":"string"},"redirects":{"$ref":"#/components/schemas/HttpRedirects"},"tls":{"$ref":"#/components/schemas/TlsSettings"},"tracing":{"$ref":"#/components/schemas/TracingSettings"},"headers":{"$ref":"#/components/schemas/HttpHeaders"},"queryParameters":{"$ref":"#/components/schemas/HttpQueryParameters"},"basicAuthentication":{"$ref":"#/components/schemas/HttpBasicAuthentication"},"body":{"$ref":"#/components/schemas/HttpRequestBody"}},"required":["method","url","redirects","tls","tracing","headers","queryParameters"]},"HttpResponseHeaderAssertion":{"properties":{"kind":{"type":"string","enum":["response_header"]},"spec":{"$ref":"#/components/schemas/HttpResponseHeaderAssertionSpec"}},"required":["kind","spec"]},"HttpResponseHeaderAssertionSpec":{"properties":{"key":{"type":"string"},"operator":{"$ref":"#/components/schemas/StringAssertionOperator"},"value":{"type":"string"}},"required":["key","operator","value"]},"HttpResponseJsonBodyAssertion":{"properties":{"kind":{"type":"string","enum":["json_body"]},"spec":{"$ref":"#/components/schemas/HttpResponseJsonBodyAssertionSpec"}},"required":["kind","spec"]},"HttpResponseJsonBodyAssertionSpec":{"properties":{"jsonPath":{"type":"string"},"operator":{"$ref":"#/components/schemas/StringAssertionOperator"},"value":{"type":"string"}},"required":["jsonPath","operator","value"]},"HttpResponseStatusCodeAssertion":{"properties":{"kind":{"type":"string","enum":["status_code"]},"spec":{"$ref":"#/components/schemas/HttpResponseStatusCodeAssertionSpec"}},"required":["kind","spec"]},"HttpResponseStatusCodeAssertionSpec":{"properties":{"operator":{"$ref":"#/components/schemas/NumericAssertionOperator"},"value":{"type":"string"}},"required":["operator","value"]},"HttpResponseTextBodyAssertion":{"properties":{"kind":{"type":"string","enum":["text_body"]},"spec":{"$ref":"#/components/schemas/HttpResponseTextBodyAssertionSpec"}},"required":["kind","spec"]},"HttpResponseTextBodyAssertionSpec":{"properties":{"operator":{"$ref":"#/components/schemas/StringAssertionOperator"},"value":{"type":"string"}},"required":["operator","value"]},"IlertConfig":{"properties":{"url":{"type":"string","format":"url"}},"required":["url"]},"IncidentIOConfig":{"properties":{"url":{"type":"string","format":"url"},"headers":{"type":"string"}},"required":["url","headers"]},"InstrumentationScope":{"description":"InstrumentationScope is a message representing the instrumentation scope information such as the fully qualified name and version.","type":"object","properties":{"name":{"description":"An empty instrumentation scope name means the name is unknown.","type":"string"},"version":{"type":"string"},"attributes":{"description":"Additional attributes that describe the scope. [Optional]. Attribute keys MUST be unique (it is not allowed to have more than one attribute with the same key).","type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"droppedAttributesCount":{"type":"integer","format":"int64"}},"required":["attributes"]},"InviteMemberRequest":{"properties":{"emailAddress":{"type":"string"},"role":{"type":"string"}},"required":["emailAddress","role"]},"IpAddressStorageStrategy":{"type":"string","enum":["anonymize","do_not_store"]},"IpAddressesSettings":{"properties":{"endUserIpAddressStorageStrategy":{"$ref":"#/components/schemas/IpAddressStorageStrategy","description":"When we derive IP addresses from X-FORWARDED-FOR/X-REAL-IP HTTP headers, we will apply these rules.\n"}},"required":["endUserIpAddressStorageStrategy"]},"KeyValue":{"description":"KeyValue is a key-value pair that is used to store Span attributes, Link attributes, etc.","type":"object","properties":{"key":{"type":"string"},"value":{"$ref":"#/components/schemas/AnyValue"}},"required":["key","value"]},"LinearCommentAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["linear.comment"]}]},"spec":{"$ref":"#/components/schemas/LinearCommentAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the Linear\nissue (`linear.issue`).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"LinearCommentAgenticWorkflowTriggerSpec":{"type":"object","properties":{"keyword":{"description":"A command or keyword that the Linear comment must contain. Evaluated as a\ncase-insensitive substring match (e.g., `investigate` matches any comment\ncontaining \"investigate\"). The trigger fires only when the Dash0 agent is\n@mentioned or delegated on the issue and the comment contains this keyword;\nmentions without the keyword fall through to the normal Agent0 chat reply.\n","type":"string"},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"$ref":"#/components/schemas/LinearCommentTriggerVariableName"},"readOnly":true}},"required":["keyword"]},"LinearCommentTriggerVariableName":{"description":"Variables provided by the `linear.comment` trigger.\n\n- `linear.issue.id`: The Linear issue identifier (e.g., `ENG-123`).\n- `linear.issue.title`: Title of the Linear issue.\n- `linear.issue.url`: URL of the Linear issue.\n- `linear.comment.body`: Body text of the comment that triggered the automation.\n- `linear.comment.user`: Display name of the user who left the comment.\n","type":"string","enum":["linear.issue.id","linear.issue.title","linear.issue.url","linear.comment.body","linear.comment.user"]},"LinearLabelAddedAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["linear.label_added"]}]},"spec":{"$ref":"#/components/schemas/LinearLabelAddedAgenticWorkflowTriggerSpec"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"LinearLabelAddedAgenticWorkflowTriggerSpec":{"type":"object","properties":{"labelId":{"description":"The Linear label UUID that must be added to an issue for the trigger to fire. This is\nthe sole matching key — matched case-insensitively against the label ID reported on\nthe webhook event. If a label is re-created in Linear (new UUID, same name), update\nthis field to re-point the trigger at the new label.\n","type":"string"},"labelName":{"description":"Optional Linear label name corresponding to `labelId`, stored for UI display and\nexposed to prompts as the `linear.label.name` template variable. Does not\nparticipate in matching — the trigger fires on `labelId` only, so a same-named\nlabel in a different team never hijacks a trigger scoped to a specific label.\nClients that already know the name at write time (the workflow editor, Terraform\nauthors) should send it so the workflow-list view renders a human-readable label;\nprogrammatic API callers may omit it and get a UUID-only display until the field is\npopulated.\n","type":"string"},"teamIds":{"description":"List of Linear team UUIDs to scope the trigger to. When non-empty, the trigger fires\nonly for issues whose team ID is in this list. Mutually exclusive with `allTeams`; a\nrequest that sets both, or that leaves both `teamIds` and `allTeams` empty/unset, is\nrejected on write as an accidental match-everything catch-all.\n","type":"array","items":{"type":"string"}},"allTeams":{"description":"When true, the automation deliberately matches the configured label added to issues\nin every team of the connected Linear workspace, now and in the future. Mutually\nexclusive with a non-empty `teamIds` list. This flag exists to distinguish an\nexplicit \"all teams\" choice from an unconfigured trigger: a Linear label-added\ntrigger with neither `allTeams` nor `teamIds` set is rejected on write as an\naccidental match-everything catch-all, mirroring `allOrganizations` on GitHub\ntriggers.\n","type":"boolean"},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"$ref":"#/components/schemas/LinearLabelAddedTriggerVariableName"},"readOnly":true}},"required":["labelId"]},"LinearLabelAddedTriggerVariableName":{"description":"Variables provided by the `linear.label_added` trigger.\n\n- `linear.issue.id`: The Linear issue identifier (e.g., `ENG-123`).\n- `linear.issue.title`: Title of the Linear issue.\n- `linear.issue.url`: URL of the Linear issue.\n- `linear.issue.team_id`: UUID of the Linear team that owns the issue.\n- `linear.issue.team_key`: Short key of the Linear team (e.g., `ENG`).\n- `linear.issue.team_name`: Display name of the Linear team.\n- `linear.label.id`: UUID of the label that was added.\n- `linear.label.name`: Name of the label that was added.\n- `linear.label.color`: Hex color of the label that was added.\n- `linear.actor.name`: Display name of the user who added the label, when known.\n","type":"string","enum":["linear.issue.id","linear.issue.title","linear.issue.url","linear.issue.team_id","linear.issue.team_key","linear.issue.team_name","linear.label.id","linear.label.name","linear.label.color","linear.actor.name"]},"LogRecord":{"type":"object","properties":{"id":{"description":"The ID of the log record. This is a non-standard OTLP field. The property is only included when\n`includeOTLPSchemaExtensions` is `true`.\n","type":"string"},"timeUnixNano":{"type":"string","format":"uint64"},"observedTimeUnixNano":{"type":"string","format":"uint64"},"eventName":{"type":"string"},"dash0EventId":{"description":"The ID of the log record. This is a non-standard OTLP field. The property is only included when\n`includeOTLPSchemaExtensions` is `true`.\n","type":"string"},"severityNumber":{"$ref":"#/components/schemas/SeverityNumber"},"severityText":{"type":"string"},"body":{"$ref":"#/components/schemas/AnyValue"},"attributes":{"type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"droppedAttributesCount":{"type":"integer","format":"int64"},"flags":{"type":"integer","format":"int64"},"traceId":{"type":"string","format":"byte"},"spanId":{"type":"string","format":"byte"}},"required":["timeUnixNano","observedTimeUnixNano","attributes"]},"LogRecordExportFormat":{"description":"The serialization format of the exported file.\n- `txt`: One rendered log line per record, carrying a fixed field set of timestamp,\n  severity, resource, body and trace ID. Ignores `columns`.\n- `ndjson`: One OTLP JSON payload per line, each carrying a single log record inside\n  the same `resourceLogs` envelope `GetLogRecords` returns, so each line is\n  independently parseable by any OTLP JSON consumer.\n- `yaml`: The same per-record OTLP payloads as `ndjson`, as a multi-document YAML\n  stream with documents separated by `---`.\n- `csv`: A header row plus one row per record, flattened to the requested `columns`.\n","type":"string","enum":["txt","ndjson","yaml","csv"]},"LogRecordsDownloadRequest":{"description":"Request for the `LogRecordsDownload` API. Accepts the same query as `GetLogRecords`\n(`filter`, `timeRange`, `dataset`, `ordering`) and returns the matching records\nserialized as a downloadable file rather than as a JSON page.\n\nThe response is streamed, so the export is not paginated: a single request returns up\nto `limit` records, capped at 5000. Adaptive sampling is always disabled for exports,\nso an exported file is never a sample.\n","properties":{"filter":{"$ref":"#/components/schemas/FilterCriteria"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"ordering":{"$ref":"#/components/schemas/OrderingCriteria","description":"The ordering criteria for the exported logs. Records are written to the file in\nthis order.\nSupported ordering key: `otel.log.time` (log timestamp, defaults to descending)\n"},"format":{"$ref":"#/components/schemas/LogRecordExportFormat"},"limit":{"description":"The maximum number of log records to export. Defaults to, and is capped at, 5000.\nA larger value is rejected rather than silently clamped. Use the Dash0 CLI\n(`dash0 logs query`) to export volumes beyond this cap.\n","type":"integer","format":"int64","default":5000,"minimum":1,"maximum":5000},"columns":{"description":"Attribute keys to emit as columns, in order, for the `csv` format — resource,\nscope, or log record attributes (e.g. `service.name`, `otel.log.body`). Ignored by\nthe other formats, which have a fixed field set.\n","type":"array","items":{"type":"string"}}},"required":["timeRange","format"]},"ManualAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["manual"]}]},"spec":{"$ref":"#/components/schemas/EmptyAgenticWorkflowTriggerSpec"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"Matcher":{"type":"object","properties":{"operator":{"$ref":"#/components/schemas/AttributeFilterOperator"},"value":{"oneOf":[{"$ref":"#/components/schemas/AttributeFilterStringValue"},{"$ref":"#/components/schemas/AttributeFilterAnyValue"}]},"values":{"description":"List of values to match against. This parameter is mandatory for the is_one_of and is_not_one_of operators.\n","type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/AttributeFilterStringValue"},{"$ref":"#/components/schemas/AttributeFilterAnyValue"}]}}},"required":["operator"]},"MattermostWebhookConfig":{"properties":{"url":{"description":"The Mattermost incoming webhook URL, as shown in\n*Integrations → Incoming Webhooks* of the Mattermost server\n(e.g. `https://mattermost.example.com/hooks/xxx-generatedkey-xxx`).\n","type":"string","format":"url"},"channel":{"description":"Optional channel override. Accepts a channel name (`town-square`) or a direct\nmessage target (`@username`). When omitted, Mattermost posts to the channel the\nincoming webhook was created for. Overriding requires the webhook's creator to\nhave access to the target channel; Mattermost rejects the post otherwise.\n","type":"string"}},"required":["url"]},"MemberDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0Member"]},"metadata":{"$ref":"#/components/schemas/MemberMetadata"},"spec":{"$ref":"#/components/schemas/MemberSpec"}},"required":["kind","metadata","spec"]},"MemberDisplay":{"properties":{"email":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"imageUrl":{"type":"string"}}},"MemberLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/joinedAt":{"type":"string","format":"date-time"}}},"MemberMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/MemberLabels"}},"required":["name"]},"MemberSpec":{"properties":{"display":{"$ref":"#/components/schemas/MemberDisplay"}},"required":["display"]},"MetricSample":{"type":"array","prefixItems":[{"description":"Seconds since unix epoch start for which the metric value is valid.\nThe timestamp typically denotes the end of the step.\n","type":"number","format":"double"},{"$ref":"#/components/schemas/MetricValue"}]},"MetricSamples":{"type":"array","items":{"$ref":"#/components/schemas/MetricSample"}},"MetricValue":{"description":"JSON does not support special float values such as NaN, Inf, and -Inf, so sample\nvalues are transferred as quoted JSON strings rather than raw numbers.\n","type":"string"},"NameValuePair":{"properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]},"NetworkLevel":{"description":"Controls outbound network access for the sandbox running this thread.\n- `no_network`: Block all outbound network access.\n- `trusted_only`: Allow outbound access only to a curated list of trusted addresses.\n- `full`: No network restrictions.\n","type":"string","enum":["no_network","trusted_only","full"]},"NextCursors":{"properties":{"before":{"$ref":"#/components/schemas/Cursor","description":"The cursor for the previous set of results. If there are no more results before, this will be null.\n"},"after":{"$ref":"#/components/schemas/Cursor","description":"The cursor for the next set of results. If there are no more results after, this will be null.\n"}}},"NotificationChannelAnnotations":{"properties":{"dash0.com/created-at":{"description":"Timestamp when the notification channel was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update. Set by the server; read-only.","type":"string","format":"date-time"}}},"NotificationChannelDefinition":{"description":"A notification channel configuration wrapped in a CRD-like envelope. Follows the Dash0 resource convention with kind/metadata/spec structure.","properties":{"kind":{"type":"string","enum":["Dash0NotificationChannel"]},"metadata":{"$ref":"#/components/schemas/NotificationChannelMetadata"},"spec":{"$ref":"#/components/schemas/NotificationChannelSpec"}},"required":["kind","metadata","spec"]},"NotificationChannelDefinitions":{"type":"array","items":{"$ref":"#/components/schemas/NotificationChannelDefinition"}},"NotificationChannelLabels":{"properties":{"dash0.com/id":{"description":"Unique internal ID of the notification channel. Set by the server on creation; do not set manually.","type":"string"},"dash0.com/origin":{"description":"External identifier for API-managed resources (e.g. the CRD name from an operator or Terraform resource ID). Empty for user-created channels; non-empty for channels created via the internal API.","type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}}},"NotificationChannelMetadata":{"properties":{"name":{"description":"Display name of the notification channel.","type":"string"},"labels":{"$ref":"#/components/schemas/NotificationChannelLabels"},"annotations":{"$ref":"#/components/schemas/NotificationChannelAnnotations"}},"required":["name"]},"NotificationChannelRouting":{"properties":{"assets":{"description":"**Read-only.** The check rules and synthetic checks that are bound to this channel — a back-reference derived by the server; any value supplied on a write is ignored. To bind a check rule to this channel, set the `dash0.com/notification-channel-ids` annotation on the check rule; to bind a synthetic check, set `spec.notifications.channels` on the synthetic check. A channel bound to a check rule or synthetic check receives every notification for it, regardless of `filters` — unless the binding restricts it to critical, via the `:critical-only` suffix on its entry in the check rule's `dash0.com/notification-channel-ids` annotation, or the synthetic check's `spec.notifications.onlyCriticalChannels`.","type":"array","items":{"$ref":"#/components/schemas/NotificationChannelRoutingAsset"}},"filters":{"description":"Routing conditions: the channel is notified for any failed check matching at least one condition (conditions are OR-ed; the criteria within one condition are AND-ed). Conditions are evaluated organization-wide — they are not scoped to the assets listed above, and they do not restrict notifications delivered through a direct binding.","type":"array","items":{"$ref":"#/components/schemas/FilterCriteria"}}},"required":["assets","filters"]},"NotificationChannelRoutingAsset":{"description":"A check rule or synthetic check that is bound to this notification channel. Populated by the server; see `NotificationChannelRouting.assets`.","properties":{"kind":{"$ref":"#/components/schemas/NotificationChannelRoutingAssetKind"},"id":{"description":"The bound asset's UUID. Populated by the server.","type":"string"},"name":{"description":"The bound asset's display name. Populated by the server.","type":"string"},"dataset":{"$ref":"#/components/schemas/Dataset","description":"The bound asset's dataset. Populated by the server."}},"required":["kind","id","name","dataset"]},"NotificationChannelRoutingAssetKind":{"description":"- `check_rule`: the channel is bound to a check rule (via the check rule's `dash0.com/notification-channel-ids` annotation).\n- `synthetic_check`: the channel is bound to a synthetic check (via the synthetic check's `spec.notifications.channels`).","type":"string","enum":["check_rule","synthetic_check"]},"NotificationChannelSpec":{"properties":{"type":{"$ref":"#/components/schemas/NotificationChannelType"},"config":{"anyOf":[{"$ref":"#/components/schemas/SlackConfig"},{"$ref":"#/components/schemas/SlackBotConfig"},{"$ref":"#/components/schemas/EmailConfig"},{"$ref":"#/components/schemas/EmailV2Config"},{"$ref":"#/components/schemas/WebhookConfig"},{"$ref":"#/components/schemas/IncidentIOConfig"},{"$ref":"#/components/schemas/OpsgenieConfig"},{"$ref":"#/components/schemas/PagerDutyConfig"},{"$ref":"#/components/schemas/TeamsWebhookConfig"},{"$ref":"#/components/schemas/DiscordWebhookConfig"},{"$ref":"#/components/schemas/GoogleChatWebhookConfig"},{"$ref":"#/components/schemas/MattermostWebhookConfig"},{"$ref":"#/components/schemas/IlertConfig"},{"$ref":"#/components/schemas/AllQuietConfig"}]},"frequency":{"$ref":"#/components/schemas/Duration","description":"Specifies the channels notification frequency.\n","default":"10m"},"routing":{"$ref":"#/components/schemas/NotificationChannelRouting","description":"Deliberately optional. When this object is null or omitted, no routing changes are made. When it is present, the channel's routing conditions are replaced with `filters`.\n`assets` is read-only and ignored on writes: it is a derived back-reference listing the check rules and synthetic checks that are bound to this channel. To bind a check rule, set the `dash0.com/notification-channel-ids` annotation on the check rule; to bind a synthetic check, set `spec.notifications.channels` on the synthetic check."}},"required":["type","config"]},"NotificationChannelType":{"description":"The type of notification channel integration.\n","type":"string","enum":["slack","slack_bot","email","email_v2","webhook","incidentio","prometheus_webhook","betterstack","prometheus_alertmanager","opsgenie","pagerduty","jira_service_management_ops","teams_webhook","discord_webhook","google_chat_webhook","mattermost_webhook","ilert","all_quiet"]},"NumericAssertionOperator":{"type":"string","enum":["is","is_not","gt","lt","gte","lte","is_one_of","is_not_one_of"]},"OAuthAuthorizationServerMetadata":{"properties":{"issuer":{"description":"The authorization server's issuer identifier (URL).","type":"string","format":"uri"},"authorization_endpoint":{"description":"URL of the authorization endpoint.","type":"string","format":"uri"},"token_endpoint":{"description":"URL of the token endpoint.","type":"string","format":"uri"},"registration_endpoint":{"description":"URL of the dynamic client registration endpoint.","type":"string","format":"uri"},"revocation_endpoint":{"description":"URL of the token revocation endpoint.","type":"string","format":"uri"},"introspection_endpoint":{"description":"URL of the token introspection endpoint.","type":"string","format":"uri"},"scopes_supported":{"description":"List of scopes supported by the authorization server.","type":"array","items":{"type":"string"}},"response_types_supported":{"description":"List of supported response types.","type":"array","items":{"$ref":"#/components/schemas/OAuthResponseType"}},"grant_types_supported":{"description":"List of supported grant types.","type":"array","items":{"$ref":"#/components/schemas/OAuthGrantType"}},"code_challenge_methods_supported":{"description":"List of supported PKCE code challenge methods.","type":"array","items":{"$ref":"#/components/schemas/OAuthCodeChallengeMethod"}},"token_endpoint_auth_methods_supported":{"description":"List of supported token endpoint authentication methods.","type":"array","items":{"$ref":"#/components/schemas/OAuthTokenEndpointAuthMethod"}},"userinfo_endpoint":{"description":"URL of the UserInfo endpoint (OIDC Core § 5.3).","type":"string","format":"uri"}},"required":["issuer","authorization_endpoint","token_endpoint","response_types_supported"]},"OAuthClientRegistrationRequest":{"properties":{"client_name":{"description":"Human-readable name of the client.","type":"string"},"redirect_uris":{"description":"Array of allowed redirect URIs.","type":"array","items":{"type":"string","format":"uri"}},"grant_types":{"description":"Grant types the client intends to use.","type":"array","items":{"$ref":"#/components/schemas/OAuthGrantType"}},"response_types":{"description":"Response types the client intends to use.","type":"array","items":{"$ref":"#/components/schemas/OAuthResponseType"}},"token_endpoint_auth_method":{"$ref":"#/components/schemas/OAuthTokenEndpointAuthMethod","description":"Defaults to `none` if not specified. Only public clients are supported.\n"},"scope":{"description":"Space-separated list of scopes the client is requesting.","type":"string"},"client_uri":{"description":"URL of the client's home page.","type":"string","format":"uri"},"logo_uri":{"description":"URL of the client's logo image.","type":"string","format":"uri"}},"required":["client_name","redirect_uris"]},"OAuthClientRegistrationResponse":{"properties":{"client_id":{"description":"Unique client identifier issued by the authorization server.","type":"string"},"client_name":{"description":"Human-readable name of the client.","type":"string"},"redirect_uris":{"description":"Array of allowed redirect URIs.","type":"array","items":{"type":"string","format":"uri"}},"grant_types":{"description":"Grant types the client is registered for.","type":"array","items":{"$ref":"#/components/schemas/OAuthGrantType"}},"response_types":{"description":"Response types the client is registered for.","type":"array","items":{"$ref":"#/components/schemas/OAuthResponseType"}},"token_endpoint_auth_method":{"$ref":"#/components/schemas/OAuthTokenEndpointAuthMethod","description":"Authentication method for the token endpoint."},"scope":{"description":"Space-separated list of scopes the client is registered for.","type":"string"},"client_uri":{"description":"URL of the client's home page.","type":"string","format":"uri"},"logo_uri":{"description":"URL of the client's logo image.","type":"string","format":"uri"},"registration_access_token":{"description":"Token for managing this client registration (RFC 7592).","type":"string"}},"required":["client_id","client_name","redirect_uris","registration_access_token"]},"OAuthCodeChallengeMethod":{"description":"- `S256`: SHA-256 based code challenge method for PKCE (RFC 7636 section 4.2).\n","type":"string","enum":["S256"]},"OAuthGrantType":{"description":"- `authorization_code`: The standard authorization code grant (RFC 6749 section 4.1).\n- `refresh_token`: Exchange a refresh token for new tokens (RFC 6749 section 6).\n","type":"string","enum":["authorization_code","refresh_token"]},"OAuthProtectedResourceMetadata":{"properties":{"resource":{"description":"The resource server's resource identifier (its canonical URI).","type":"string","format":"uri"},"authorization_servers":{"description":"Array of authorization server issuer identifiers that can issue tokens accepted by this resource.","type":"array","items":{"type":"string","format":"uri"}},"scopes_supported":{"description":"List of scopes supported by this resource server.","type":"array","items":{"type":"string"}},"bearer_methods_supported":{"description":"Methods supported for sending bearer tokens to this resource (e.g., \"header\").","type":"array","items":{"type":"string"}},"resource_documentation":{"description":"URL of documentation for this protected resource.","type":"string","format":"uri"}},"required":["resource","authorization_servers"]},"OAuthResponseType":{"description":"- `code`: The authorization code response type (RFC 6749 section 4.1.1).\n","type":"string","enum":["code"]},"OAuthRevocationRequest":{"type":"object","properties":{"token":{"description":"The token to be revoked.","type":"string"},"client_id":{"description":"The identifier of the client the token was issued to. RFC 7009 section 2.1 requires the\nrevocation request to be authenticated as that client, so a token issued to a different\nclient is left untouched (the response is still 200).\n","type":"string"},"token_type_hint":{"$ref":"#/components/schemas/OAuthTokenType","description":"Hint about the type of the token being revoked. Helps the server optimize lookup.\n"}},"required":["token","client_id"]},"OAuthTokenEndpointAuthMethod":{"description":"- `none`: Public client, no client authentication (used by CLI/MCP clients).\nOnly public clients are supported. This deviates from RFC 7591 which defaults\nto `client_secret_basic` when omitted.\n","type":"string","enum":["none"]},"OAuthTokenErrorResponse":{"properties":{"error":{"description":"A single ASCII error code. Standard values include:\ninvalid_request, invalid_client, invalid_grant, unauthorized_client,\nunsupported_grant_type, invalid_scope.\n","type":"string"},"error_description":{"description":"Human-readable description providing additional information.","type":"string"},"error_uri":{"description":"URI identifying a human-readable web page with error information.","type":"string","format":"uri"}},"required":["error"]},"OAuthTokenRequest":{"type":"object","properties":{"grant_type":{"$ref":"#/components/schemas/OAuthGrantType"},"code":{"description":"The authorization code (required for authorization_code grant).","type":"string"},"redirect_uri":{"description":"Must match the redirect_uri used in the authorization request (required for authorization_code grant).","type":"string","format":"uri"},"client_id":{"description":"The client identifier.","type":"string"},"code_verifier":{"description":"PKCE code verifier (required for authorization_code grant). All public clients must use PKCE (RFC 7636).","type":"string"},"refresh_token":{"description":"The refresh token (required for refresh_token grant).","type":"string"},"scope":{"description":"Space-separated list of requested scopes. For refresh_token grant, must be equal to or a subset of the originally granted scopes.","type":"string"}},"required":["grant_type"]},"OAuthTokenResponse":{"properties":{"access_token":{"description":"The access token issued by the authorization server.","type":"string"},"token_type":{"description":"The type of token issued (always \"Bearer\").","type":"string","example":"Bearer"},"expires_in":{"description":"Lifetime of the access token in seconds.","type":"integer","format":"int64"},"refresh_token":{"description":"The refresh token for obtaining new access tokens.","type":"string"},"scope":{"description":"Space-separated list of granted scopes.","type":"string"},"dataset_restriction":{"$ref":"#/components/schemas/DatasetRestriction"},"datasets":{"type":"array","items":{"type":"string"}}},"required":["access_token","token_type","expires_in"]},"OAuthTokenType":{"description":"- `access_token`: An OAuth 2.0 access token.\n- `refresh_token`: An OAuth 2.0 refresh token.\n","type":"string","enum":["access_token","refresh_token"]},"OTTLCondition":{"description":"The OpenTelemetry Transformation Language (OTTL) is a small, domain-specific programming language intended to\nprocess data with OpenTelemetry-native concepts and constructs. An OTTL *Condition* is a boolean expression\ndetermining a certain behavior.\n\nOTTL conditions are only valid for specific evaluation contexts:\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/README.md#getting-started\n\nExamples:\n - Within the context of telemetry filtering, a condition evaluating to true means that the data should be dropped.\n","type":"string"},"OTTLConditions":{"type":"array","items":{"$ref":"#/components/schemas/OTTLCondition"}},"OTTLStatement":{"description":"The OpenTelemetry Transformation Language (OTTL) is a small, domain-specific programming language intended to\nprocess data with OpenTelemetry-native concepts and constructs. An OTTL *Statement* is an expression that\nperforms an action on telemetry data, such as setting, deleting, or transforming attributes.\n\nOTTL statements are used by the OpenTelemetry Transform Processor to modify telemetry data as it passes\nthrough the collector pipeline:\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/transformprocessor/README.md\n\nStatements are only valid for specific evaluation contexts:\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/ottl/README.md#getting-started\n\nExamples:\n - `set(attributes[\"http.request.method\"], \"GET\")` sets an attribute value.\n - `delete_key(attributes, \"http.request.header.authorization\")` removes a sensitive attribute.\n - `truncate_all(attributes, 100)` truncates all attribute values to 100 characters.\n","type":"string"},"OTTLStatements":{"type":"array","items":{"$ref":"#/components/schemas/OTTLStatement"}},"ObservedPatternEntry":{"type":"object","properties":{"dataset":{"type":"string"},"extractorType":{"type":"string"},"scopeKey":{"type":"string"},"template":{"type":"string"}},"required":["dataset","extractorType","scopeKey","template"]},"OperationPatternRuleAnnotations":{"description":"Pattern Rules use hard delete and have no folder/sharing/versions-history concept, so\nonly creation/update/last-matched timestamps are tracked here.\n","properties":{"dash0.com/created-at":{"description":"Timestamp when this Pattern Rule was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update to this Pattern Rule. Doubles as the optimistic-concurrency token (truncated to millisecond precision at write time): required on `PUT` for UI (Clerk session token) callers -- a missing or stale value there is rejected with 400 (`SupersededVersion`). Optional for machine-token/OAuth `PUT` callers, which skip the concurrency check entirely when it is omitted.","type":"string","format":"date-time"},"dash0.com/last-matched-at":{"description":"Read-only: a value supplied on write is always ignored, never rejected, so a normal GET -> edit spec -> PUT round trip doesn't need to strip it back out. Bumped to the current time by every successful `PUT` on this rule (an edit counts as \"using\" it), and separately by an out-of-band job based on real telemetry-matching activity, writing directly to the database -- the two sources are independent and can disagree. `null` on a freshly created rule that has neither been matched nor edited since.","type":"string","format":"date-time"}}},"OperationPatternRuleCreateRequest":{"$ref":"#/components/schemas/OperationPatternRuleDefinition"},"OperationPatternRuleDefinition":{"description":"A Pattern Rule abstracts a high-cardinality span operation name (e.g. `/users/1234`)\ninto a templated one (e.g. `/users/<userId>`), so the collector's Operation Processor\ncan collapse matching operation names together. Rows are either authored by a human\nthrough this API (`spec.ownership: user_defined`) or inferred by the Operation Miner\n(`spec.ownership: auto_derived`).\n\nUnlike most CRD-enveloped resources in this API, Pattern Rules have no independent,\nuser-editable display name, versioning, folder, or sharing concept -- `metadata.name` is\nserver-computed (see below). They are addressable either by their server-generated\n`metadata.labels[\"dash0.com/id\"]` or by `metadata.labels[\"dash0.com/origin\"]` (an\nIaC/Terraform-style stable label) -- see `{originOrId}` on each path below.\n`metadata.labels[\"dash0.com/dataset\"]`/`spec.serviceNamespace`/`spec.serviceName` identify\nthe partition (dataset + service) a rule belongs to, and are immutable once the rule is\ncreated.\n","properties":{"kind":{"type":"string","enum":["Dash0OperationPatternRule"]},"metadata":{"$ref":"#/components/schemas/OperationPatternRuleMetadata"},"spec":{"$ref":"#/components/schemas/OperationPatternRuleSpec"}},"required":["kind","metadata","spec"]},"OperationPatternRuleLabels":{"properties":{"dash0.com/id":{"description":"Unique server-generated ID of this Pattern Rule. Set by the server on creation; must not be provided on create (a `POST` body containing it is rejected with 400).","type":"string"},"dash0.com/origin":{"description":"Stable, client-chosen label for idempotent apply-by-name (IaC/Terraform-style) workflows, resolved via `{originOrId}` on every path below. Client-provided value wins if given; a machine-token caller that omits it gets a server-generated `api-<uuid>` fallback so the rule still classifies as API-managed; a UI (Clerk) or OAuth caller that omits it keeps a `null` origin. Immutable after creation: a value supplied on update is silently ignored, never rejected, so a normal GET -> edit spec -> PUT round trip doesn't have to strip it back out first. Must not itself look like a UUID (rejected with 400 on create) -- origins and ids are deliberately disjoint namespaces so `{originOrId}` resolution is never ambiguous.","type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"},"dash0.com/dataset":{"description":"Dataset this Pattern Rule belongs to. On create, the `dataset` query parameter is authoritative over this field whenever both are present -- this field is only consulted as a fallback when the query parameter is absent. Immutable after creation: an update whose value disagrees with the stored row is rejected with 400.","type":"string"}}},"OperationPatternRuleListResponse":{"type":"object","properties":{"operationPatternRules":{"type":"array","items":{"$ref":"#/components/schemas/OperationPatternRuleDefinition"}},"hasMore":{"description":"Whether there are more rules beyond the current page.","type":"boolean"}},"required":["operationPatternRules"]},"OperationPatternRuleMetadata":{"properties":{"name":{"description":"Computed by the server from `spec.canonicalOperation`. Pattern Rules have no independent, user-editable display name -- this field exists to conform to this API's standard CRD envelope shape. Always present on a read. A value supplied on write is ignored, and -- unlike the other CRD-enveloped resources this API's standard envelope shape is modeled on -- must not be required on write: the client cannot know it in advance, since the server only computes it after compiling `spec.pattern`. Treated the same as the sibling server-computed, write-ignored spec fields (`canonicalOperation`, `normalizedRegex`, `variableNames`), all of which are similarly absent from their schema's `required` list.","type":"string"},"labels":{"$ref":"#/components/schemas/OperationPatternRuleLabels"},"annotations":{"$ref":"#/components/schemas/OperationPatternRuleAnnotations"}}},"OperationPatternRuleOwnership":{"description":"- `user_defined`: created, or promoted from `auto_derived`, by a human through this API.\n- `auto_derived`: inferred by the Operation Miner.\n","type":"string","enum":["user_defined","auto_derived"]},"OperationPatternRuleResponse":{"$ref":"#/components/schemas/OperationPatternRuleDefinition"},"OperationPatternRuleSpec":{"properties":{"serviceNamespace":{"description":"OpenTelemetry `service.namespace` resource attribute this Pattern Rule applies to. Empty string when the target service has no namespace (never omitted/null on a stored row). Immutable after creation: an update whose value disagrees with the stored row is rejected with 400. Omit when listing to scope the request organization/dataset-wide across every namespace instead of one.","type":"string"},"serviceName":{"description":"OpenTelemetry `service.name` resource attribute this Pattern Rule applies to. Required on create. Immutable after creation: an update whose value disagrees with the stored row is rejected with 400. Omit when listing to scope the request organization/dataset-wide across every service instead of one.","type":"string"},"pattern":{"description":"Human-authored operation-name pattern using the placeholder DSL (e.g. `/users/<userId>`; `<<` escapes a literal `<`) -- the `named_pattern` concept defined in the \"Pattern Representation and Storage\" ADR appendix, whose transformations `internal/operationpatterncompiler` implements. Required on create. Populated on every `GET`/`List` response by reconstructing it from the stored canonical representation -- including for `auto_derived` rows this API never compiled itself -- so it is always present on a read, not only for rows this API wrote.","type":"string","maxLength":500},"ownership":{"$ref":"#/components/schemas/OperationPatternRuleOwnership","description":"Defaults to `user_defined` on create; the server ignores any client-supplied value there -- only the Operation Miner creates `auto_derived` rows. On update, only the `auto_derived` -> `user_defined` transition is accepted (this is how promoting a Miner-inferred rule works); attempting to set `auto_derived` is rejected with 400."},"status":{"$ref":"#/components/schemas/OperationPatternRuleStatus","description":"Required on both `POST` and `PUT`; there is no default. Omitting it could otherwise silently reactivate or deactivate a rule the caller did not intend to touch on `PUT`, so the same explicit requirement applies uniformly on create."},"canonicalOperation":{"description":"Computed by the server from `pattern`. The literal `dash0.operation.name` value applied to every span this rule matches. A value supplied on write is ignored.","type":"string"},"normalizedRegex":{"description":"Computed by the server from `pattern`. The anchored regular expression the collector's Operation Processor compiles to match operation names against this rule. A value supplied on write is ignored.","type":"string"},"variableNames":{"description":"Computed by the server from `pattern`. Placeholder names, in left-to-right occurrence order. A value supplied on write is ignored.","type":"array","items":{"type":"string"}},"priority":{"description":"Ranks this rule for list ordering: `GET`/`List` responses are always sorted by `priority` descending first, so higher-priority rules (including manually-promoted ones) surface before lower-priority and `auto_derived` ones. `1` (Minor) through `5` (Major) are the user-facing levels, defaulting to `3` (Standard) when omitted on create; an update that omits it preserves the row's current value instead of resetting it. `0` is reserved for `auto_derived` rows the Operation Miner writes -- a client-supplied `0` is rejected with 400.","type":"integer","minimum":0,"maximum":5}},"required":["serviceName","pattern","status"]},"OperationPatternRuleStatus":{"description":"- `active`: applied by the collector's Operation Processor.\n- `inactive`: stored but not applied.\n","type":"string","enum":["active","inactive"]},"OperationPatternRuleUpdateRequest":{"$ref":"#/components/schemas/OperationPatternRuleDefinition"},"OpsgenieConfig":{"properties":{"instance":{"type":"string","enum":["eu","us"]},"apiKey":{"type":"string"}},"required":["instance","apiKey"]},"OrderingCriteria":{"description":"Any supported attribute keys to order by.","type":"array","items":{"$ref":"#/components/schemas/OrderingCriterion"}},"OrderingCriterion":{"description":"Any combination of a supported key to order by and a direction.","properties":{"key":{"$ref":"#/components/schemas/OrderingKey"},"direction":{"$ref":"#/components/schemas/OrderingDirection"}},"required":["key","direction"]},"OrderingDirection":{"type":"string","enum":["ascending","descending"],"default":"ascending"},"OrderingKey":{"description":"Any attribute key to order by.","type":"string"},"PagerDutyConfig":{"properties":{"key":{"type":"string"},"url":{"type":"string","format":"url"}},"required":["key","url"]},"Progress":{"properties":{"rowsRead":{"type":"integer","format":"uint64"},"bytesRead":{"type":"integer","format":"uint64"},"totalRowsToRead":{"type":"integer","format":"uint64"},"executionTimeMillis":{"type":"integer","format":"uint64"}},"required":["rowsRead","bytesRead","totalRowsToRead","executionTimeMillis"]},"PrometheusAlertRule":{"description":"Check rules represent a periodically evaluated expression to determine the health of a resource.\nThe result of the evaluation are zero or more CheckEvaluations.\n","properties":{"dataset":{"$ref":"#/components/schemas/Dataset"},"metadata":{"$ref":"#/components/schemas/PrometheusAlertRuleMetadata"},"id":{"description":"User defined id for getting/updating/deleting the alert rule through the API.","type":"string"},"name":{"description":"Human-readable and templatable name for the check. In Prometheus alerting rules this is called \"alert\".","type":"string"},"expression":{"description":"An editable PromQL expression that can leverage the complete Dash0 Query Language. It furthermore\nsupports a variable called $__threshold.\n\n- `$__threshold` can be used as a placeholder for both the degraded and failed thresholds. The\n  thresholds are defined in the thresholds field. When `$__threshold` is used in the expression,\n  the `thresholds` field is required and at least one of the thresholds must be defined.\n\n  Usage of `$__threshold` implies that the PromQL expression may have to be evaluated up to two\n  times using the degraded threshold and critical threshold respectively.\n\n- Top-level AND statements are treated as enablement conditions that specify when the check should\n  \"be running\", i.e., is active. The use-cases for enablement conditions are several, e.g., requiring\n  a minimum amount of requests being served before triggering due to errors rates,\n  maintenance windows or muted timeframes.\n","type":"string"},"thresholds":{"$ref":"#/components/schemas/CheckThresholds"},"interval":{"$ref":"#/components/schemas/Duration","description":"Specifies a check evaluation frequency.\n","default":"1m"},"for":{"$ref":"#/components/schemas/Duration","description":"For, also called \"pending duration\", specifies a time duration for how long the expression must\nhave been continuously satisfied before a check evaluation is created. When the check evaluation\nis created, its \"start\" timestamp is set to the instant the pending duration started elapsing.\n\nThis is effectively equivalent to the \"for\" configuration in Prometheus alerting rules.\n\nDefault value is 0s, meaning that the check would transition immediately into one of the degraded\nor critical states at the first failed evaluation.\n\nIf for is not set to 0s (or equivalent, like 0m), its value must be larger than or equal to that\nof evaluationFrequency, as it does not make sense to expect the status of a check to change without another\nevaluation having occurred.\n","default":"0s"},"keep_firing_for":{"$ref":"#/components/schemas/Duration","description":"Keep firing for, also called \"resolution duration\", that specifies a time duration for how long\nthe evaluation of the expression must be consistently healthy before an critical or degraded check\nenters the healthy state, or de-escalates from critical to degraded.\n\nThis is effectively equivalent to the \"keep_firing_for\" configuration in Prometheus alerting rules.\n\nDefault value is 0s, meaning that the check would transition immediately into the healthy state at\nthe first successful evaluation.\n\nIf keep_firing_for is not set to 0s (or equivalent, like 0m), its value must be larger than or equal\nto that of evaluationFrequency, as it does not make sense to expect the status of a check to change\nwithout another evaluation having occurred.\n","default":"0s"},"labels":{"description":"Label are key-value pairs that can be used to add additional metadata to a check. They map\nto Prometheus alerting rules' \"labels\" field.\n","type":"object","additionalProperties":{"type":"string"}},"annotations":{"description":"Annotations are key-value pairs that can be used to add additional metadata to a check. They map\nto Prometheus alerting rules' \"annotations\" field.\n\nThe \"summary\" and \"description\" annotations are expected and are used as the human-readable\nsummary and description of the check rule.\n","type":"object","properties":{"summary":{"description":"Human-readable and templatable summary for the check that allows you to customize the way the check\nis textually described in short form in the Dash0 UI, in notifications, etc. Limited to 255\ncharacters.\n","type":"string","maxLength":255},"description":{"description":"Human-readable and templatable description for the check that allows you to customize the way the\nrationale of the check is textually described in the Dash0 UI, in notifications, etc. This will\nbe optimized in the design for long form viewing. Limited to 2048 characters.\n","type":"string","maxLength":2048},"folderPath":{"description":"Optional UI folder path for organising groups (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"sharing":{"description":"Comma-separated list of principals to grant read and delete access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Sharing is honored only on check rules that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API). Setting it on a check rule that declares no dash0.com/origin is rejected with a 400 — manage that rule's access via the UI share dialog instead.","type":"string"}},"additionalProperties":{"type":"string"}},"enabled":{"description":"A boolean flag to enable or disable the check rule. When a check rule is disabled, it will not be\nevaluated, and no check evaluations will be created. This field is optional and defaults to true.\n","type":"boolean"},"summary":{"description":"Deprecated: use the \"summary\" annotation instead.","type":"string","deprecated":true,"maxLength":255},"description":{"description":"Deprecated: use the \"description\" annotation instead.","type":"string","deprecated":true,"maxLength":2048},"keepFiringFor":{"description":"Deprecated: use \"keep_firing_for\" instead.","type":"string","deprecated":true}},"required":["name","expression"]},"PrometheusAlertRuleApiListItem":{"description":"The ID, origin, dataset, and the name of a check rule.","properties":{"id":{"description":"The unique identifier of the check rule.\n\nFor backward compatibility, this field is also filled with the origin, if it exists.\nHowever in a future version, this field will only return the actual check rule ID.\n","type":"string"},"origin":{"description":"User defined origin for getting/updating/deleting the alert rule through the API.","type":"string"},"source":{"$ref":"#/components/schemas/CrdSource"},"dataset":{"$ref":"#/components/schemas/Dataset"},"name":{"description":"Human-readable and templatable name for the check. In Prometheus alerting rules this is called \"alert\".","type":"string"}},"required":["id","dataset"]},"PrometheusAlertRuleBulkCreateRequest":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusAlertRule"},"minItems":1,"maxItems":1000}},"required":["items"]},"PrometheusAlertRuleBulkCreateResponse":{"type":"object","properties":{"created":{"description":"Number of check rules that were newly created.","type":"integer"}},"required":["created"]},"PrometheusAlertRuleMetadata":{"description":"Server-populated metadata for the alert rule. Read-only on responses; ignored on write.\n","type":"object","properties":{"labels":{"$ref":"#/components/schemas/PrometheusAlertRuleMetadataLabels"}}},"PrometheusAlertRuleMetadataLabels":{"description":"Server-derived labels that apply to the alert-rule resource itself, not to the\nemitted alert. Currently includes `dash0.com/source` when the origin is known; see\nthe `CrdSource` enum for the values it can take.\n","type":"object","properties":{"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}}},"PrometheusBuildInfo":{"description":"Build information about the Prometheus-compatible server. Only `version` is populated —\nwith the upstream Prometheus version Dash0 is compatible with, for client feature\ndetection. The remaining fields are retained for upstream API compatibility but are\nalways empty; Dash0 does not expose build internals.\n","type":"object","properties":{"version":{"description":"The upstream Prometheus version Dash0 is compatible with.","type":"string"},"revision":{"description":"Not exposed by Dash0; always empty.","type":"string"},"branch":{"description":"Not exposed by Dash0; always empty.","type":"string"},"buildUser":{"description":"Not exposed by Dash0; always empty.","type":"string"},"buildDate":{"description":"Not exposed by Dash0; always empty.","type":"string"},"goVersion":{"description":"Not exposed by Dash0; always empty.","type":"string"}}},"PrometheusBuildInfoResponse":{"properties":{"status":{"type":"string"},"data":{"$ref":"#/components/schemas/PrometheusBuildInfo"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusErrorResponse":{"properties":{"status":{"type":"string"},"errorType":{"type":"string"},"error":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}},"infos":{"description":"Info-level annotations produced while evaluating the query (Prometheus 3.0+).\nOnly populated by the instant and range query endpoints.\n","type":"array","items":{"type":"string"}}},"required":["status","errorType","error"]},"PrometheusFormatQueryRequest":{"properties":{"query":{"type":"string"}},"required":["query"]},"PrometheusFormatQueryResponse":{"properties":{"status":{"type":"string"},"data":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusLabelNamesOrValuesRequest":{"properties":{"start":{"type":"string","format":"rfc3339 | unix_timestamp"},"end":{"type":"string","format":"rfc3339 | unix_timestamp"},"match[]":{"type":"array","items":{"type":"string","format":"series_selector"}},"limit":{"type":"integer","format":"int64","minimum":1},"dataset":{"$ref":"#/components/schemas/Dataset"}}},"PrometheusLabelNamesOrValuesResponse":{"properties":{"status":{"type":"string"},"data":{"type":"array","items":{"type":"string"}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusMatrixResult":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusMatrixSampleResult"}},"PrometheusMatrixSampleResult":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/PrometheusMetric"},"values":{"$ref":"#/components/schemas/MetricSamples"}},"required":["metric","values"]},"PrometheusMetadataRequest":{"properties":{"limit":{"type":"integer","format":"int64"},"limit_per_metric":{"type":"integer","format":"int64"},"metric":{"type":"string"},"start":{"type":"string","format":"rfc3339 | unix_timestamp"},"end":{"type":"string","format":"rfc3339 | unix_timestamp"},"dataset":{"$ref":"#/components/schemas/Dataset"}}},"PrometheusMetadataResponse":{"properties":{"status":{"type":"string"},"data":{"description":"Metric metadata keyed by metric name. Each metric maps to a list of metadata entries.","type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusMetricMetadata"}}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusMetric":{"type":"object","additionalProperties":{"type":"string"}},"PrometheusMetricMetadata":{"type":"object","properties":{"type":{"description":"The metric type as reported by the source. One of `counter`, `gauge`,\n`histogram`, `gaugehistogram`, `summary`, `info`, `stateset`, or `unknown`.\n","type":"string"},"help":{"description":"A human-readable description of the metric.","type":"string"},"unit":{"description":"The metric unit, if known.","type":"string"}}},"PrometheusQueryRangeRequest":{"properties":{"query":{"type":"string"},"start":{"type":"string","format":"rfc3339 | unix_timestamp"},"end":{"type":"string","format":"rfc3339 | unix_timestamp"},"step":{"type":"string","format":"duration | float_seconds"},"timeout":{"type":"string","format":"duration"},"limit":{"type":"integer","format":"int64","minimum":1},"dataset":{"$ref":"#/components/schemas/Dataset"}},"required":["query","step"]},"PrometheusQueryRequest":{"properties":{"query":{"type":"string"},"time":{"type":"string","format":"rfc3339 | unix_timestamp"},"timeout":{"type":"string","format":"duration"},"limit":{"type":"integer","format":"int64","minimum":1},"dataset":{"$ref":"#/components/schemas/Dataset"}},"required":["query"]},"PrometheusQueryResponse":{"properties":{"status":{"type":"string"},"data":{"$ref":"#/components/schemas/PrometheusQueryResult"},"warnings":{"type":"array","items":{"type":"string"}},"infos":{"description":"Info-level annotations produced while evaluating the query (Prometheus 3.0+),\nkept separate from `warnings`.\n","type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusQueryResult":{"properties":{"resultType":{"$ref":"#/components/schemas/PrometheusResultType"},"result":{"anyOf":[{"$ref":"#/components/schemas/PrometheusScalarResult"},{"$ref":"#/components/schemas/PrometheusStringResult"},{"$ref":"#/components/schemas/PrometheusVectorResult"},{"$ref":"#/components/schemas/PrometheusMatrixResult"}]}},"required":["resultType","result"]},"PrometheusResultType":{"description":"The shape of the `result` field, mirroring Prometheus:\n- `vector`: instant-vector result (array of samples), returned by instant queries.\n- `matrix`: range-vector result (array of series with value ranges), returned by range queries.\n- `scalar`: a single scalar value.\n- `string`: a single string value.\n","type":"string","enum":["matrix","vector","scalar","string"]},"PrometheusRule":{"description":"A resource following the monitoring.coreos.com/v1 PrometheusRule CRD format.\nA PrometheusRule contains one or more rule groups, each evaluated at a common interval.\nGroups may contain recording rules, alerting rules, or both.\n","properties":{"apiVersion":{"$ref":"#/components/schemas/PrometheusRuleApiVersion"},"kind":{"$ref":"#/components/schemas/PrometheusRuleKind"},"metadata":{"$ref":"#/components/schemas/PrometheusRuleMetadata"},"spec":{"$ref":"#/components/schemas/PrometheusRuleSpec"}},"required":["apiVersion","kind","metadata","spec"]},"PrometheusRuleApiVersion":{"description":"API version of the PrometheusRule CRD.\n","type":"string","enum":["monitoring.coreos.com/v1"]},"PrometheusRuleDefinition":{"description":"An individual rule within a group. A rule is either a recording rule (has `record`) or\nan alerting rule (has `alert`). Exactly one of `record` or `alert` must be set.\n\nRecording rules pre-compute a PromQL expression and store the result as a new metric.\nAlerting rules evaluate a PromQL expression and fire alerts when the result is non-empty.\n","properties":{"record":{"description":"Name of the output metric for a recording rule. Must be a valid Prometheus metric name.\nMutually exclusive with `alert`.\n","type":"string","pattern":"^[a-zA-Z_:][a-zA-Z0-9_:]*$"},"alert":{"description":"Name of the alert for an alerting rule.\nMutually exclusive with `record`.\n","type":"string"},"expr":{"description":"PromQL expression to evaluate.\n\nFor **recording rules**, the expression must satisfy these constraints\n(alerting rules are not subject to them):\n- **Maximum query window**: the longest matrix-selector range (or subquery\n  range, plus `lookbackDelta`) may not exceed 30 days + 15 minutes.\n- **Minimum evaluation interval** depends on the query window — see the\n  band table on the group's `interval` field, including the RR-over-RR carve-out.\n- **At most 7 distinct metric names** may be referenced (only enforced when\n  the query window exceeds 1h+10m).\n- **Each matrix selector** must be bounded — at least one non-`__name__`\n  label matcher, an enclosing range function (`rate`, `*_over_time`, …),\n  an enclosing `by`/`without` aggregation, or the inner metric must itself\n  be an active recording-rule output in the same (organization, dataset).\n- **At most 10 `or` arms** (only enforced when the query window exceeds 1h+10m).\n- **Self-reference is rejected**: the rule's own `record` may not appear\n  in its own expression.\n- **Vector matching must resolve to a clean, aligned match**: a binary\n  operation matched with `on()` and an empty label set is rejected when the\n  one-side operand is not statically a single series (an unaggregated selector\n  there fails at evaluation with a duplicate-series error). Aggregate the\n  one-side to a single series (e.g. `sum(...)`) or match on explicit labels\n  with `on(<labels>)`.\n","type":"string"},"for":{"description":"Duration for which the expression must be continuously satisfied before an alert fires.\nOnly applicable to alerting rules (e.g., \"5m\", \"10m\").\n","type":"string"},"keep_firing_for":{"description":"Duration for which an alert continues firing after the expression is no longer satisfied.\nOnly applicable to alerting rules (e.g., \"5m\").\n","type":"string"},"labels":{"description":"Additional labels to attach to the resulting metrics or alerts.","type":"object","additionalProperties":{"type":"string"}},"annotations":{"description":"Annotations to attach to alerts. Only applicable to alerting rules.\nCommonly used keys include `summary` and `description`.\n\nDash0 also recognizes:\n- `dash0.com/notification-channel-ids`: Comma-separated list of notification channels to\n  notify when the alert fires. Each entry is a channel UUID or a channel origin, and may\n  carry the `:critical-only` suffix to notify that channel only once the check reaches\n  critical — for example\n  `dash0.com/notification-channel-ids: fbc39ea2-d6da-4c8e-b77f-730821913a3c, pagerduty-prod:critical-only`.\n  The annotation declares the routing in full: a channel it does not name is unlinked,\n  and a channel it names without the suffix notifies on every issue, including when the\n  only-on-critical trigger had been set in the UI.\n","type":"object","additionalProperties":{"type":"string"}}},"required":["expr"]},"PrometheusRuleGroup":{"description":"A group of rules evaluated together at a common interval. Follows the Prometheus\nrule group concept (https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/).\n\nNote: The upstream RuleGroup fields `partial_response_strategy` and `limit` are\nintentionally omitted as they are not supported by the Dash0 evaluation engine.\n\nCaveat for synthetic metrics: when a rule reads from a synthetic metric (one\ncomputed on demand from underlying signals at query time, rather than pre-computed\nduring ingestion), evaluation near the leading edge of available data may\nunder-count, since late-arriving signals may not yet have been processed. Two\nrules within the same group can therefore disagree even when their queries share\na strict subset/superset relationship — a ratio of the two values may briefly\nexceed 1.0 at some timestamps. Use `query_offset` to delay evaluation enough for\nthe underlying data to settle.\n","properties":{"name":{"description":"Display name for the rule group.","type":"string"},"interval":{"description":"Evaluation interval for all rules in the group.\nApplies to every rule in the group; individual rules cannot override it.\nDefaults to \"1m\" if not specified.\n\nFor **recording rules**, the minimum interval depends on the longest\nmatrix-selector range in the rule's PromQL expression (the \"query window\"):\n\n| Query window           | Minimum interval                                                     |\n|------------------------|----------------------------------------------------------------------|\n| ≤ 1h+10m               | 1m (absolute floor)                                                  |\n| (1h+10m, 8h+10m]       | 5m                                                                   |\n| (8h+10m, 24h+10m]      | 10m — relaxed to **5m** for RR-over-RR                               |\n| (24h+10m, 30d+15m]     | 1h — relaxed to **5m** for RR-over-RR                                |\n| > 30d+15m              | rejected                                                             |\n\n\"RR-over-RR\" means every metric referenced by the recording rule's\nexpression is itself an active recording-rule output in the same\n(organization, dataset). In that case the relaxed 5m floor applies for\nquery windows above 8h+10m — the inner recording rule's own validation\nalready bounded the per-eval cost.\n\nAlerting rules are not subject to these interval constraints.\n","type":"string"},"query_offset":{"description":"Shifts the timestamp at which rules in the group query their data backwards\nby this duration (e.g. \"5m\"). Output series points are stamped at the shifted\nmoment, allowing late-arriving data to settle before being counted.\nMaximum 1h. Defaults to 0 if omitted (no shift).\n","type":"string"},"labels":{"description":"Labels to apply to all rules in the group. These are merged with rule-level labels;\nrule-level labels take precedence in case of conflict.\n","type":"object","additionalProperties":{"type":"string"}},"rules":{"description":"List of rules in this group.","type":"array","items":{"$ref":"#/components/schemas/PrometheusRuleDefinition"},"minItems":1}},"required":["name","rules"]},"PrometheusRuleKind":{"description":"Kind of the PrometheusRule CRD.\n","type":"string","enum":["PrometheusRule"]},"PrometheusRuleMetadata":{"description":"Metadata for the PrometheusRule resource, following Kubernetes metadata conventions.\n","properties":{"name":{"description":"Resource name.","type":"string"},"labels":{"description":"Key-value labels for the resource. Dash0 recognizes the following labels:\n\n- `dash0.com/id`: Internal ID (read-only, server-set).\n- `dash0.com/origin`: External identifier for API-managed resources.\n- `dash0.com/version`: Version for optimistic concurrency (required on update, server-set on create).\n- `dash0.com/dataset`: Dataset this resource belongs to (defaults to the default dataset).\n- `dash0.com/source`: Origin source — \"ui\", \"terraform\", \"operator\", \"dash0-cli\", \"platform\", or \"api\" (read-only, derived from origin).\n","type":"object","additionalProperties":{"type":"string"}},"annotations":{"description":"Key-value annotations for the resource. Dash0 recognizes the following annotations:\n\n- `dash0.com/enabled`: Set to \"false\" to disable evaluation. Defaults to \"true\" when absent.\n- `dash0.com/folder-path`: UI folder path for organising resources (e.g., \"/infrastructure/hosts\"). Nesting is expressed with \"/\" separators.\n- `dash0.com/sharing`: Comma-separated list of principals to grant read access to. Supported formats: \"team:<team_id>\" and \"user:<email>\". Honored only on rules that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API); setting it on a rule that declares no dash0.com/origin is rejected with a 400.\n- `dash0.com/created-at`: Creation timestamp (read-only, server-set).\n- `dash0.com/updated-at`: Last update timestamp (read-only, server-set).\n- `dash0.com/deleted-at`: Soft-delete timestamp (read-only, server-set).\n- `dash0.com/first-evaluation-at`: First evaluation timestamp (recording rules only, read-only, server-set).\n- `dash0.com/runtime-disabled-at`: Timestamp when the recorder took the group out of evaluation because a rule was too expensive (it exceeded the query sample limit). Recording rules only, read-only, server-set. Independent of `dash0.com/enabled`. Cleared only when a cost-determining field changes (the rules or the interval) — a `dash0.com/enabled` toggle, a cosmetic edit, or a blind re-apply of the identical manifest does not re-enable the group.\n- `dash0.com/runtime-disabled-reason`: Why the recorder runtime-disabled the group (currently only \"max_samples\"). Recording rules only, read-only, server-set.\n- `dash0.com/baseline-direction`: Anomaly detector baseline direction — \"above\", \"below\", or \"both\". Check rules only. Lifted into the rule's `thresholds.baseline`.\n- `dash0.com/baseline-spread-floor`: Optional minimum spread as a fraction of the baseline prediction. Check rules only; use with `dash0.com/baseline-direction`.\n- `dash0.com/volume-floor`: Optional minimum predicted or windowed recent level required for a detector to evaluate. Check rules only.\n- `dash0.com/change-gate-comparison`: Change gate comparison — \"absolute_delta\" or \"relative_factor\". Check rules only. Set together with the two keys below.\n- `dash0.com/change-gate-value`: The minimum change the change gate requires, interpreted according to the comparison. Check rules only.\n- `dash0.com/change-gate-baseline-window`: The window the change gate derives the recent level from (e.g. \"1h\"). Check rules only.\n\nThe detector keys are the only way to configure an anomaly detector from Kubernetes: check rules\nare a flat resource whose body has no `thresholds` field. All three change-gate keys must be present\nand parseable for a change gate to be created; a partial or unparseable set is left in the annotations\nand creates no detector, rather than rejecting the rule and breaking the reconcile loop. A typed\n`thresholds` field on the body always wins over the matching annotation.\n\nNew annotation keys use the `dash0.com/` prefix. The legacy `dash0-threshold-degraded` /\n`dash0-threshold-critical` forms (and their unprefixed variants) are still lifted for compatibility\nbut are not extended.\n","type":"object","additionalProperties":{"type":"string"}}},"required":["name"]},"PrometheusRuleSpec":{"description":"Spec of the PrometheusRule resource containing rule groups.\n","properties":{"groups":{"description":"Rule groups. Each group is evaluated independently at its own interval.\nUnlike the upstream PrometheusRule CRD, this field is required and must contain exactly one group.\n","type":"array","items":{"$ref":"#/components/schemas/PrometheusRuleGroup"},"minItems":1,"maxItems":1}},"required":["groups"]},"PrometheusRuntimeInfo":{"description":"Runtime information about the Prometheus-compatible server. Dash0 is not a single\nPrometheus process, so most of the upstream runtime fields are not applicable: only\n`reloadConfigSuccess` and `storageRetention` carry meaning. The remaining fields are\nretained for upstream API compatibility but are always empty/zero — Dash0 does not\nexpose process, Go-runtime, or filesystem internals.\n","type":"object","properties":{"startTime":{"description":"Not exposed by Dash0; always the zero time.","type":"string","format":"date-time"},"CWD":{"description":"Not exposed by Dash0; always empty.","type":"string"},"hostname":{"description":"Not exposed by Dash0; always empty.","type":"string"},"serverTime":{"description":"Not exposed by Dash0; always the zero time.","type":"string","format":"date-time"},"reloadConfigSuccess":{"description":"Always `true`.","type":"boolean"},"lastConfigTime":{"description":"Not exposed by Dash0; always the zero time.","type":"string","format":"date-time"},"corruptionCount":{"description":"Not exposed by Dash0; always 0.","type":"integer","format":"int64"},"goroutineCount":{"description":"Not exposed by Dash0; always 0.","type":"integer"},"GOMAXPROCS":{"description":"Not exposed by Dash0; always 0.","type":"integer"},"GOMEMLIMIT":{"description":"Not exposed by Dash0; always 0.","type":"integer","format":"int64"},"GOGC":{"description":"Not exposed by Dash0; always empty.","type":"string"},"GODEBUG":{"description":"Not exposed by Dash0; always empty.","type":"string"},"storageRetention":{"description":"The data retention period.","type":"string"}}},"PrometheusRuntimeInfoResponse":{"properties":{"status":{"type":"string"},"data":{"$ref":"#/components/schemas/PrometheusRuntimeInfo"},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusScalarResult":{"$ref":"#/components/schemas/MetricSample"},"PrometheusSeriesResponse":{"properties":{"status":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusMetric"}},"warnings":{"type":"array","items":{"type":"string"}}},"required":["status"]},"PrometheusStringResult":{"$ref":"#/components/schemas/MetricSample"},"PrometheusVectorResult":{"type":"array","items":{"$ref":"#/components/schemas/PrometheusVectorSampleResult"}},"PrometheusVectorSampleResult":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/PrometheusMetric"},"value":{"$ref":"#/components/schemas/MetricSample"}},"required":["metric","value"]},"QueryError":{"description":"Structured error information for query errors. Present alongside the error string when the error is related to the user's query (syntax, semantic, or execution errors). Not present for system-level errors (unauthorized access, unexpected failures).\n","properties":{"title":{"description":"Short error title in plain text (no markdown), e.g. Syntax error - Invalid LIMIT clause","type":"string"},"description":{"description":"Human-readable explanation of what went wrong and how to fix it. May contain markdown (inline code, bold, lists).","type":"string"},"correctedQuery":{"description":"Validated and formatted corrected SQL query. Only present when an AI-suggested correction is available and passes validation.","type":"string"}},"required":["title","description"]},"RelativeTime":{"description":"A relative time reference based on the current time (\"now\").\n\n**Format**: `now[+/-duration]`\n\n**Examples**:\n- `now` - current time\n- `now-30m` - 30 minutes ago\n- `now-1h` - 1 hour ago\n- `now-1d` - 1 day ago\n\n**Duration Units**:\n- `s` - seconds\n- `m` - minutes\n- `h` - hours\n- `d` - days\n- `w` - weeks\n- `M` - months\n","type":"string","pattern":"^now.*$"},"Resource":{"type":"object","properties":{"attributes":{"type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"droppedAttributesCount":{"type":"integer","format":"int64"},"firstSeenUnixNano":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"string","format":"uint64"},"lastSeenUnixNano":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"string","format":"uint64"},"operationTypes":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"array","items":{"type":"string"}},"deploymentEnvironments":{"$ref":"#/components/schemas/ResourceDeploymentEnvironments","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"languages":{"$ref":"#/components/schemas/ResourceLanguages","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"orchestrations":{"$ref":"#/components/schemas/ResourceOrchestrations","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."},"clouds":{"$ref":"#/components/schemas/ResourceClouds","description":"The property is only included when `includeOTLPSchemaExtensions` is `true`."}},"required":["attributes"]},"ResourceCloud":{"description":"Resource cloud identified based on the `cloud.provider` resource attribute. Some sample values:\n- alibaba_cloud\n- aws\n- azure\n- gcp\n- heroku\n- ibm_cloud\n- tencent_cloud\n","type":"string"},"ResourceClouds":{"type":"array","items":{"$ref":"#/components/schemas/ResourceCloud"}},"ResourceDeploymentEnvironment":{"description":"The value of the `deployment.environment.name` (or `deployment.environment` pre v1.27 semconvs)","type":"string"},"ResourceDeploymentEnvironments":{"type":"array","items":{"$ref":"#/components/schemas/ResourceDeploymentEnvironment"}},"ResourceLanguage":{"description":"Resource language identified based on the `telemetry.sdk.language` resource attribute. Some sample values:\n- cpp\n- dotnet\n- erlang\n- go\n- java\n- nodejs\n- php\n- python\n- ruby\n- rust\n- swift\n- webjs\n","type":"string"},"ResourceLanguages":{"type":"array","items":{"$ref":"#/components/schemas/ResourceLanguage"}},"ResourceLogs":{"type":"object","properties":{"resource":{"$ref":"#/components/schemas/Resource"},"scopeLogs":{"type":"array","items":{"$ref":"#/components/schemas/ScopeLogs"},"minItems":1},"schemaUrl":{"type":"string"}},"required":["resource","scopeLogs"]},"ResourceOrchestration":{"description":"Resource orchestration identified based on orchestration related resource attributes, e.g., existence\nof `k8s.*` resource attribute.\n","type":"string","enum":["kubernetes"]},"ResourceOrchestrations":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOrchestration"}},"ResourceSpans":{"type":"object","properties":{"resource":{"$ref":"#/components/schemas/Resource"},"scopeSpans":{"type":"array","items":{"$ref":"#/components/schemas/ScopeSpans"},"minItems":1},"schemaUrl":{"type":"string"}},"required":["resource","scopeSpans"]},"RespectNativeCodingAgentTelemetry":{"description":"Controls whether OpenTelemetry telemetry natively emitted by coding agents\n(e.g. Claude Code) is processed by Darkplane.\n\n- `disabled`: Native coding-agent telemetry is not processed by Darkplane.\n- `enabled`: Native coding-agent telemetry is processed by Darkplane.\n","type":"string","enum":["disabled","enabled"]},"ResultRow":{"properties":{"values":{"type":"array","items":{"$ref":"#/components/schemas/KeyValue"}}},"required":["values"]},"ResultRows":{"type":"array","items":{"$ref":"#/components/schemas/ResultRow"}},"RetentionClass":{"description":"The retention class selected for a signal, per dataset. The value is the\ntotal retention in days, not an increase on top of a baseline.\nCustomer-selectable signals (logs, spans, web events) expose the full\nset; non-selectable signals (metrics, profiling) keep their platform\ndefaults.\n\n- `30d`: 30 days total (the included baseline).\n- `60d`: 60 days total.\n- `90d`: 90 days total.\n- `120d`: 120 days total.\n- `210d`: 210 days total.\n- `390d`: 390 days total.\n","type":"string","enum":["30d","60d","90d","120d","210d","390d"]},"Sampling":{"properties":{"mode":{"$ref":"#/components/schemas/SamplingMode"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange","description":"The global time range. We need this to differentiate between a local time selection, e.g., in the heat map, and the global\ntime selection that is defining the sampling decision. We do this so that a selection in the heat map (which is based off\nthe global time range) and the span list (which is based on the heat map selected time range) show consistent results.\n\nWithout this, it could be that an a selection of an empty area in the heat map produces results in the span list.\n"}},"required":["mode","timeRange"]},"SamplingCondition":{"anyOf":[{"$ref":"#/components/schemas/SamplingConditionAnd"},{"$ref":"#/components/schemas/SamplingConditionOttl"},{"$ref":"#/components/schemas/SamplingConditionProbabilistic"},{"$ref":"#/components/schemas/SamplingConditionError"}]},"SamplingConditionAnd":{"properties":{"kind":{"type":"string","enum":["and"]},"spec":{"$ref":"#/components/schemas/SamplingConditionAndSpec"}},"required":["kind","spec"]},"SamplingConditionAndSpec":{"properties":{"conditions":{"type":"array","items":{"$ref":"#/components/schemas/SamplingCondition"},"minItems":1}},"required":["conditions"]},"SamplingConditionError":{"description":"Matches spans that have the have `otel.span.status.code=ERROR`\n","properties":{"kind":{"type":"string","enum":["error"]},"spec":{"$ref":"#/components/schemas/SamplingConditionErrorSpec"}},"required":["kind","spec"]},"SamplingConditionErrorSpec":{"properties":{},"required":[]},"SamplingConditionOttl":{"properties":{"kind":{"type":"string","enum":["ottl"]},"spec":{"$ref":"#/components/schemas/SamplingConditionOttlSpec"}},"required":["kind","spec"]},"SamplingConditionOttlSpec":{"properties":{"ottl":{"type":"string"}},"required":["ottl"]},"SamplingConditionProbabilistic":{"properties":{"kind":{"type":"string","enum":["probabilistic"]},"spec":{"$ref":"#/components/schemas/SamplingConditionProbabilisticSpec"}},"required":["kind","spec"]},"SamplingConditionProbabilisticSpec":{"properties":{"rate":{"description":"A value between 0 and 1 reflecting the percentage of traces that should be sampled probabilistically.\nThis sampling decision is made deterministically by inspecting the trace ID.\n","type":"number","minimum":0,"maximum":1}},"required":["rate"]},"SamplingDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0Sampling"]},"metadata":{"$ref":"#/components/schemas/SamplingMetadata"},"spec":{"$ref":"#/components/schemas/SamplingSpec"}},"required":["kind","metadata","spec"]},"SamplingDisplay":{"properties":{"name":{"description":"Short-form name for the view to be shown prominently within the view list and atop\nthe screen when the view is selected.\n","type":"string"}},"required":["name"]},"SamplingLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/origin":{"type":"string"},"dash0.com/version":{"type":"string"},"dash0.com/dataset":{"type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"},"custom":{"type":"object","additionalProperties":{"type":"string"}}}},"SamplingMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/SamplingLabels"}},"required":["name"]},"SamplingMode":{"type":"string","enum":["adaptive","disabled"]},"SamplingRateLimit":{"description":"Rate limit is helpful to avoid ingesting extremely large amounts of spans when the sampling conditions are\ntriggering much more frequently than expected. For example, when the tail sampling rule is configured to match\nevery error, then a system-wide outage can result in a huge amount of spans being ingested.\n\nNote: Probabilistic-only sampling rules do not support rate limiting.\n","properties":{"rate":{"description":"The maximum number of traces per minute that should be allowed for this sampling rule. Dash0 will make every\neffort not to exceed this rate. However, there is also no guarantee that Dash0 will match exactly this rate.\nDash0 is attempting to hit a rate that is lower than or equal to the configured rate.\n\nDash0 cannot guarantee that very low rate limits (<=16) are upheld.\n","type":"integer"}},"required":["rate"]},"SamplingRuleCreateRequest":{"$ref":"#/components/schemas/SamplingDefinition"},"SamplingRuleResponse":{"$ref":"#/components/schemas/SamplingDefinition"},"SamplingSpec":{"properties":{"enabled":{"type":"boolean"},"display":{"$ref":"#/components/schemas/SamplingDisplay"},"conditions":{"$ref":"#/components/schemas/SamplingCondition"},"rateLimit":{"$ref":"#/components/schemas/SamplingRateLimit"}},"required":["enabled","conditions"]},"ScheduleTriggerVariableName":{"description":"Variables provided by the `schedule` trigger.\n\n- `cron`: The cron expression that fired.\n","type":"string","enum":["cron"]},"ScheduledAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["schedule"]}]},"spec":{"$ref":"#/components/schemas/ScheduledAgenticWorkflowTriggerSpec"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"ScheduledAgenticWorkflowTriggerSpec":{"properties":{"cron":{"description":"Crontab-notation to express when the automation is supposed to run.\n\n```\n{minute} {hour} {day} {month} {weekday}\n```\n\nFor example, `0 12 * * MON-WED,FRI` is every M/Tu/W/F at noon.\n\nPredefined schedules are also supported:\n\n- `@yearly` (or `@annually`): Run once a year at midnight on January 1st.\n- `@monthly`: Run once a month at midnight on the first day.\n- `@weekly`: Run once a week at midnight on Sunday.\n- `@daily` (or `@midnight`): Run once a day at midnight.\n- `@hourly`: Run once an hour at the beginning of the hour.\n- `@every <duration>`: Run at fixed intervals, e.g. `@every 1h30m` or `@every 5m`.\n","type":"string"},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"$ref":"#/components/schemas/ScheduleTriggerVariableName"},"readOnly":true}},"required":["cron"]},"ScopeLogs":{"type":"object","properties":{"scope":{"$ref":"#/components/schemas/InstrumentationScope"},"logRecords":{"type":"array","items":{"$ref":"#/components/schemas/LogRecord"},"minItems":1},"schemaUrl":{"type":"string"}},"required":["logRecords"]},"ScopeSpans":{"type":"object","properties":{"scope":{"$ref":"#/components/schemas/InstrumentationScope"},"spans":{"type":"array","items":{"$ref":"#/components/schemas/Span"},"minItems":1},"schemaUrl":{"type":"string"}},"required":["spans"]},"SecretRef":{"type":"object","properties":{"id":{"description":"Opaque identifier of the encrypted secret.","type":"string"},"hash":{"description":"The hash is computed as follows:\n1. Parse the secrets JSON into a generic structure\n2. Recursively sort all object keys alphabetically (Unicode code point order)\n3. Re-serialize to compact JSON (no whitespace between tokens)\n4. Compute SHA-256 hash of the UTF-8 encoded JSON bytes\n5. Encode the hash as lowercase hexadecimal string\n\nThis ensures the hash is stable and reproducible across different implementations.\n","type":"string"}},"required":["id","hash"]},"SemanticConventionUpgrades":{"description":"Choose whether or not semantic convention upgrades should be executed. Can be one of:\n\n- disabled: No upgrade will be executed\n- latest: We will always upgrade to the latest and greatest\n- vX.X.X: A SEMVER version. We will automatically upgrade up to that version (inclusive)\n\nDefaults to `latest` for new organizations.\n","type":"string"},"SettingsPerOrganizationAndDatasetInfo":{"type":"object","properties":{"technicalID":{"type":"string"},"signalControlEdge":{"$ref":"#/components/schemas/SignalControlEdgeSettings","description":"SignalControl configuration for the organization. When `enabled` is false,\nedge components switch to passthrough mode (no spam filtering, RED metrics,\nsignal-to-metrics, tail sampling, or barker processing).\n"},"signalControlMetering":{"$ref":"#/components/schemas/SignalControlMeteringSettings","description":"Edge billing metering enforcement for the organization. Deliberately **not** in this\nschema's `required` list, unlike `signalControlEdge`: an absent object means warn mode,\nso absence has to stay expressible. Requiring it would also force a backfill for every\nexisting organization, which the rollout does not need — each one receives an explicit\nvalue by the end of the transition window.\n"},"datasetSettings":{"type":"array","items":{"$ref":"#/components/schemas/DatasetSettings"}},"timeSeriesAggregationSettings":{"type":"array","items":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}},"samplingSettings":{"type":"array","items":{"$ref":"#/components/schemas/SamplingDefinition"}},"sourceMapSettings":{"type":"array","items":{"$ref":"#/components/schemas/SourceMapIntegration"}},"signalToMetricsSettings":{"type":"array","items":{"$ref":"#/components/schemas/SignalToMetricsDefinition"}},"telemetryTransformationRuleSettings":{"type":"array","items":{"$ref":"#/components/schemas/TelemetryTransformationRuleDefinition"}},"observedPatterns":{"type":"array","items":{"$ref":"#/components/schemas/ObservedPatternEntry"}}},"required":["technicalID","signalControlEdge","datasetSettings","timeSeriesAggregationSettings","samplingSettings","sourceMapSettings","signalToMetricsSettings","telemetryTransformationRuleSettings"]},"SeverityNumber":{"description":"SEVERITY_NUMBER_UNSPECIFIED = 0;\nSEVERITY_NUMBER_TRACE  = 1;\nSEVERITY_NUMBER_TRACE2 = 2;\nSEVERITY_NUMBER_TRACE3 = 3;\nSEVERITY_NUMBER_TRACE4 = 4;\nSEVERITY_NUMBER_DEBUG  = 5;\nSEVERITY_NUMBER_DEBUG2 = 6;\nSEVERITY_NUMBER_DEBUG3 = 7;\nSEVERITY_NUMBER_DEBUG4 = 8;\nSEVERITY_NUMBER_INFO   = 9;\nSEVERITY_NUMBER_INFO2  = 10;\nSEVERITY_NUMBER_INFO3  = 11;\nSEVERITY_NUMBER_INFO4  = 12;\nSEVERITY_NUMBER_WARN   = 13;\nSEVERITY_NUMBER_WARN2  = 14;\nSEVERITY_NUMBER_WARN3  = 15;\nSEVERITY_NUMBER_WARN4  = 16;\nSEVERITY_NUMBER_ERROR  = 17;\nSEVERITY_NUMBER_ERROR2 = 18;\nSEVERITY_NUMBER_ERROR3 = 19;\nSEVERITY_NUMBER_ERROR4 = 20;\nSEVERITY_NUMBER_FATAL  = 21;\nSEVERITY_NUMBER_FATAL2 = 22;\nSEVERITY_NUMBER_FATAL3 = 23;\nSEVERITY_NUMBER_FATAL4 = 24;\n","type":"integer","format":"int32","default":0},"SignalControlEdgeSettings":{"description":"Per-organization SignalControl *edge* configuration (the edge facet of SignalControl).\nExtensible — additional edge sub-settings will be added here over time. Other facets\n(e.g. SaaS-side) are modelled as their own schemas under sibling endpoints, not as\nfields here.\n","type":"object","properties":{"enabled":{"description":"Whether the organization is entitled to use SignalControl features.","type":"boolean"}},"required":["enabled"]},"SignalControlMeteringSettings":{"description":"Per-organization control over edge billing metering enforcement. Set centrally by Dash0\nand not customer-configurable.\n\nDeliberately a sibling of `signalControlEdge` rather than a field inside it: that object\nis a pre-release entitlement gate that goes away at GA, and enforcement has to outlive it.\n\nEvery field is optional, and absence is meaningful — see `enforce`.\n","type":"object","properties":{"enforce":{"description":"Whether edge collectors enforce billing metering for this organization.\n\n`true` enforces: Signal Control components on edge stop acting on telemetry that no\nmetering processor marked, so a capability cannot run on usage nothing metered.\n\n`false` and an absent field both mean warn mode: the capabilities keep working on\nunmarked telemetry and the misconfiguration is only logged and reported. The two\nnegatives are collapsed on purpose, so an organization can be returned to warn mode by\nwriting `false` rather than by deleting a key, and an organization nobody has touched\nbehaves identically to one explicitly parked.\n\nThe collector's compiled-in default is warn, permanently — enforcement is only ever\nsomething the server turns on. A collector that has never synced never enforces, but\none that has been told to enforce keeps enforcing if it later loses contact.\n","type":"boolean"}}},"SignalToMetricsBulkUpsertRequest":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SignalToMetricsDefinition"},"minItems":1,"maxItems":500}},"required":["items"]},"SignalToMetricsBulkUpsertResponse":{"type":"object","properties":{"created":{"description":"Number of rules that were newly created.","type":"integer"},"updated":{"description":"Number of rules that were updated.","type":"integer"}},"required":["created","updated"]},"SignalToMetricsCounts":{"type":"object","properties":{"logs":{"$ref":"#/components/schemas/SignalToMetricsSignalCounts","description":"Counts for rules whose source signal is `logs`."},"spans":{"$ref":"#/components/schemas/SignalToMetricsSignalCounts","description":"Counts for rules whose source signal is `spans`."}},"required":["logs","spans"]},"SignalToMetricsCreateRequest":{"$ref":"#/components/schemas/SignalToMetricsDefinition"},"SignalToMetricsDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0SignalToMetrics"]},"metadata":{"$ref":"#/components/schemas/SignalToMetricsMetadata"},"spec":{"$ref":"#/components/schemas/SignalToMetricsSpec"}},"required":["kind","metadata","spec"]},"SignalToMetricsDisplay":{"properties":{"name":{"type":"string"}},"required":["name"]},"SignalToMetricsGroupAnnotations":{"properties":{"dash0.com/created-at":{"description":"Timestamp when the rule was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/deleted-at":{"description":"Soft-delete timestamp. Present when the rule has been deleted but not yet purged. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/folder-path":{"description":"Optional UI folder path for organising groups (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"dash0.com/sharing":{"description":"Comma-separated list of principals to grant read access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Note: this resource type does not currently enforce sharing; the field is accepted but has no effect on access.","type":"string"}}},"SignalToMetricsLabels":{"properties":{"dash0.com/id":{"description":"Unique internal ID of the signal-to-metrics rule. Set by the server on creation; do not set manually.","type":"string"},"dash0.com/origin":{"description":"External identifier for API-managed resources (e.g. the CRD name from an operator or Terraform resource ID). Empty for user-created rules; non-empty for rules created via the internal API.","type":"string"},"dash0.com/version":{"description":"Current version of the rule. Needs to be set when updating a rule to prevent conflicting writes.","type":"string"},"dash0.com/dataset":{"description":"Dataset this rule belongs to. Defaults to the default dataset when absent.","type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}}},"SignalToMetricsMatch":{"properties":{"signal":{"$ref":"#/components/schemas/SignalToMetricsSignalType"},"filters":{"$ref":"#/components/schemas/FilterCriteria"}},"required":["signal","filters"]},"SignalToMetricsMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/SignalToMetricsLabels"},"annotations":{"$ref":"#/components/schemas/SignalToMetricsGroupAnnotations"}},"required":["name"]},"SignalToMetricsOutput":{"properties":{"name":{"description":"The name of the resulting metric","type":"string"},"description":{"description":"Will be used as metadata on the generated metric.","type":"string"},"interval":{"$ref":"#/components/schemas/Duration","description":"Defines at what interval to output a data point for the matched signals."},"keepResourceAttributes":{"description":"Key matchers that select which resource attributes from the incoming signal\nare kept as resource attributes on the output metric. An attribute is kept\nif its key matches any matcher in this list. By default, no additional\nresource attributes are kept.\n","type":"array","items":{"$ref":"#/components/schemas/Matcher"}},"keepSignalAttributes":{"description":"Key matchers that select which signal attributes (span attributes for traces,\nlog record attributes for logs) from the incoming signal are kept as metric\nattributes (dimensions) on the output metric. An attribute is kept if its\nkey matches any matcher in this list. By default, no additional signal\nattributes are kept, except for otel.span.status.code which is always set\nwhen the signal type is spans.\n","type":"array","items":{"$ref":"#/components/schemas/Matcher"}}},"required":["name","interval"]},"SignalToMetricsResponse":{"$ref":"#/components/schemas/SignalToMetricsDefinition"},"SignalToMetricsSignalCounts":{"type":"object","properties":{"total":{"description":"Rules with this source signal, enabled and disabled alike.","type":"integer"},"enabled":{"description":"The subset that is enabled. Disabled rules are `total - enabled`.","type":"integer"}},"required":["total","enabled"]},"SignalToMetricsSignalType":{"type":"string","enum":["spans","logs"]},"SignalToMetricsSpec":{"properties":{"enabled":{"type":"boolean"},"display":{"$ref":"#/components/schemas/SignalToMetricsDisplay"},"match":{"$ref":"#/components/schemas/SignalToMetricsMatch"},"output":{"$ref":"#/components/schemas/SignalToMetricsOutput"},"targetDatasetMode":{"$ref":"#/components/schemas/SignalToMetricsTargetDatasetMode","description":"Controls where the generated metric is written.\nDefaults to `original` when absent. Old-format rules omit this field entirely.\n"},"alternativeDatasetId":{"description":"The slug of the target dataset. Required when targetDatasetMode is\n`alternative` or `both`. Must not be set when targetDatasetMode is\n`original` or absent.\n","type":"string"}},"required":["enabled","display","match","output"]},"SignalToMetricsTargetDatasetMode":{"description":"Controls where the generated metric is written.\n- `original`: Metric lands in the dataset where the rule is defined.\n- `alternative`: Metric lands in the dataset specified by `alternativeDatasetId`.\n- `both`: Metric is produced twice — once for the original dataset, once for the alternative.\n","type":"string","enum":["original","alternative","both"]},"SignalToMetricsTestRequest":{"properties":{"definition":{"$ref":"#/components/schemas/SignalToMetricsDefinition"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange","description":"Time window over which to simulate the rule. Defaults to the last 15 minutes.\n"}},"required":["definition"]},"SignalToMetricsTestResponse":{"properties":{"executionTime":{"$ref":"#/components/schemas/FixedTime"},"timeRange":{"$ref":"#/components/schemas/TimeRange","description":"Concrete time window that was evaluated, with relative references resolved.\n"},"matchedCount":{"description":"Number of signals (spans or logs) matching `spec.match.filters` over the\nevaluated time window.\n","type":"integer","format":"int64"}},"required":["executionTime","timeRange","matchedCount"]},"SlackBotConfig":{"properties":{"teamId":{"type":"string"},"channel":{"type":"string"}},"required":["teamId","channel"]},"SlackBotFailedCheckAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["slack_bot.failed_check.new"]}]},"spec":{"$ref":"#/components/schemas/SlackBotFailedCheckAgenticWorkflowTriggerSpec"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"SlackBotFailedCheckAgenticWorkflowTriggerSpec":{"type":"object","properties":{"message":{"description":"A command or keyword that the Slack message must contain. Evaluated as a\ncase-insensitive substring match (e.g., `investigate` matches any message\ncontaining \"investigate\").\n","type":"string"},"channelNames":{"description":"Optional list of Slack channel names (e.g., `general`, `alerts`). When\nspecified, only failed checks reported in these channels trigger the automation.\n","type":"array","items":{"type":"string"}},"checkRuleIDs":{"description":"Optional list of check rule IDs. When specified, only failed checks\nwhose rule ID matches one of the listed values trigger the automation.\n","type":"array","items":{"type":"string"}},"labelFilters":{"$ref":"#/components/schemas/FilterCriteria","description":"Optional filters applied to check labels at dispatch time. When defined\nand not empty, only failed checks whose labels satisfy all filter criteria\ntrigger this automation (AND semantics). Each criterion specifies a label key\nand a matching operator (e.g., is, contains, starts_with, matches).\n"},"annotationFilters":{"$ref":"#/components/schemas/FilterCriteria","description":"Optional filters applied to check annotations at dispatch time. When defined\nand not empty, only failed checks whose annotations satisfy all filter\ncriteria trigger this automation (AND semantics). Each criterion specifies an\nannotation key and a matching operator (e.g., is, contains, starts_with, matches).\n"},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available. The dispatch\npayload carries the Slack event's variables and the failed check's.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/SlackTriggerVariableName"},{"$ref":"#/components/schemas/FailedCheckTriggerVariableName"}]},"readOnly":true}}},"SlackBotMessageAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["slack_bot.message"]}]},"spec":{"$ref":"#/components/schemas/SlackBotMessageAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the Slack\nthread (`slack.thread`).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"SlackBotMessageAgenticWorkflowTriggerSpec":{"type":"object","properties":{"message":{"description":"A command or keyword that the Slack message must contain. Evaluated as a\ncase-insensitive substring match (e.g., `investigate` matches any message\ncontaining \"investigate\").\n","type":"string"},"channelNames":{"description":"Optional list of Slack channel names (e.g., `general`, `alerts`). When\nspecified, only messages from these channels trigger the automation. When omitted,\nmessages from any channel match.\n","type":"array","items":{"type":"string"}},"userHandles":{"description":"Optional list of Slack user handles without the @ prefix (e.g., `jane.doe`).\nWhen specified, only messages from these users trigger the automation. When omitted,\nmessages from any user match.\n","type":"array","items":{"type":"string"}},"threadOnly":{"description":"When true, only messages within a thread trigger the automation. Defaults to false.\n","type":"boolean"},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"$ref":"#/components/schemas/SlackTriggerVariableName"},"readOnly":true}},"required":["message"]},"SlackBotReactionAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["slack_bot.reaction"]}]},"spec":{"$ref":"#/components/schemas/SlackBotReactionAgenticWorkflowTriggerSpec"},"delivery":{"$ref":"#/components/schemas/AgenticWorkflowTriggerDelivery","description":"Defaults to `spawn`. When `continue`, routes into the agent that owns the Slack\nthread (`slack.thread`).\n"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"SlackBotReactionAgenticWorkflowTriggerSpec":{"type":"object","properties":{"emojis":{"description":"List of emoji names (without colons) that trigger the automation. Each is evaluated\nas an exact match. The automation triggers when any of the listed emojis is used.\n","type":"array","items":{"type":"string"}},"channelNames":{"description":"Optional list of Slack channel names (e.g., `general`, `alerts`). When\nspecified, only reactions in these channels trigger the automation.\n","type":"array","items":{"type":"string"}},"userHandles":{"description":"Optional list of Slack user handles without the @ prefix (e.g., `jane.doe`).\nWhen specified, only reactions from these users trigger the automation.\n","type":"array","items":{"type":"string"}},"availableVariables":{"description":"The trigger-specific variables available as `{{variable.name}}` when this trigger fires.\nIncludes both the common Slack variables and reaction-specific variables.\nThis is in addition to the built-in variables that are always available.\n","type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/SlackTriggerVariableName"},{"$ref":"#/components/schemas/SlackReactionTriggerVariableName"}]},"readOnly":true}},"required":["emojis"]},"SlackConfig":{"properties":{"webhookURL":{"type":"string","format":"url"},"channel":{"type":"string"}},"required":["webhookURL","channel"]},"SlackReactionTriggerVariableName":{"description":"Additional variable provided only by the `slack_bot.reaction` trigger.\n\n- `slack.reaction.emoji`: The emoji name (without colons) that was added as a reaction.\n","type":"string","enum":["slack.reaction.emoji"]},"SlackTriggerVariableName":{"description":"Variables provided by all Slack-based triggers (`slack_bot.message`, `slack_bot.reaction`,\n`slack_bot.failed_check.new`).\n\n- `slack.channel.name`: Name of the Slack channel where the event occurred.\n- `slack.channel.id`: Slack channel ID.\n- `slack.user.handle`: Handle of the user who triggered the event.\n- `slack.user.id`: Slack user ID.\n- `slack.team.id`: Slack workspace (team) ID.\n- `slack.message.timestamp`: Timestamp of the message in Slack's format.\n- `slack.message.text`: Text content of the message. May be absent for some trigger types.\n- `slack.thread.timestamp`: Thread timestamp. Only present when the event occurred in a thread.\n","type":"string","enum":["slack.channel.name","slack.channel.id","slack.user.handle","slack.user.id","slack.team.id","slack.message.timestamp","slack.message.text","slack.thread.timestamp"]},"SloAlertCondition":{"description":"An alert condition that defines when an alert should fire. Can be inline or a reference to an external AlertCondition.","properties":{"conditionRef":{"description":"Reference to an external AlertCondition by name.","type":"string"},"kind":{"type":"string"},"metadata":{"$ref":"#/components/schemas/SloAlertConditionMetadata"},"spec":{"$ref":"#/components/schemas/SloAlertConditionSpec"}}},"SloAlertConditionDetails":{"description":"Details of the alert condition. Defaults to burnrate kind.","properties":{"kind":{"description":"Kind of alerting condition. Defaults to 'burnrate'.","type":"string"},"op":{"$ref":"#/components/schemas/SloComparisonOperator","description":"Comparison operator used to compare against the threshold."},"threshold":{"description":"Threshold value for the condition.","type":"number"},"lookbackWindow":{"$ref":"#/components/schemas/Duration","description":"Time frame for calculating the threshold (e.g. '1h', '5m')."},"alertAfter":{"$ref":"#/components/schemas/Duration","description":"Duration the condition must be valid before alerting. Defaults to 0m."}},"required":["op","threshold","lookbackWindow"]},"SloAlertConditionMetadata":{"properties":{"name":{"type":"string"},"displayName":{"type":"string"}}},"SloAlertConditionSpec":{"properties":{"description":{"description":"Description of the alert condition, up to 1050 characters.","type":"string","maxLength":1050},"severity":{"description":"Severity level of the alert (e.g. 'page', 'warning', 'critical').","type":"string"},"condition":{"$ref":"#/components/schemas/SloAlertConditionDetails"}},"required":["severity","condition"]},"SloAlertNotificationTarget":{"description":"An alert notification target. Can be inline or a reference to an external AlertNotificationTarget via targetRef.","properties":{"targetRef":{"description":"Reference to an external AlertNotificationTarget by name.","type":"string"},"kind":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"spec":{"type":"object","additionalProperties":true}}},"SloAlertPolicy":{"description":"An alert policy following the OpenSLO AlertPolicy structure. Can contain inline conditions and notification targets, or reference an external policy via alertPolicyRef.\nNot supported by Dash0: alert policies on SLOs are accepted for OpenSLO compatibility but ignored. See the alertPolicies field on SloSpec.","properties":{"alertPolicyRef":{"description":"Reference to an external AlertPolicy by name.","type":"string"},"kind":{"type":"string"},"metadata":{"$ref":"#/components/schemas/SloAlertPolicyMetadata"},"spec":{"$ref":"#/components/schemas/SloAlertPolicySpec"}}},"SloAlertPolicyMetadata":{"properties":{"name":{"type":"string"},"displayName":{"type":"string"}}},"SloAlertPolicySpec":{"properties":{"description":{"description":"Description of the alert policy, up to 1050 characters.","type":"string","maxLength":1050},"alertWhenBreaching":{"description":"Whether to trigger the alert when the condition is breaching.","type":"boolean"},"alertWhenResolved":{"description":"Whether to trigger the alert when the condition is resolved.","type":"boolean"},"alertWhenNoData":{"description":"Whether to trigger the alert when no data is available.","type":"boolean"},"conditions":{"description":"Alert conditions (max one condition per OpenSLO v1).","type":"array","items":{"$ref":"#/components/schemas/SloAlertCondition"}},"notificationTargets":{"description":"Notification targets for this alert policy.","type":"array","items":{"$ref":"#/components/schemas/SloAlertNotificationTarget"}}},"required":["alertWhenBreaching","alertWhenResolved","alertWhenNoData","conditions","notificationTargets"]},"SloAnnotations":{"description":"Resource annotations. Keys prefixed with `dash0.com/` are reserved for Dash0-managed\nmetadata. Some reserved keys are server-managed and ignored when supplied by the\ncaller (e.g. the timestamp annotations); others, like `dash0.com/enabled` and\n`dash0.com/display-name`, are client-settable and honored on write — see the\nindividual property descriptions. `dash0.com/display-name` holds an optional\nhuman-readable display name of the SLO, used instead of `metadata.name` when set\n(blank values are treated as unset). Blank keys are ignored. Use any other key for\nuser-defined annotations, which are stored and returned on read. At most 50\nuser-defined annotations are allowed.\n","properties":{"dash0.com/created-at":{"description":"Timestamp when the SLO was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/deleted-at":{"description":"Soft-delete timestamp. Present when the SLO has been deleted but not yet purged. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/folder-path":{"description":"Optional UI folder path for organising SLOs (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"dash0.com/sharing":{"description":"Comma-separated list of principals to grant read access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Sharing is honored only on assets that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API). Setting it on an asset that declares no dash0.com/origin is rejected with a 400 — manage that asset's access via the UI share dialog instead.","type":"string"},"dash0.com/enabled":{"description":"Whether the SLO is actively tracked. Dash0 extension. Client-settable. Stored as a string; valid values are 'true' and 'false'. Defaults to 'true'.","type":"string"}},"additionalProperties":{"type":"string"}},"SloBudgetingMethod":{"description":"- `Occurrences`: Ratio of counts of good events to total events.\n- `Timeslices`: Ratio of good time slices to total time slices.\n- `RatioTimeslices`: Average of all time slices' success ratios.\n","type":"string","enum":["Occurrences","Timeslices","RatioTimeslices"]},"SloCalendarWindow":{"description":"Calendar alignment configuration for a time window.","properties":{"startTime":{"description":"Start time in 24h format without time zone (e.g. '2020-01-21 12:30:00').","type":"string"},"timeZone":{"description":"IANA Time Zone Database name (e.g. 'America/New_York').","type":"string"}},"required":["startTime","timeZone"]},"SloComparisonOperator":{"description":"Conditional operator used to compare the SLI against a threshold value.","type":"string","enum":["lte","gte","lt","gt"]},"SloDefinition":{"description":"A Service Level Objective (SLO) that defines a target value or range of values for a\nservice level, described by a Service Level Indicator (SLI).\nImplements a subset of the OpenSLO v1 specification (https://openslo.com/) with\nDash0-specific extensions for access control, dataset scoping, and UI organization.\n\nThe API group accepts both the bare `openslo/v1` (upstream OpenSLO v1) and the\ndomain-qualified `openslo.com/v1` on write; reads always return the domain-qualified\n`openslo.com/v1`. The domain-qualified form (a Dash0 drift from upstream OpenSLO v1's\n`openslo/v1`) is required so the same document is installable as a Kubernetes\nCustomResourceDefinition, whose API group must contain a dot.\n\nCurrently supported: a single objective with an inline `ratioMetric` indicator,\n`Occurrences` budgeting, and a rolling `4w` (28d) time window.\n\nNot currently supported — requests using any of these are rejected with a 400 (the one\nexception is `alertPolicies`, see below): `thresholdMetric` SLIs; `indicatorRef`;\n`metricSource.metricSourceRef`; multiple or composite objectives (`compositeWeight`,\nper-objective `indicator`/`indicatorRef`); threshold objective fields (`op`/`value`);\ntime-slice objective fields (`timeSliceTarget`/`timeSliceWindow`); `Timeslices` and\n`RatioTimeslices` budgeting; and calendar-aligned time windows.\n\nAlerting on SLOs (spec.alertPolicies) is not supported. Unlike the other unsupported\nfields, `alertPolicies` is accepted for OpenSLO compatibility but silently ignored — it\nis not stored, evaluated, or returned on read; see spec.alertPolicies for details.\n\nSLOs evaluate with a fixed 5-minute settling delay applied automatically: at any\nmoment, the SLI reflects telemetry that arrived at least 5 minutes ago. This\nensures late-arriving signals are included in the SLI computation, at the cost of a\nsmall, fixed lag between live behavior and SLO state.\n","properties":{"apiVersion":{"type":"string","enum":["openslo/v1","openslo.com/v1"]},"kind":{"type":"string","enum":["SLO"]},"metadata":{"$ref":"#/components/schemas/SloMetadata"},"spec":{"$ref":"#/components/schemas/SloSpec"}},"required":["apiVersion","kind","metadata","spec"]},"SloIndicator":{"description":"Inline Service Level Indicator (SLI) following the OpenSLO SLI structure.","properties":{"metadata":{"$ref":"#/components/schemas/SloIndicatorMetadata"},"spec":{"$ref":"#/components/schemas/SloIndicatorSpec"}},"required":["spec"]},"SloIndicatorMetadata":{"description":"Metadata for the inline SLI.","properties":{"name":{"description":"Name of the SLI.","type":"string"},"displayName":{"description":"Human-readable display name for the SLI.","type":"string"}}},"SloIndicatorSpec":{"description":"SLI specification. A ratioMetric must be provided; thresholdMetric is not currently supported.","properties":{"description":{"description":"Optional description of the SLI, up to 1050 characters.","type":"string","maxLength":1050},"ratioMetric":{"$ref":"#/components/schemas/SloRatioMetric"},"thresholdMetric":{"$ref":"#/components/schemas/SloThresholdMetric","description":"Not currently supported — use a ratioMetric instead. Requests with a thresholdMetric SLI are rejected with a 400."}}},"SloLabels":{"description":"Resource labels. Keys prefixed with `dash0.com/` are reserved for Dash0-managed\nmetadata (id, version, dataset, origin, source); reserved or blank keys supplied by\nthe caller are ignored. Use any other key for user-defined labels, which are stored\nand returned on read. At most 50 user-defined labels are allowed.\n","properties":{"dash0.com/id":{"description":"Unique internal ID of the SLO. Set by the server on creation; do not set manually.","type":"string"},"dash0.com/origin":{"description":"External identifier for API-managed resources (e.g. the CRD name from an operator or Terraform resource ID). Empty for user-created SLOs; non-empty for SLOs created via the internal API. SLOs with a non-empty origin have write access controlled exclusively through explicit permission entries rather than by the admin role.","type":"string"},"dash0.com/version":{"description":"Current version of the SLO. Needs to be set when updating an SLO to prevent conflicting writes.","type":"string"},"dash0.com/dataset":{"description":"Dataset this SLO belongs to. Defaults to the default dataset when absent.","type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}},"additionalProperties":{"type":"string"}},"SloMetadata":{"properties":{"name":{"description":"Name of the SLO: an RFC 1123 compatible Kubernetes object name. Used as the display name when the `dash0.com/display-name` annotation is not set.","type":"string"},"labels":{"$ref":"#/components/schemas/SloLabels"},"annotations":{"$ref":"#/components/schemas/SloAnnotations"}},"required":["name"]},"SloMetricSource":{"description":"Connection and query details for a metric data source. Only the Prometheus data source is currently supported: provide `spec.query` as a bare PromQL vector selector (e.g. `http_requests_total{status=\"500\"}`) — function calls and aggregations are not accepted.","properties":{"metricSourceRef":{"description":"Reference to an existing DataSource object by name. Not currently supported — provide an inline `spec.query` instead. Requests that set metricSourceRef are rejected with a 400.","type":"string"},"type":{"description":"Predefined data source type. Only 'Prometheus' is currently supported (the default when omitted); other types are rejected with a 400.","type":"string"},"spec":{"description":"Data-source-specific query parameters. For Prometheus this is `{ query: \"<bare PromQL vector selector>\" }`.","type":"object","additionalProperties":true}},"required":["spec"]},"SloMetricSourceWrapper":{"description":"Wraps a metric source for use in ratio metric numerator/denominator/raw.","properties":{"metricSource":{"$ref":"#/components/schemas/SloMetricSource"}},"required":["metricSource"]},"SloObjective":{"description":"An objective threshold for the SLO. Defines tolerance levels for the SLI metrics.","properties":{"displayName":{"description":"Human-readable name for this objective.","type":"string"},"op":{"$ref":"#/components/schemas/SloComparisonOperator","description":"Comparison operator used to compare the SLI against the value (for thresholdMetric SLIs). Not currently supported — requests that set it are rejected with a 400."},"value":{"description":"Threshold value to compare against (for thresholdMetric SLIs). Not currently supported — requests that set it are rejected with a 400.","type":"number"},"target":{"description":"Budget target for this objective as a fraction [0.0, 1.0). Mutually exclusive with targetPercent; one of the two must be provided.","type":"number"},"targetPercent":{"description":"Budget target for this objective as a percentage [0.0, 100). Mutually exclusive with target; one of the two must be provided.","type":"number"},"timeSliceTarget":{"description":"Target for the ratio of good time slices to total time slices (0.0, 1.0] (for Timeslices budgeting). Not currently supported — requests that set it are rejected with a 400.","type":"number"},"timeSliceWindow":{"$ref":"#/components/schemas/Duration","description":"Size of a time slice for evaluation (for Timeslices/RatioTimeslices budgeting). Not currently supported — requests that set it are rejected with a 400."},"indicator":{"$ref":"#/components/schemas/SloIndicator","description":"Inline SLI for composite SLOs. Composite SLOs are not currently supported — requests that set a per-objective indicator are rejected with a 400. Use the SLO's top-level indicator."},"indicatorRef":{"description":"Reference to an external SLI for composite SLOs. Composite SLOs are not currently supported — requests that set it are rejected with a 400.","type":"string"},"compositeWeight":{"description":"Weight multiplier for composite SLOs. Composite SLOs are not currently supported — requests that set it are rejected with a 400.","type":"number"}}},"SloRatioMetric":{"description":"Ratio-based SLI metric. Provide either good+total, bad+total, or raw with rawType.","properties":{"counter":{"description":"True if the metric is a monotonically increasing counter, false if it is a single number that can arbitrarily go up or down. Ignored when using raw.","type":"boolean"},"good":{"$ref":"#/components/schemas/SloMetricSourceWrapper","description":"The numerator representing good events. Either good or bad must be provided when using total."},"bad":{"$ref":"#/components/schemas/SloMetricSourceWrapper","description":"The numerator representing bad events. Either good or bad must be provided when using total."},"total":{"$ref":"#/components/schemas/SloMetricSourceWrapper","description":"The denominator representing total events. Used with either good or bad."},"raw":{"$ref":"#/components/schemas/SloMetricSourceWrapper","description":"A precomputed ratio stored as a metric. Cannot be used together with good/bad/total."},"rawType":{"$ref":"#/components/schemas/SloRawType"}}},"SloRawType":{"description":"Required with raw. Indicates how the stored ratio was calculated:\n- `success`: good/total\n- `failure`: bad/total\n","type":"string","enum":["success","failure"]},"SloSpec":{"properties":{"description":{"description":"Optional description of the SLO, up to 1050 characters.","type":"string","maxLength":1050},"service":{"description":"The service this SLO is associated with. A `/` separates the service namespace from the service name, so `payments/eu` resolves to namespace `payments` and name `eu`, and a value without a slash is just the service name. If a service name itself contains a `/`, prefix the value with a leading `/` to treat the rest as a literal name with no namespace; for example `/payments/eu` resolves to the name `payments/eu`. If nothing matches, the SLO is simply not linked to a service.","type":"string"},"indicator":{"$ref":"#/components/schemas/SloIndicator","description":"Inline Service Level Indicator (SLI). An inline indicator is required (indicatorRef is not currently supported)."},"indicatorRef":{"description":"Name of an external SLI. Not currently supported — provide an inline indicator instead. Requests that set indicatorRef are rejected with a 400.","type":"string"},"timeWindow":{"description":"Optional. A single rolling time window with a `4w` (28d) duration. Only rolling `4w`/`28d` windows are currently supported; calendar-aligned windows and other durations are rejected with a 400. When omitted, a rolling 28d window is used. Note the evaluation window is currently fixed at 28d regardless of the value provided.","type":"array","items":{"$ref":"#/components/schemas/SloTimeWindow"},"minItems":1,"maxItems":1},"budgetingMethod":{"$ref":"#/components/schemas/SloBudgetingMethod","description":"Only `Occurrences` is currently supported. `Timeslices` and `RatioTimeslices` are not currently supported and requests using them are rejected with a 400."},"objectives":{"description":"Thresholds for the SLO. Exactly one objective is supported; multiple or composite objectives are not currently supported and requests declaring more than one objective are rejected with a 400.","type":"array","items":{"$ref":"#/components/schemas/SloObjective"},"minItems":1},"alertPolicies":{"description":"Alert policies for this SLO, following the OpenSLO v1 specification.\nNot supported by Dash0. This field is accepted for OpenSLO compatibility, but any alert policies are ignored: they are not stored, not evaluated, and not returned when reading the SLO back.","type":"array","items":{"$ref":"#/components/schemas/SloAlertPolicy"}}},"required":["budgetingMethod","objectives"]},"SloThresholdMetric":{"description":"Threshold-based SLI metric. Raw data from the metric source is compared against objective thresholds (op and value on the objective, not here). Not currently supported — use a ratioMetric instead.","properties":{"metricSource":{"$ref":"#/components/schemas/SloMetricSource"}},"required":["metricSource"]},"SloTimeWindow":{"description":"A time window for the SLO. Only a rolling `4w`/`28d` window is currently supported.","properties":{"duration":{"$ref":"#/components/schemas/Duration","description":"Duration of the window. Only '4w' or '28d' is currently supported; other durations are rejected with a 400."},"isRolling":{"description":"Whether this is a rolling time window. Must be true — only rolling windows are currently supported.","type":"boolean"},"calendar":{"$ref":"#/components/schemas/SloCalendarWindow","description":"Calendar alignment details. Calendar-aligned windows are not currently supported and are rejected with a 400."}},"required":["duration"]},"SourceMapIntegration":{"properties":{"kind":{"type":"string","enum":["source_map"]},"spec":{"$ref":"#/components/schemas/SourceMapIntegrationSpec"}},"required":["kind","spec"]},"SourceMapIntegrationSecrets":{"properties":{"password":{"description":"Basic auth password","type":"string"},"bearerToken":{"description":"Bearer token for authorization","type":"string"},"headers":{"description":"Secret header values keyed by header name","type":"object","additionalProperties":{"type":"string"}}}},"SourceMapIntegrationSpec":{"properties":{"urlPrefixes":{"description":"URL prefixes for source map matching","type":"array","items":{"type":"string"}},"username":{"description":"Basic auth username","type":"string"},"headers":{"description":"Custom HTTP headers to include in requests","type":"object","additionalProperties":{"type":"string"}},"secrets":{"$ref":"#/components/schemas/SourceMapIntegrationSecrets","description":"Note, this field will be stripped out before the config is exposed via the API"},"secretsRef":{"$ref":"#/components/schemas/SecretRef"}},"required":["urlPrefixes"]},"SpamFilterAnnotations":{"description":"Spam filters use hard delete (removed from the dataset settings array),\nso there is no `dash0.com/deleted-at` annotation. Timestamps\n(`created-at`, `updated-at`) are not tracked because filters are stored\nas elements of a JSONB array inside the dataset settings, which has no\nper-element timestamp support.\n","properties":{"dash0.com/enabled":{"description":"Whether this spam filter is active. Defaults to `\"true\"`.\nWhen set to `\"false\"`, the filter is skipped.\n","type":"string","enum":["true","false"]}}},"SpamFilterApiVersion":{"description":"API version of the spam filter CRD.\n- `v1alpha1`: spec uses `contexts` (array, single element).\n- `v1alpha2`: spec uses `context` (scalar).\n","type":"string","enum":["v1alpha1","v1alpha2"]},"SpamFilterApiVersionV1Alpha1":{"type":"string","enum":["v1alpha1"]},"SpamFilterApiVersionV1Alpha2":{"type":"string","enum":["v1alpha2"]},"SpamFilterCreateRequest":{"anyOf":[{"$ref":"#/components/schemas/SpamFilterDefinition"},{"$ref":"#/components/schemas/SpamFilterDefinitionV1Alpha2"}]},"SpamFilterDefinition":{"description":"v1alpha1 spam filter definition. Uses `contexts` (array) in the spec.\n","properties":{"apiVersion":{"$ref":"#/components/schemas/SpamFilterApiVersionV1Alpha1"},"kind":{"type":"string","enum":["Dash0SpamFilter"]},"metadata":{"$ref":"#/components/schemas/SpamFilterMetadata"},"spec":{"$ref":"#/components/schemas/SpamFilterSpec"}},"required":["kind","metadata","spec"]},"SpamFilterDefinitionV1Alpha2":{"description":"v1alpha2 spam filter definition. Uses `context` (scalar) in the spec.\n","properties":{"apiVersion":{"$ref":"#/components/schemas/SpamFilterApiVersionV1Alpha2"},"kind":{"type":"string","enum":["Dash0SpamFilter"]},"metadata":{"$ref":"#/components/schemas/SpamFilterMetadata"},"spec":{"$ref":"#/components/schemas/SpamFilterSpecV1Alpha2"}},"required":["apiVersion","kind","metadata","spec"]},"SpamFilterLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/origin":{"description":"External identifier for this spam filter. Must be unique per\norganization and dataset when set. Used by Infrastructure-as-Code\ntools (Terraform, Kubernetes operator). Auto-generated as\n`api-<uuid>` on POST if not provided.\n","type":"string"},"dash0.com/dataset":{"type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"},"custom":{"type":"object","additionalProperties":{"type":"string"}}}},"SpamFilterMetadata":{"properties":{"name":{"description":"Human-readable name for the spam filter.\n","type":"string"},"labels":{"$ref":"#/components/schemas/SpamFilterLabels"},"annotations":{"$ref":"#/components/schemas/SpamFilterAnnotations"}},"required":["name"]},"SpamFilterResponse":{"anyOf":[{"$ref":"#/components/schemas/SpamFilterDefinition"},{"$ref":"#/components/schemas/SpamFilterDefinitionV1Alpha2"}]},"SpamFilterSpec":{"description":"v1alpha1 spam filter specification. The `filter` field defines structured\ncriteria that the server compiles into an OTTL condition for evaluation.\n","properties":{"contexts":{"description":"The signal types this spam filter applies to.\n","type":"array","items":{"$ref":"#/components/schemas/TelemetryFilterContext"},"maxItems":1},"filter":{"$ref":"#/components/schemas/FilterCriteria","description":"Structured filter criteria. The server compiles this into an OTTL condition\nfor evaluation.\n"}},"required":["contexts","filter"]},"SpamFilterSpecV1Alpha2":{"description":"v1alpha2 spam filter specification. The `filter` field defines structured\ncriteria that the server compiles into an OTTL condition for evaluation.\n","properties":{"context":{"$ref":"#/components/schemas/TelemetryFilterContext","description":"The signal type this spam filter applies to.\n"},"filter":{"$ref":"#/components/schemas/FilterCriteria","description":"Structured filter criteria. The server compiles this into an OTTL condition\nfor evaluation.\n"}},"required":["context","filter"]},"Span":{"type":"object","properties":{"traceId":{"type":"string","format":"byte"},"spanId":{"type":"string","format":"byte"},"traceState":{"type":"string"},"parentSpanId":{"type":"string","format":"byte"},"hasChildren":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"boolean"},"flags":{"type":"integer","format":"int64"},"name":{"type":"string"},"dash0Name":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"string"},"dash0TraceOriginType":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"string"},"dash0TraceOriginParentSpanId":{"description":"The property is only included when `includeOTLPSchemaExtensions` is `true`.","type":"string","format":"byte"},"dash0ForwardLinks":{"description":"Forward links pointing to spans in other traces.\nThe property is only included when `includeOTLPSchemaExtensions` is `true`.\n","type":"array","items":{"$ref":"#/components/schemas/SpanLink"}},"kind":{"$ref":"#/components/schemas/SpanKind"},"startTimeUnixNano":{"type":"string","format":"uint64"},"endTimeUnixNano":{"type":"string","format":"uint64"},"attributes":{"type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"droppedAttributesCount":{"type":"integer","format":"int64"},"events":{"type":"array","items":{"$ref":"#/components/schemas/SpanEvent"}},"droppedEventsCount":{"type":"integer","format":"int64"},"links":{"type":"array","items":{"$ref":"#/components/schemas/SpanLink"}},"droppedLinksCount":{"type":"integer","format":"int64"},"status":{"$ref":"#/components/schemas/SpanStatus"}},"required":["traceId","spanId","name","attributes","events","links","status","startTimeUnixNano","endTimeUnixNano","kind"]},"SpanEvent":{"type":"object","properties":{"timeUnixNano":{"type":"string","format":"uint64"},"name":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"droppedAttributesCount":{"type":"integer","format":"int64"}},"required":["timeUnixNano","name","attributes"]},"SpanExportFormat":{"description":"The serialization format of the exported file.\n- `txt`: One rendered span line per record, carrying a fixed field set of start\n  timestamp, service, span name, duration, kind, status code, trace ID and span ID.\n  Ignores `columns`.\n- `ndjson`: One OTLP JSON payload per line, each carrying a single span inside the\n  same `resourceSpans` envelope `GetSpans` returns, so each line is independently\n  parseable by any OTLP JSON consumer.\n- `yaml`: The same per-span OTLP payloads as `ndjson`, as a multi-document YAML\n  stream with documents separated by `---`.\n- `csv`: A header row plus one row per span, flattened to the requested `columns`.\n","type":"string","enum":["txt","ndjson","yaml","csv"]},"SpanKind":{"description":"// Unspecified. Do NOT use as default.\n// Implementations MAY assume SpanKind to be INTERNAL when receiving UNSPECIFIED.\nSPAN_KIND_UNSPECIFIED = 0;\n\n// Indicates that the span represents an internal operation within an application,\n// as opposed to an operation happening at the boundaries. Default value.\nSPAN_KIND_INTERNAL = 1;\n\n// Indicates that the span covers server-side handling of an RPC or other\n// remote network request.\nSPAN_KIND_SERVER = 2;\n\n// Indicates that the span describes a request to some remote service.\nSPAN_KIND_CLIENT = 3;\n\n// Indicates that the span describes a producer sending a message to a broker.\n// Unlike CLIENT and SERVER, there is often no direct critical path latency relationship\n// between producer and consumer spans. A PRODUCER span ends when the message was accepted\n// by the broker while the logical processing of the message might span a much longer time.\nSPAN_KIND_PRODUCER = 4;\n\n// Indicates that the span describes consumer receiving a message from a broker.\n// Like the PRODUCER kind, there is often no direct critical path latency relationship\n// between producer and consumer spans.\nSPAN_KIND_CONSUMER = 5;\n","type":"integer","format":"int32","default":0},"SpanLink":{"type":"object","properties":{"traceId":{"type":"string","format":"byte"},"spanId":{"type":"string","format":"byte"},"traceState":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"droppedAttributesCount":{"type":"integer","format":"int64"},"flags":{"type":"integer","format":"int64"}},"required":["traceId","spanId","attributes"]},"SpanStatus":{"type":"object","properties":{"message":{"description":"A developer-facing human readable error message.","type":"string"},"code":{"$ref":"#/components/schemas/SpanStatusCode"}},"required":["code"]},"SpanStatusCode":{"description":"// The default status.\nSTATUS_CODE_UNSET               = 0;\n// The Span has been validated by an Application developer or Operator to\n// have completed successfully.\nSTATUS_CODE_OK                  = 1;\n// The Span contains an error.\nSTATUS_CODE_ERROR               = 2;\n","type":"integer","format":"int32","default":0},"SpansDownloadRequest":{"description":"Request for the `SpansDownload` API. Accepts the same query as `GetSpans`\n(`filter`, `timeRange`, `dataset`, `ordering`) and returns the matching spans\nserialized as a downloadable file rather than as a JSON page.\n\nThe response is streamed, so the export is not paginated: a single request returns up\nto `limit` spans, capped at 5000. Adaptive sampling is always disabled for exports,\nso an exported file is never a sample. Unlike `GetSpans` this request therefore takes\nno `sampling`, and one sent anyway is ignored: the sampling path can substitute a\nduration-percentile filter and quietly change which spans the file contains, so\nexports never take it.\n","properties":{"filter":{"$ref":"#/components/schemas/FilterCriteria"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"ordering":{"$ref":"#/components/schemas/OrderingCriteria","description":"The ordering criteria for the exported spans. Spans are written to the file in\nthis order.\nSupported ordering key: `otel.span.start_time` (span start timestamp, defaults to\ndescending), optionally followed by `otel.trace.id` then `otel.span.id` ascending,\nwhich is the tiebreak span retrieval appends to keep its cursor stable.\n"},"format":{"$ref":"#/components/schemas/SpanExportFormat"},"limit":{"description":"The maximum number of spans to export. Defaults to, and is capped at, 5000.\nA larger value is rejected rather than silently clamped. Use the Dash0 CLI\n(`dash0 spans query`) to export volumes beyond this cap.\n","type":"integer","format":"int64","default":5000,"minimum":1,"maximum":5000},"columns":{"description":"Attribute keys to emit as columns, in order, for the `csv` format — resource,\nscope, or span attributes (e.g. `service.name`, `otel.span.duration`). Ignored by\nthe other formats, which have a fixed field set.\n","type":"array","items":{"type":"string"}}},"required":["timeRange","format"]},"SslCertificateAssertion":{"properties":{"kind":{"type":"string","enum":["ssl_certificate"]},"spec":{"$ref":"#/components/schemas/SslCertificateAssertionSpec"}},"required":["kind","spec"]},"SslCertificateAssertionSpec":{"properties":{"value":{"$ref":"#/components/schemas/Duration"}},"required":["value"]},"StringAssertionOperator":{"type":"string","enum":["is","is_not","is_set","is_not_set","is_one_of","is_not_one_of","matches","does_not_match","contains","does_not_contain","starts_with","does_not_start_with","ends_with","does_not_end_with"]},"SyntheticCheckAction":{"type":"string","enum":["synthetic_check:read","synthetic_check:write","synthetic_check:delete"]},"SyntheticCheckAnnotations":{"properties":{"dash0.com/deleted-at":{"type":"string","format":"date-time"},"dash0.com/folder-path":{"description":"Optional UI folder path for organising groups (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"dash0.com/sharing":{"description":"Comma-separated list of principals to grant read access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Sharing is honored only on assets that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API). Setting it on an asset that declares no dash0.com/origin is rejected with a 400 — manage that asset's access via the UI share dialog instead.","type":"string"}}},"SyntheticCheckAttempt":{"properties":{"syntheticCheckId":{"description":"ID of the synthetic check","type":"string"},"syntheticCheckVersion":{"description":"Version of the synthetic check","type":"string"},"runId":{"description":"(Internal) Run ID this attempt belongs to","type":"string","x-internal":true},"location":{"$ref":"#/components/schemas/SyntheticCheckLocation","description":"The geographic location from which the check was executed."},"attemptId":{"description":"(Internal) Unique identifier for the attempt","type":"string","x-internal":true},"isTestRun":{"description":"(Internal) Whether this attempt was triggered as a test run","type":"boolean","x-internal":true},"traceId":{"description":"(Internal) Trace ID associated with this attempt","type":"string","format":"byte","x-internal":true},"spanId":{"description":"(Internal) Span ID associated with this attempt","type":"string","format":"byte","x-internal":true},"startTime":{"$ref":"#/components/schemas/FixedTime"},"duration":{"description":"duration in nanoseconds","type":"integer","format":"int64"},"statusCode":{"description":"HTTP status code","type":"integer"},"errorType":{"$ref":"#/components/schemas/SyntheticHttpErrorType","description":"Error type of the synthetic check attempt, if any"},"errorMessage":{"description":"Error message of the synthetic check attempt, if any","type":"string"},"failedCriticalAssertions":{"description":"List of critical assertions that failed","type":"array","items":{"$ref":"#/components/schemas/FailedHttpCheckAssertion"}},"failedDegradedAssertions":{"description":"List of degraded assertions that failed","type":"array","items":{"$ref":"#/components/schemas/FailedHttpCheckAssertion"}},"passedCriticalAssertions":{"description":"List of critical assertions that passed","type":"array","items":{"$ref":"#/components/schemas/HttpCheckAssertion"}},"passedDegradedAssertions":{"description":"List of degraded assertions that passed","type":"array","items":{"$ref":"#/components/schemas/HttpCheckAssertion"}}},"required":["syntheticCheckId","syntheticCheckVersion","runId","attemptId","isTestRun","location","traceId","spanId","startTime","duration","statusCode","failedCriticalAssertions","failedDegradedAssertions","passedCriticalAssertions","passedDegradedAssertions"]},"SyntheticCheckAttemptDetails":{"allOf":[{"$ref":"#/components/schemas/SyntheticCheckAttempt"},{"type":"object","properties":{"spanAttributes":{"description":"Span attributes using OTLP KeyValue format","type":"array","items":{"$ref":"#/components/schemas/KeyValue"}},"events":{"description":"Span events using OTLP SpanEvent format","type":"array","items":{"$ref":"#/components/schemas/SpanEvent"}}},"required":["spanAttributes","events"]}]},"SyntheticCheckDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0SyntheticCheck"]},"metadata":{"$ref":"#/components/schemas/SyntheticCheckMetadata"},"spec":{"$ref":"#/components/schemas/SyntheticCheckSpec"}},"required":["kind","metadata","spec"]},"SyntheticCheckDisplay":{"properties":{"name":{"description":"Short-form name for the view to be shown prominently within the view list and atop\nthe screen when the view is selected.\n","type":"string"}},"required":["name"]},"SyntheticCheckLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/origin":{"type":"string"},"dash0.com/version":{"type":"string"},"dash0.com/dataset":{"type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"},"custom":{"type":"object","additionalProperties":{"type":"string"},"deprecated":true}}},"SyntheticCheckLocation":{"description":"A geographic location identifier from which synthetic checks can be executed.","type":"string","minLength":1,"maxLength":128},"SyntheticCheckLocationEntry":{"type":"object","properties":{"id":{"description":"The value a synthetic check definition stores to target this location: the region\nidentifier for a public region, and the Dash0-assigned opaque id for a private\nlocation.\n","type":"string","example":"synthetic_location_01k3z8v9c7f2mb8xq5r0d4n6ty"},"kind":{"$ref":"#/components/schemas/SyntheticCheckLocationKind"},"locationId":{"description":"Private locations only. The label to show for the location. It is not unique, because\ntwo of an organization's locations may carry the same value after a re-registration,\nso display it alongside `id` when it repeats.\n","allOf":[{"$ref":"#/components/schemas/SyntheticPrivateLocationLocationId"}]},"createdAt":{"description":"Private locations only. When Dash0 first registered the location.","type":"string","format":"date-time"},"health":{"description":"Private locations only. Public regions are operated by Dash0 and report no per-location\nhealth here.\n","allOf":[{"$ref":"#/components/schemas/SyntheticPrivateLocationHealth"}]}},"required":["id","kind"]},"SyntheticCheckLocationKind":{"description":"- `public`: A Dash0-operated region, available to every organization.\n- `private`: A location the organization runs itself, visible only to that organization.\n","type":"string","enum":["public","private"]},"SyntheticCheckMetadata":{"properties":{"name":{"type":"string"},"description":{"type":"string"},"labels":{"$ref":"#/components/schemas/SyntheticCheckLabels"},"annotations":{"$ref":"#/components/schemas/SyntheticCheckAnnotations"}},"required":["name"]},"SyntheticCheckNotifications":{"properties":{"channels":{"description":"The channel IDs that notifications should be sent to in case the check is critical or degraded after\nexecuting all the retries.\n","type":"array","items":{"type":"string","format":"uuid"}},"onlyCriticalChannels":{"description":"The channel IDs that should only trigger in case synthetic check status reaches critical state.\n","type":"array","items":{"type":"string","format":"uuid"}}},"required":["channels"]},"SyntheticCheckPermission":{"properties":{"teamId":{"type":"string"},"userId":{"type":"string"},"role":{"type":"string"},"actions":{"type":"array","items":{"$ref":"#/components/schemas/SyntheticCheckAction"}}},"required":["actions"]},"SyntheticCheckPlugin":{"anyOf":[{"$ref":"#/components/schemas/SyntheticHttpCheckPlugin"}]},"SyntheticCheckRetries":{"anyOf":[{"$ref":"#/components/schemas/SyntheticCheckRetriesOff"},{"$ref":"#/components/schemas/SyntheticCheckRetriesFixed"},{"$ref":"#/components/schemas/SyntheticCheckRetriesLinear"},{"$ref":"#/components/schemas/SyntheticCheckRetriesExponential"}]},"SyntheticCheckRetriesExponential":{"properties":{"kind":{"type":"string","enum":["exponential"]},"spec":{"$ref":"#/components/schemas/SyntheticCheckRetriesExponentialSpec"}},"required":["kind","spec"]},"SyntheticCheckRetriesExponentialSpec":{"properties":{"attempts":{"type":"integer","minimum":0,"maximum":10},"delay":{"$ref":"#/components/schemas/Duration"},"maximumDelay":{"$ref":"#/components/schemas/Duration"}},"required":["attempts","delay","maximumDelay"]},"SyntheticCheckRetriesFixed":{"properties":{"kind":{"type":"string","enum":["fixed"]},"spec":{"$ref":"#/components/schemas/SyntheticCheckRetriesFixedSpec"}},"required":["kind","spec"]},"SyntheticCheckRetriesFixedSpec":{"properties":{"attempts":{"type":"integer","minimum":0,"maximum":10},"delay":{"$ref":"#/components/schemas/Duration"}},"required":["attempts","delay"]},"SyntheticCheckRetriesLinear":{"properties":{"kind":{"type":"string","enum":["linear"]},"spec":{"$ref":"#/components/schemas/SyntheticCheckRetriesLinearSpec"}},"required":["kind","spec"]},"SyntheticCheckRetriesLinearSpec":{"properties":{"attempts":{"type":"integer","minimum":0,"maximum":10},"delay":{"$ref":"#/components/schemas/Duration"},"maximumDelay":{"$ref":"#/components/schemas/Duration"}},"required":["attempts","delay","maximumDelay"]},"SyntheticCheckRetriesOff":{"properties":{"kind":{"type":"string","enum":["off"]},"spec":{"$ref":"#/components/schemas/SyntheticCheckRetriesOffSpec"}},"required":["kind","spec"]},"SyntheticCheckRetriesOffSpec":{"properties":{}},"SyntheticCheckSchedule":{"properties":{"strategy":{"$ref":"#/components/schemas/SyntheticCheckSchedulingStrategy"},"interval":{"$ref":"#/components/schemas/Duration","description":"Specifies a check evaluation frequency.\n"},"locations":{"type":"array","items":{"$ref":"#/components/schemas/SyntheticCheckLocation"},"minItems":1,"maxItems":128}},"required":["strategy","interval","locations"]},"SyntheticCheckSchedulingStrategy":{"description":"Whether to run checks against all specified locations for every run, or just a single location per run.\n","type":"string","enum":["all_locations","random_location"]},"SyntheticCheckSpec":{"properties":{"display":{"$ref":"#/components/schemas/SyntheticCheckDisplay"},"plugin":{"$ref":"#/components/schemas/SyntheticCheckPlugin"},"schedule":{"$ref":"#/components/schemas/SyntheticCheckSchedule"},"retries":{"$ref":"#/components/schemas/SyntheticCheckRetries"},"notifications":{"$ref":"#/components/schemas/SyntheticCheckNotifications"},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/SyntheticCheckPermission"}},"labels":{"type":"object","additionalProperties":{"type":"string"}},"enabled":{"type":"boolean"}},"required":["plugin","schedule","retries","notifications","enabled"]},"SyntheticChecksApiListItem":{"properties":{"id":{"type":"string"},"origin":{"type":"string"},"source":{"$ref":"#/components/schemas/CrdSource"},"dataset":{"type":"string"},"name":{"type":"string"}},"required":["id","dataset"]},"SyntheticHttpCheckAssertions":{"properties":{"criticalAssertions":{"$ref":"#/components/schemas/HttpCheckAssertions"},"degradedAssertions":{"$ref":"#/components/schemas/HttpCheckAssertions"}},"required":["criticalAssertions","degradedAssertions"]},"SyntheticHttpCheckPlugin":{"properties":{"kind":{"type":"string","enum":["http"]},"spec":{"$ref":"#/components/schemas/SyntheticHttpCheckPluginSpec"}},"required":["kind","spec"]},"SyntheticHttpCheckPluginSpec":{"properties":{"request":{"$ref":"#/components/schemas/HttpRequestSpec"},"assertions":{"$ref":"#/components/schemas/SyntheticHttpCheckAssertions"}},"required":["request","assertions"]},"SyntheticHttpErrorType":{"type":"string","enum":["unknown","dns","tcp","tls","timeout"]},"SyntheticPrivateLocationHealth":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/SyntheticPrivateLocationHealthStatus"},"lastSeenAt":{"description":"When one of the location's workers was last seen. Absent when no worker has ever\nconnected, and absent while `status` is `unknown`.\n","type":"string","format":"date-time"}},"required":["status"]},"SyntheticPrivateLocationHealthStatus":{"description":"- `online`: At least one of the location's workers is connected and within the liveness window.\n- `offline`: No worker is connected, so the location executes no checks.\n- `unknown`: Dash0 cannot currently determine the location's connection state. This is not a\n  claim that the location is down, and it must not be presented as one.\n","type":"string","enum":["online","offline","unknown"]},"SyntheticPrivateLocationLocationId":{"description":"Customer-chosen identifier for the location, unique within the owning organization only.\nTwo organizations may both use the same value for unrelated locations, and a deleted\nlocation and its re-registered successor may share it too, so it never identifies a\nlocation on its own.\n","type":"string","minLength":1,"maxLength":200,"example":"dc-fra-1"},"TeamAnnotations":{"description":"Key/value annotations on the team. Arbitrary keys are accepted on\nwrite (the request is not rejected), but the server only interprets\nand persists the reserved `dash0.com/*` keys documented below. Any\nother key supplied by the client is silently dropped and will not\nappear on the response or on subsequent reads.\n","type":"object","properties":{"dash0.com/created-at":{"description":"Timestamp when the team was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update to the team. Set by the server; read-only.","type":"string","format":"date-time"}},"additionalProperties":{"type":"string"}},"TeamApiVersion":{"description":"API version of the team CRD. Currently only `dash0.com/v1alpha1` is\nsupported.\n","type":"string","enum":["dash0.com/v1alpha1"]},"TeamDefinitionV1Alpha1":{"description":"v1alpha1 team definition. `metadata.name` is the team's technical name\n(used e.g. as the CRD name in an operator manifest or a Terraform\nresource ID), `spec.display` carries the human-facing attributes\n(name, description, color) and `spec.members` is the declarative list\nof member IDs that make up the team. `metadata.name` and\n`spec.display.name` are persisted independently.\n","properties":{"apiVersion":{"$ref":"#/components/schemas/TeamApiVersion","description":"Optional on write requests for backwards compatibility: defaults to\n`dash0.com/v1alpha1` when omitted. Always populated on read responses.\n"},"kind":{"type":"string","enum":["Dash0Team"]},"metadata":{"$ref":"#/components/schemas/TeamMetadata"},"spec":{"$ref":"#/components/schemas/TeamSpec"}},"required":["kind","metadata","spec"]},"TeamDisplay":{"properties":{"name":{"description":"Human-facing name of the team, used in the UI.","type":"string"},"description":{"type":"string"},"color":{"$ref":"#/components/schemas/Gradient"}},"required":["name","color"]},"TeamLabels":{"description":"Key/value labels on the team. Arbitrary keys are accepted on write\n(the request is not rejected), but the server only interprets and\npersists the reserved `dash0.com/*` keys documented below. Any\nother key supplied by the client is silently dropped and will not\nappear on the response or on subsequent reads.\n","type":"object","properties":{"dash0.com/id":{"description":"Unique internal ID of the team. Server-set on creation and\nstable for the lifetime of the team; ignored if supplied on\nPOST and PUT request bodies.\n","type":"string"},"dash0.com/origin":{"description":"External identifier for API-managed teams (e.g. the CRD name\nfrom an operator manifest or a Terraform resource ID).\nClient-settable on create only — a team's origin cannot be\nchanged once it exists. Empty for teams created via the UI;\nnon-empty for teams created via the internal API or reconciled\nby an operator. Uniquely identifies a team within its\norganization when present.\n","type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource","description":"Origin source derived by the server from the request context.\nRead-only.\n"}},"additionalProperties":{"type":"string"}},"TeamMetadata":{"properties":{"name":{"description":"Technical name of the team (e.g. `platform-team`). Distinct from\n`spec.display.name`, which carries the human-facing name. Persisted\nverbatim and echoed on read responses.\n","type":"string"},"labels":{"$ref":"#/components/schemas/TeamLabels"},"annotations":{"$ref":"#/components/schemas/TeamAnnotations"}},"required":["name"]},"TeamSpec":{"properties":{"display":{"$ref":"#/components/schemas/TeamDisplay"},"members":{"description":"The declarative membership of the team. Each entry is either a\nmember's internal ID (the `dash0.com/id` label value returned\nfor the member, e.g. `user_01ABC...`) or an email address.\nEmails are matched case-insensitively against the\norganization's members and translated to internal IDs during\nreconciliation, so callers can author teams with\nhuman-readable references. An empty array clears the team's\nmembership; a `null`/missing value is rejected with 400.\nUnresolvable email addresses cause the entire request to fail\nwith 400 listing every offender. Responses always echo the\nresolved internal IDs.\n","type":"array","items":{"type":"string"}}},"required":["display","members"]},"TeamsListItem":{"properties":{"id":{"type":"string"},"origin":{"type":"string"},"source":{"$ref":"#/components/schemas/CrdSource"},"name":{"type":"string"},"color":{"$ref":"#/components/schemas/Gradient"},"members":{"description":"A sample of five members. You can inspect the total member count via `totalMemberCount`. This array\nis restricted to at most five members, because this could otherwise be too much data.\n","type":"array","items":{"$ref":"#/components/schemas/MemberDefinition"},"maxItems":5},"totalMemberCount":{"type":"integer"}},"required":["id","name","color","members","totalMemberCount"]},"TeamsWebhookConfig":{"properties":{"url":{"type":"string","format":"url"}},"required":["url"]},"TelemetryFilter":{"properties":{"apiVersion":{"$ref":"#/components/schemas/SpamFilterApiVersion","description":"The CRD API version used when this filter was created or last updated.\nDetermines which spec shape the server returns on read.\nDefaults to `v1alpha1` when absent.\n"},"id":{"description":"Unique identifier for this spam filter. Server-generated on creation.\nFor existing filters without an ID, a deterministic UUID is derived\nfrom a hash of the filter specification or of the condition.\n","type":"string","format":"uuid"},"origin":{"description":"Immutable external identifier for this spam filter, used by\nInfrastructure-as-Code tools (Terraform, Kubernetes operator).\nWhen set, the filter is read-only in the UI.\n","type":"string"},"source":{"$ref":"#/components/schemas/CrdSource"},"enabled":{"description":"Whether this telemetry filter is active. When absent or true, the filter\nis applied. When explicitly set to false, the filter is skipped.\n","type":"boolean"},"name":{"description":"An optional human-readable name for this telemetry filter.","type":"string"},"context":{"$ref":"#/components/schemas/TelemetryFilterContext","description":"The signal type this telemetry filter applies to.\n"},"filter":{"$ref":"#/components/schemas/FilterCriteria","description":"Structured filter criteria in human-readable form. When provided, the\nserver compiles this into an OTTL condition. Mutually exclusive with\n`condition`.\n"},"condition":{"$ref":"#/components/schemas/OTTLCondition","description":"Raw OTTL condition expression. Mutually exclusive with `filter`. Use this\nfor advanced filtering that cannot be expressed via structured\n`FilterCriteria`. If the condition resolves to true, the data will be\ndropped. Supports `and`, `or`, and `()`.\n"}},"required":["context","condition"]},"TelemetryFilterContext":{"type":"string","enum":["datapoint","span","log","web_event"]},"TelemetryTransformationRuleAnnotations":{"properties":{"dash0.com/created-at":{"description":"Timestamp when the rule was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/deleted-at":{"description":"Soft-delete timestamp. Present when the rule has been deleted but not yet purged. Set by the server; read-only.","type":"string","format":"date-time"}}},"TelemetryTransformationRuleContext":{"description":"The OTTL evaluation context that determines which telemetry fields are accessible to the statements.\nNot all contexts are valid for all signal types:\n\nFor `traces`:\n- `resource`: Transform resource-level attributes.\n- `scope`: Transform instrumentation scope-level attributes.\n- `span`: Transform individual span properties and attributes.\n- `spanevent`: Transform individual span event properties and attributes.\n\nFor `metrics`:\n- `resource`: Transform resource-level attributes.\n- `scope`: Transform instrumentation scope-level attributes.\n- `metric`: Transform metric-level properties (name, description, type).\n- `datapoint`: Transform individual metric data point attributes.\n\nFor `logs`:\n- `resource`: Transform resource-level attributes.\n- `scope`: Transform instrumentation scope-level attributes.\n- `log`: Transform individual log record properties (body, severity, attributes).\n\nFor `profiles`:\n- `resource`: Transform resource-level attributes.\n- `scope`: Transform instrumentation scope-level attributes.\n- `profile`: Transform individual profile properties and attributes.\n\nContexts never supply access to items lower in the protobuf hierarchy, but always supply access to\nitems higher in the hierarchy. For example, a `datapoint` context can access its metric, scope, and\nresource, but a `metric` context cannot access individual data points.\n","type":"string","enum":["resource","scope","span","spanevent","metric","datapoint","log","profile"]},"TelemetryTransformationRuleDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0TelemetryTransformationRule"]},"metadata":{"$ref":"#/components/schemas/TelemetryTransformationRuleMetadata"},"spec":{"$ref":"#/components/schemas/TelemetryTransformationRuleSpec"}},"required":["kind","metadata","spec"]},"TelemetryTransformationRuleDisplay":{"properties":{"name":{"description":"Short-form name for the view to be shown prominently within the view list and atop\nthe screen when the view is selected.\n","type":"string"}},"required":["name"]},"TelemetryTransformationRuleLabels":{"properties":{"dash0.com/id":{"description":"Unique internal ID of the telemetry transformation rule. Set by the server on creation; do not set manually.","type":"string"},"dash0.com/origin":{"description":"External identifier for API-managed resources (e.g. the CRD name from an operator or Terraform resource ID). Empty for user-created rules; non-empty for rules created via the internal API.","type":"string"},"dash0.com/version":{"description":"Current version of the rule. Needs to be set when updating a rule to prevent conflicting writes.","type":"string"},"dash0.com/dataset":{"description":"Dataset this rule belongs to. Defaults to the default dataset when absent.","type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}}},"TelemetryTransformationRuleMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/TelemetryTransformationRuleLabels"},"annotations":{"$ref":"#/components/schemas/TelemetryTransformationRuleAnnotations"}},"required":["name"]},"TelemetryTransformationRuleSignalType":{"description":"The signal type that this transformation rule applies to.\n- `traces`: Apply transformations to trace data (spans and span events).\n- `metrics`: Apply transformations to metric data (metrics and data points).\n- `logs`: Apply transformations to log data (log records).\n- `profiles`: Apply transformations to profile data.\n","type":"string","enum":["traces","metrics","logs","profiles"]},"TelemetryTransformationRuleSpec":{"properties":{"enabled":{"type":"boolean"},"display":{"$ref":"#/components/schemas/TelemetryTransformationRuleDisplay"},"signal":{"$ref":"#/components/schemas/TelemetryTransformationRuleSignalType"},"context":{"$ref":"#/components/schemas/TelemetryTransformationRuleContext"},"conditions":{"$ref":"#/components/schemas/OTTLConditions","description":"A list of OTTL conditions that act as a global gate for the statements. The conditions are ORed together,\nmeaning only one condition needs to evaluate to true for the statements to be executed.\n"},"statements":{"$ref":"#/components/schemas/OTTLStatements"}},"required":["enabled","signal","context","statements"]},"TestSyntheticCheckRequest":{"properties":{"dataset":{"$ref":"#/components/schemas/Dataset"},"definition":{"$ref":"#/components/schemas/SyntheticCheckDefinition"}},"required":["definition"]},"TestSyntheticCheckResponse":{"properties":{"syntheticCheckAttempt":{"$ref":"#/components/schemas/SyntheticCheckAttemptDetails"}},"required":["syntheticCheckAttempt"]},"TimeRange":{"properties":{"from":{"$ref":"#/components/schemas/FixedTime"},"to":{"$ref":"#/components/schemas/FixedTime"}},"required":["from","to"]},"TimeReference":{"oneOf":[{"$ref":"#/components/schemas/FixedTime"},{"$ref":"#/components/schemas/FixedTimeUnix"},{"$ref":"#/components/schemas/RelativeTime"}],"x-go-type":"any"},"TimeReferenceRange":{"description":"A range of time between two time references.\n","properties":{"from":{"$ref":"#/components/schemas/TimeReference"},"to":{"$ref":"#/components/schemas/TimeReference"}},"required":["from","to"],"example":{"from":"now-30m","to":"now"}},"TimeSeriesAggregationAnnotations":{"properties":{"dash0.com/created-at":{"description":"Timestamp when the aggregation was created. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/updated-at":{"description":"Timestamp of the last update. Set by the server; read-only.","type":"string","format":"date-time"},"dash0.com/deleted-at":{"description":"Timestamp when the aggregation was soft-deleted. Set by the server; read-only. Absent unless the aggregation is deleted.","type":"string","format":"date-time"}}},"TimeSeriesAggregationAttributeModification":{"properties":{"kind":{"type":"string","enum":["drop_attributes","keep_attributes"]},"spec":{"$ref":"#/components/schemas/TimeSeriesAggregationAttributeModificationSpec"}},"required":["kind","spec"]},"TimeSeriesAggregationAttributeModificationContext":{"type":"string","enum":["resource","scope","datapoint"]},"TimeSeriesAggregationAttributeModificationSpec":{"properties":{"context":{"$ref":"#/components/schemas/TimeSeriesAggregationAttributeModificationContext"},"keyMatcher":{"$ref":"#/components/schemas/Matcher"}},"required":["keyMatcher"]},"TimeSeriesAggregationDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0TimeSeriesAggregation"]},"metadata":{"$ref":"#/components/schemas/TimeSeriesAggregationMetadata"},"spec":{"$ref":"#/components/schemas/TimeSeriesAggregationSpec"}},"required":["kind","metadata","spec"]},"TimeSeriesAggregationDisplay":{"properties":{"name":{"description":"Short-form name for the view to be shown prominently within the view list and atop\nthe screen when the view is selected.\n","type":"string"}},"required":["name"]},"TimeSeriesAggregationLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/origin":{"type":"string"},"dash0.com/version":{"type":"string"},"dash0.com/dataset":{"type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"},"custom":{"type":"object","additionalProperties":{"type":"string"}}}},"TimeSeriesAggregationListResponse":{"type":"object","properties":{"timeSeriesAggregations":{"type":"array","items":{"$ref":"#/components/schemas/TimeSeriesAggregationDefinition"}}},"required":["timeSeriesAggregations"]},"TimeSeriesAggregationMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/TimeSeriesAggregationLabels"},"annotations":{"$ref":"#/components/schemas/TimeSeriesAggregationAnnotations"}},"required":["name"]},"TimeSeriesAggregationMetricNameMatch":{"properties":{"metricNameMatcher":{"$ref":"#/components/schemas/Matcher"},"otherFilters":{"$ref":"#/components/schemas/FilterCriteria","x-go-type-skip-optional-pointer":true}},"required":["metricNameMatcher"]},"TimeSeriesAggregationSample":{"properties":{"interval":{"$ref":"#/components/schemas/Duration","description":"The frequency at which metric data points are aggregated via these rules. This is a required parameter.\nIf you don't which to downsample your metrics, then set this to the scrape/export interval of your\nmetrics. Otherwise, use a larger number to reduce the granularity of your metrics.\n"},"delay":{"$ref":"#/components/schemas/Duration","description":"The amount of time to account for delays in scraping, exporting, and data arrival. We suggest to always\nadd a little bit of a delay to account for this. But you can increase it in case you have larger delays in\nyour scrape and export processes.\n","default":"20s"},"staleAfter":{"$ref":"#/components/schemas/Duration","description":"Duration after which a source time series with no new data is dropped from memory. This is a\nretention bound, and not a guarantee about exported values.\n\nWhen a source time series is dropped and new data arrives later, that source series starts\nover: its first new reading becomes a subtraction base rather than an increment, so no\nincrement is derived across the gap. The aggregated output series itself continues, and its\ncumulative total is not reset, because resetting it would be read downstream as a counter\nreset.\n\nA source time series may be held slightly beyond this duration while an aggregation window\nthat has not been exported yet still needs its last reading as a subtraction base. That is\nbounded by one export cycle, so it shifts when a series is dropped rather than whether.\n\nMust be at least delay plus interval, and is raised to that when a smaller value is\nconfigured: a window is not exported until delay after it closes, so a series declared dead\nsooner could never contribute to one.\n\nThat minimum is necessary but not sufficient. This must also be longer than the reporting\nperiod of the sources the rule matches, or each reading is dropped before the next one\narrives and the aggregated series exports nothing at all. Only the rule's own widths can be\nvalidated, so this one is on you: for a source scraped every 5 minutes, a staleAfter of a\nfew seconds over delay plus interval is legal and useless.\n\nDefault is 5 times the interval, subject to that same minimum.\n"}},"required":["interval"]},"TimeSeriesAggregationSpec":{"properties":{"enabled":{"type":"boolean"},"priority":{"description":"Precedence when more than one rule matches a metric. Lower values are evaluated first\n(higher precedence). Defaults to 0. Rules with equal priority are ordered deterministically\nby creation time, then by id.\n","type":"integer"},"display":{"$ref":"#/components/schemas/TimeSeriesAggregationDisplay"},"match":{"$ref":"#/components/schemas/TimeSeriesAggregationMetricNameMatch"},"sample":{"$ref":"#/components/schemas/TimeSeriesAggregationSample"},"attributeModifications":{"type":"array","items":{"$ref":"#/components/schemas/TimeSeriesAggregationAttributeModification"}}},"required":["enabled","match","sample"]},"TimingAssertion":{"properties":{"kind":{"type":"string","enum":["timing"]},"spec":{"$ref":"#/components/schemas/TimingAssertionSpec"}},"required":["kind","spec"]},"TimingAssertionSpec":{"properties":{"type":{"$ref":"#/components/schemas/TimingType"},"operator":{"$ref":"#/components/schemas/NumericAssertionOperator"},"value":{"$ref":"#/components/schemas/Duration"}},"required":["type","operator","value"]},"TimingType":{"type":"string","enum":["total","dns","connection","ssl","request","response"]},"TlsSettings":{"properties":{"allowInsecure":{"type":"boolean"}},"required":["allowInsecure"]},"TracingSettings":{"properties":{"addTracingHeaders":{"type":"boolean"}},"required":["addTracingHeaders"]},"ViewAction":{"type":"string","enum":["views:read","views:write","views:delete"]},"ViewAnnotations":{"properties":{"dash0.com/deleted-at":{"type":"string","format":"date-time"},"dash0.com/folder-path":{"description":"Optional UI folder path for organising groups (e.g. '/infrastructure/hosts'). Nesting is expressed with '/' separators.","type":"string"},"dash0.com/sharing":{"description":"Comma-separated list of principals to grant read access to. Supported formats: 'team:<team_id>' and 'user:<email>'. Example: 'team:team_01abc,user:alice@example.com'. Sharing is honored only on assets that declare a dash0.com/origin (for example those managed by Terraform, the operator, the CLI, or the API). Setting it on an asset that declares no dash0.com/origin is rejected with a 400 — manage that asset's access via the UI share dialog instead.","type":"string"}}},"ViewApiListItem":{"properties":{"id":{"type":"string"},"origin":{"type":"string"},"dataset":{"type":"string"},"name":{"type":"string"},"type":{"$ref":"#/components/schemas/ViewType"}},"required":["id","dataset","type"]},"ViewDefinition":{"properties":{"kind":{"type":"string","enum":["Dash0View"]},"metadata":{"$ref":"#/components/schemas/ViewMetadata"},"spec":{"$ref":"#/components/schemas/ViewSpec"}},"required":["kind","metadata","spec"]},"ViewDisplay":{"properties":{"name":{"description":"Short-form name for the view to be shown prominently within the view list and atop\nthe screen when the view is selected.\n","type":"string"},"description":{"description":"Long-form explanation what the view is doing. Shown within the list of views to help\nteam members understand the purpose of the view.\n","type":"string"}},"required":["name"]},"ViewLabels":{"properties":{"dash0.com/id":{"type":"string"},"dash0.com/origin":{"type":"string"},"dash0.com/version":{"type":"string"},"dash0.com/dataset":{"type":"string"},"dash0.com/source":{"$ref":"#/components/schemas/CrdSource"}}},"ViewMetadata":{"properties":{"name":{"type":"string"},"labels":{"$ref":"#/components/schemas/ViewLabels"},"annotations":{"$ref":"#/components/schemas/ViewAnnotations"}},"required":["name"]},"ViewPermission":{"properties":{"teamId":{"type":"string"},"userId":{"type":"string"},"role":{"description":"Use role identifiers such as `admin` and `basic_member` to reference user groups.\n","type":"string"},"actions":{"description":"Outlines possible actions that matching views can take with this view.\n","type":"array","items":{"$ref":"#/components/schemas/ViewAction"}}},"required":["actions"]},"ViewSpec":{"properties":{"type":{"$ref":"#/components/schemas/ViewType","description":"Views can exist in a variety of locations within the Dash0. The type defines\nwhere the view can be used, and consequently where it would appear as a selectable\noption.\n"},"display":{"$ref":"#/components/schemas/ViewDisplay"},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/ViewPermission"}},"groupBy":{"description":"A set of attribute keys to group the view by. This property may be missing to indicate that\nno configuration was historically made for this view, i.e., the view was saved before the\ngrouping capability was added. In that case, you can assume a default grouping should be used.\n","type":"array","items":{"type":"string"}},"filter":{"$ref":"#/components/schemas/FilterCriteria","description":"The filter for the whole view.\n"},"implicitFilter":{"$ref":"#/components/schemas/FilterCriteria","description":"An implicit filter the user cannot change that will always be applied to the view. It will not\nbe shown in the UI.\n"},"table":{"$ref":"#/components/schemas/ViewTable"},"visualizations":{"description":"A visualization configuration for the view. We only support a single visualization for now per view.\n","type":"array","items":{"$ref":"#/components/schemas/ViewVisualization"}},"serviceMapProperties":{"$ref":"#/components/schemas/ViewSpecServiceMapProperties"},"query":{"description":"The SQL query associated with this view. Only applicable when type is \"sql\".\nWhen the view is loaded, this query is used to populate the editor and auto-executed.\n","type":"string"},"serviceName":{"description":"The selected service name for this view. Only applicable when type is \"profiles\".\nWhen the view is loaded, this service is pre-selected in the filter bar.\n","type":"string"}},"required":["type","display"]},"ViewSpecServiceMapProperties":{"properties":{"layout":{"type":"string","enum":["flow","force"]},"externalServices":{"type":"string","enum":["all","group","hide"]},"selectedMetric":{"type":"string"},"particles":{"type":"boolean"},"nodeSizing":{"type":"boolean"},"expandedGroups":{"description":"A list of expanded group identifiers in the service map. When external services are grouped,\nindividual groups can be expanded to show all services within. This list stores which groups\nare currently expanded.\n","type":"array","items":{"type":"string"}}},"required":["layout","externalServices","selectedMetric","particles","nodeSizing"]},"ViewTable":{"properties":{"columns":{"type":"array","items":{"$ref":"#/components/schemas/ViewTableColumn"}},"sort":{"$ref":"#/components/schemas/OrderingCriteria"}},"required":["columns","sort"]},"ViewTableColumn":{"properties":{"key":{"description":"The key of the attribute to be displayed in this column. This can also be a built-in column name.\n","type":"string"},"label":{"type":"string"},"colSize":{"description":"A CSS grid layout sizing instruction. Supports hard-coded sizing such as `7rem`, but also `min-content`\nand similar variants.\n","type":"string"}},"required":["key"]},"ViewType":{"description":"The view type describes where this view configuration is intended to be applied in the UI.\n","type":"string","enum":["resources","services","spans","logs","metrics","failed_checks","web_events","sql","profiles","gcp_cloud_run_services","gcp_cloud_run_jobs","gcp_pubsub","gcp_cloud_storage","gcp_cloud_sql_instances","aws_lambda","slos"]},"ViewVisualization":{"properties":{"yAxisScale":{"$ref":"#/components/schemas/AxisScale","description":"The Y axis scale for the visualization.\n"},"metric":{"$ref":"#/components/schemas/ViewVisualizationMetric","deprecated":true},"renderer":{"$ref":"#/components/schemas/ViewVisualizationRenderer","deprecated":true},"renderers":{"description":"A set of visualizations (charts) to render as part of this view. We currently only expect\nto render a single\n","type":"array","items":{"$ref":"#/components/schemas/ViewVisualizationRenderer"}}},"required":["type","renderers"]},"ViewVisualizationMetric":{"type":"string","enum":["logs_total","logs_rate","spans_total","spans_rate","spans_errors_total","spans_errors_rate","spans_errors_percentage","spans_duration_p99","spans_duration_p95","spans_duration_p90","spans_duration_p75","spans_duration_p50","spans_duration_avg"]},"ViewVisualizationRenderer":{"description":"The renderer type for the visualization. The pattern matching is inspired by glob, where `*` can be used as a wildcard.\nThe matching prioritizes precise matches before wildcard matches.\nIf there are multiple renderers, select buttons will be added to allow toggling between the renderers.\n","type":"string","enum":["traces-explorer/*/outliers","traces-explorer/*/red","logging/*/stacked_bar","resources/*/table-tree","resources/overview/overview","resources/services/red","resources/operations/red","resources/names/red","resources/k8s-cron-jobs/executions","resources/k8s-cron-jobs/red","resources/k8s-daemon-sets/scheduled-nodes","resources/k8s-daemon-sets/red","resources/k8s-deployments/replicas","resources/k8s-deployments/red","resources/k8s-jobs/executions","resources/k8s-jobs/red","resources/k8s-namespaces/red","resources/k8s-nodes/cpu-memory-disk","resources/k8s-nodes/status","resources/k8s-pods/cpu-memory","resources/k8s-pods/status","resources/k8s-pods/red","resources/k8s-replica-sets/replicas","resources/k8s-replica-sets/red","resources/k8s-stateful-sets/replicas","resources/k8s-stateful-sets/red","resources/faas/red"]},"WebEventExportFormat":{"description":"The serialization format of the exported file.\n- `txt`: One rendered line per web event, carrying a fixed field set of timestamp,\n  service, event name, title, duration and trace ID. Ignores `columns`.\n- `ndjson`: One OTLP JSON payload per line, each carrying a single web event inside\n  the same `resourceLogs` envelope `GetWebEvents` returns — web events are stored as\n  OTLP log records — so each line is independently parseable by any OTLP JSON\n  consumer.\n- `yaml`: The same per-event OTLP payloads as `ndjson`, as a multi-document YAML\n  stream with documents separated by `---`.\n- `csv`: A header row plus one row per web event, flattened to the requested `columns`.\n","type":"string","enum":["txt","ndjson","yaml","csv"]},"WebEventsDownloadRequest":{"description":"Request for the `WebEventsDownload` API. Accepts the same query as `GetWebEvents`\n(`serviceName`, `eventNames`, `filter`, `timeRange`, `dataset`, `ordering`) and\nreturns the matching web events serialized as a downloadable file rather than as a\nJSON page.\n\nThe response is streamed, so the export is not paginated: a single request returns up\nto `limit` events, capped at 5000. Unlike the log and span exports there is no\nadaptive sampling to disable — web-event retrieval does not sample — so an exported\nfile is the query's whole result set up to the cap.\n\nThere is no Dash0 CLI command for web events, so the cap is the only limit; a query\nmatching more than 5000 events has to be narrowed to be exported in full.\n","properties":{"serviceName":{"type":"string"},"eventNames":{"type":"array","items":{"type":"string"}},"filter":{"$ref":"#/components/schemas/FilterCriteria"},"timeRange":{"$ref":"#/components/schemas/TimeReferenceRange"},"dataset":{"$ref":"#/components/schemas/Dataset"},"ordering":{"$ref":"#/components/schemas/OrderingCriteria","description":"The ordering criteria for the exported web events. Events are written to the file\nin this order.\nSupported ordering key: `otel.log.time` (event timestamp, defaults to descending),\noptionally followed by `dash0.web.event.id` ascending, which is the tiebreak\nweb-event retrieval appends to keep its cursor stable.\n"},"format":{"$ref":"#/components/schemas/WebEventExportFormat"},"limit":{"description":"The maximum number of web events to export. Defaults to, and is capped at, 5000.\nA larger value is rejected rather than silently clamped.\n","type":"integer","format":"int64","default":5000,"minimum":1,"maximum":5000},"columns":{"description":"Attribute keys to emit as columns, in order, for the `csv` format — resource,\nscope, or event attributes (e.g. `service.name`, `event.name`,\n`dash0.web.event.duration`). Ignored by the other formats, which have a fixed\nfield set.\n","type":"array","items":{"type":"string"}}},"required":["timeRange","format"]},"WebhookAgenticWorkflowTrigger":{"properties":{"kind":{"allOf":[{"$ref":"#/components/schemas/AgenticWorkflowTriggerKind"},{"enum":["webhook"]}]},"spec":{"$ref":"#/components/schemas/EmptyAgenticWorkflowTriggerSpec"},"task":{"$ref":"#/components/schemas/AgenticWorkflowTriggerTask"}},"required":["kind","spec"]},"WebhookConfig":{"properties":{"url":{"type":"string","format":"url"},"headers":{"type":"object","additionalProperties":{"type":"string"}},"followRedirects":{"type":"boolean","default":false},"allowInsecure":{"type":"boolean","default":false}},"required":["url"]}}}}