openapi: 3.1.0 info: title: Honeycomb SLOs API version: 1.0.0 license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html contact: email: support@honeycomb.io description: 'The API allows programmatic management of many resources within Honeycomb. Please report any discrepancies with actual API behavior in Pollinators Slack or to Honeycomb Support. ' externalDocs: url: https://docs.honeycomb.io servers: - url: https://api.honeycomb.io - url: https://api.eu1.honeycomb.io tags: - name: Burn Alerts description: 'This feature is available as part of the [Honeycomb Pro and Enterprise plans](https://www.honeycomb.io/pricing/). Burn Alerts notify you when issues impact your SLO budget. Learn more about [Burn Alerts here](https://docs.honeycomb.io/notify/alert/slos/monitor/). This API allows you to list, create, update, and delete burn alerts. ## Authorization The API key must have the **Manage SLOs** permission. Learn more about [API keys here](https://docs.honeycomb.io/configure/environments/manage-api-keys/). ' - name: Reporting description: 'The Reporting API provides access to historical performance data. ## Authorization The API key must have the **Manage SLOs** permission. Learn more about [API keys here](https://docs.honeycomb.io/configure/environments/manage-api-keys/). ' - name: SLOs description: 'This feature is available as part of the [Honeycomb Pro and Enterprise plans](https://www.honeycomb.io/pricing). Honeycomb SLOs allow you to define and monitor Service Level Objectives (SLOs) for your organization. This API allows you to list, create, update, and delete SLO objects. You can also access historical reporting for your SLOs to analyze long-term performance trends. For more information, see [Get SLO History](https://api-docs.honeycomb.io/api/reporting/getslohistory) ## Authorization The API key must have the **Manage SLOs** permission. Learn more about [API keys here](https://docs.honeycomb.io/configure/environments/manage-api-keys/). ' paths: /1/burn_alerts/{datasetSlug}: parameters: - $ref: '#/components/parameters/datasetSlugOrAll' post: security: - configuration_key: [] summary: Create a Burn Alert description: 'Create a Burn Alert against a specified SLO. ' tags: - Burn Alerts operationId: createBurnAlert requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateBurnAlertRequest' required: true responses: '201': description: Created headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/BurnAlertDetailResponse' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' get: security: - configuration_key: [] summary: List All Burn Alerts for an SLO description: 'Get all burn alerts associated with the SLO specified in the `slo_id` query param. It is not currently possible to retrieve all burn alerts for a dataset, environment, or team. ' tags: - Burn Alerts operationId: listBurnAlertsBySlo parameters: - in: query name: slo_id schema: type: string description: For use with the list endpoint to retrieve all burn alerts for a specified SLO. required: true responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: type: array items: $ref: '#/components/schemas/BurnAlertListResponse' example: - id: fS7vfB81Wcy alert_type: exhaustion_time description: Use this runbook (link) if this alert fires. triggered: true exhaustion_minutes: 120 slo: id: 2LBq9LckbcA created_at: '2022-09-22T17:32:11Z' updated_at: '2022-10-22T17:32:11Z' - id: gT7wgC82Xcz alert_type: budget_rate description: Use this runbook (link) if this alert fires. triggered: true budget_rate_window_minutes: 60 budget_rate_decrease_threshold_per_million: 1000 slo: id: 2LBq9LckbcA created_at: '2022-09-22T17:32:11Z' updated_at: '2022-10-22T17:32:11Z' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' /1/burn_alerts/{datasetSlug}/{burnAlertId}: parameters: - $ref: '#/components/parameters/datasetSlugOrAll' - name: burnAlertId description: The unique identifier (ID) of a Burn Alert. in: path required: true schema: type: string get: security: - configuration_key: [] summary: Get a Burn Alert description: 'Get a single Burn Alert by ID. ' tags: - Burn Alerts operationId: getBurnAlert responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/BurnAlertDetailResponse' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' put: security: - configuration_key: [] summary: Update a Burn Alert description: 'Update a Burn Alert by specifying its ID and full details. ' tags: - Burn Alerts operationId: updateBurnAlert requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateBurnAlertRequest' responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/BurnAlertDetailResponse' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' delete: security: - configuration_key: [] summary: Delete a Burn Alert description: Delete a Burn Alert by specifying its ID. tags: - Burn Alerts operationId: deleteBurnAlert responses: '204': description: Success - no content '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' /1/slos/{datasetSlug}: parameters: - $ref: '#/components/parameters/datasetSlugOrAll' post: security: - configuration_key: [] summary: Create an SLO description: 'Create an SLO on the provided dataset. ' tags: - SLOs operationId: createSlo requestBody: content: application/json: schema: $ref: '#/components/schemas/SLOCreate' required: true responses: '201': description: Success - SLO created headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/SLOCreate' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' get: security: - configuration_key: [] summary: Get all SLOs description: 'Get all SLOs for a dataset or environment (using `__all__`). This action returns any SLOs, including those applied with multiple datasets. ' tags: - SLOs operationId: listSlos responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: type: array items: $ref: '#/components/schemas/SLO' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' /1/slos/{datasetSlug}/{sloId}: parameters: - $ref: '#/components/parameters/datasetSlugOrAll' - name: sloId description: Unique identifier (ID) of the SLO. in: path required: true schema: type: string get: security: - configuration_key: [] summary: Get an SLO description: 'Get an SLO by ID. ' tags: - SLOs operationId: getSlo parameters: - in: query name: detailed schema: type: boolean description: 'Allows SLO reporting data (`status`, `burn_rate`, `budget_remaining` and `compliance`) to be returned when retrieving a single SLO. This feature is available as part of the [Honeycomb Enterprise plan](https://www.honeycomb.io/pricing/). **Note:** `burn_rate` is calculated based on the last 4 hours of data. ' required: false allowEmptyValue: true example: '' responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: anyOf: - $ref: '#/components/schemas/SLO' - $ref: '#/components/schemas/SLODetailedResponse' examples: get-slo: description: Get an SLO by ID value: id: bZ1aRHAUsjG name: My SLO description: My SLO description sli: alias: my-sli time_period_days: 30 target_per_million: 989900 reset_at: '2022-10-15T13:53:11Z' created_at: '2022-09-15T05:39:42Z' updated_at: '2022-12-20T08:10:05Z' dataset_slugs: - mydataset1 get-slo-detailed: description: Get SLO by ID with detailed response value: id: bZ1aRHAUsjG name: My SLO description: My SLO description sli: alias: my-sli time_period_days: 30 target_per_million: 989900 compliance: 95.39 budget_remaining: 7.73 status: normal burn_rate: 5.39 reset_at: '2022-10-15T13:53:11Z' created_at: '2022-09-15T05:39:42Z' updated_at: '2022-12-20T08:10:05Z' dataset_slugs: - mydataset1 '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' put: security: - configuration_key: [] summary: Update an SLO description: 'Update an SLO by specifying its ID and full SLO details. ' tags: - SLOs operationId: updateSlo requestBody: description: 'Partial updates are not supported. ' content: application/json: schema: $ref: '#/components/schemas/SLO' required: true responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/SLO' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' delete: security: - configuration_key: [] summary: Delete an SLO description: 'Delete an SLO by specifying its ID. ' tags: - SLOs operationId: deleteSlo responses: '204': description: Success - no content headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' /1/slos/{datasetSlug}/{sloId}/counts: parameters: - $ref: '#/components/parameters/datasetSlugOrAll' - name: sloId description: Unique identifier (ID) of the SLO. in: path required: true schema: type: string get: security: - configuration_key: [] summary: Get SLO Realtime Counts description: "Get per-minute success and failure event counts for an SLO, updated approximately once per minute from a rolling 24-hour window.\n\nThis endpoint is intended for near-real-time integrations\ \ such as external SLO dashboards and alerting tools (e.g. nobl9). For weekly compliance history, use the [Get SLO History endpoint](https://api-docs.honeycomb.io/api/reporting/getSloHistory/).\n\ \n**Requirements:**\n- Available on the [Enterprise plan](https://www.honeycomb.io/pricing/) only.\n- This feature must be enabled for your team. Contact your account team\n to request access.\n\ \n\n**Gaps:** Some minutes may have no entry in the `windows` array. The first window after a gap may contain a larger-than-usual delta. Treat missing timestamps as unavailable data, not zero-event\ \ periods.\n\n**Epoch:** The response includes an `epoch` field \u2014 a hash of the SLO's SLI expression and dataset configuration. If this value changes between responses, the underlying SLO definition\ \ has changed and any client-side cache should be invalidated.\n\n**Partial windows:** Windows marked `is_partial: true` may still receive additional events. This occurs for the most recent 10 minutes\ \ (late-arriving data settlement) or when no prior snapshot exists to compute a delta from.\n" tags: - SLOs operationId: getSloRealtimeCounts parameters: - in: query name: start_time required: true schema: type: integer description: 'Start of the time range as a Unix timestamp (seconds). Must be within the last 24 hours and no later than `end_time`. ' example: 1745251200 - in: query name: end_time required: true schema: type: integer description: 'End of the time range as a Unix timestamp (seconds). Must be greater than `start_time` and within the same clock hour as `start_time`. Realtime counts accumulate from the start of each hour and reset at hour boundaries; use the [Get SLO Hourly Counts History endpoint](https://api-docs.honeycomb.io/api/slos/getSloHourlyCountsHistory/) for completed hours. ' example: 1745254740 responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/SLOCountsResponse' example: slo_id: bZ1aRHAUsjG resolution_seconds: 60 epoch: a3f9c2d1e8b74056 period_start: 1745251200 windows: - window_start: 1745251200 window_end: 1745251260 total_count: 1243 error_count: 3 is_partial: false - window_start: 1745251260 window_end: 1745251320 total_count: 1188 error_count: 1 is_partial: false - window_start: 1745251320 window_end: 1745251380 total_count: 1301 error_count: 0 is_partial: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' /1/slos/{datasetSlug}/{sloId}/counts/history: parameters: - $ref: '#/components/parameters/datasetSlugOrAll' - name: sloId description: Unique identifier (ID) of the SLO. in: path required: true schema: type: string get: security: - configuration_key: [] summary: Get SLO Hourly Counts History description: "Get hourly-bucketed total and error event counts for an SLO from the persistent historical store. Use this endpoint to retrieve completed historical hours; pair with the [Get SLO Realtime\ \ Counts endpoint](https://api-docs.honeycomb.io/api/slos/getslorealtimecounts/) for the current in-progress hour.\n\n**Requirements:**\n- Available on the [Enterprise plan](https://www.honeycomb.io/pricing/)\ \ only.\n- This feature must be enabled for your team. Contact your account team\n to request access.\n\n\n**Partial buckets:** The most recent bucket may be marked `is_partial: true` if it covers\ \ the current in-progress hour. Counts for that bucket will increase until the hour completes.\n" tags: - SLOs operationId: getSloHourlyCountsHistory parameters: - in: query name: start_time required: true schema: type: integer description: 'Start of the time range as a Unix timestamp (seconds). ' example: 1745168400 - in: query name: end_time required: true schema: type: integer description: 'End of the time range as a Unix timestamp (seconds). Must be greater than `start_time`. ' example: 1745254800 responses: '200': description: Success headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/SLOHourlyCountsResponse' example: slo_id: bZ1aRHAUsjG resolution_seconds: 3600 buckets: - start_time: 1745168400 end_time: 1745172000 total_count: 74520 error_count: 182 is_partial: false - start_time: 1745172000 end_time: 1745175600 total_count: 71043 error_count: 97 is_partial: false - start_time: 1745251200 end_time: 1745254800 total_count: 12300 error_count: 14 is_partial: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/RateLimited' default: $ref: '#/components/responses/GenericError' /1/reporting/slos/historical: post: security: - configuration_key: [] summary: Get SLO History description: 'Get a weekly breakdown of historical data for a list of SLOs for a given time range. ' tags: - Reporting operationId: getSloHistory requestBody: content: application/json: schema: $ref: '#/components/schemas/SLOHistoryRequest' required: true responses: '200': description: "A mapping from SLO IDs (e.g., \"2LBq9LckbcA\") to their historical data. Each SLO ID maps to an array of compliance and budget intervals.\n\n **Note**: An empty array indicates that\ \ no historical data was found for the given time range for that SLO.\n" headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/SLOHistoryResponse' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '422': $ref: '#/components/responses/ValidationFailed' '429': $ref: '#/components/responses/RateLimited' '500': $ref: '#/components/responses/InternalError' default: $ref: '#/components/responses/GenericError' components: parameters: datasetSlugOrAll: name: datasetSlug description: 'The dataset slug or use `__all__` for endpoints that support environment-wide operations. ' in: path required: true schema: type: string schemas: SLOHourlyCountsResponse: type: object properties: slo_id: type: string description: The unique identifier of the SLO. readOnly: true example: bZ1aRHAUsjG resolution_seconds: type: integer description: The width of each bucket in seconds. Always `3600`. readOnly: true example: 3600 buckets: type: array description: 'Ordered list of hourly count buckets within the requested time range. Gaps indicate hours with no recorded data. An empty array means no data exists for the requested range. ' items: $ref: '#/components/schemas/SLOHourBucket' JSONAPIError: x-tags: - Errors type: object description: A JSONAPI-formatted error message. properties: errors: type: array items: type: object readOnly: true required: - id - code properties: id: type: string readOnly: true status: type: string readOnly: true code: type: string readOnly: true title: type: string readOnly: true detail: type: string readOnly: true source: type: object readOnly: true properties: pointer: type: string readOnly: true header: type: string readOnly: true parameter: type: string readOnly: true BudgetRateBurnAlertDetailResponse: allOf: - $ref: '#/components/schemas/BudgetRateBurnAlertListResponse' - type: object properties: recipients: type: array minItems: 1 description: 'A list of [Recipients](/api/recipients/) to notify when an alert fires. Using `type`+`target` is deprecated. First, create the Recipient via the Recipients API, and then specify the ID. ' items: $ref: '#/components/schemas/NotificationRecipient' example: - id: abcd123 type: email target: alerts@example.com ExhaustionTimeBurnAlertDetailResponse: title: Exhaustion Time allOf: - $ref: '#/components/schemas/ExhaustionTimeBurnAlertListResponse' - type: object properties: recipients: type: array minItems: 1 description: 'A list of [Recipients](/api/recipients/) to notify when an alert fires. Using `type`+`target` is deprecated. First, create the Recipient via the Recipients API, and then specify the ID. ' items: $ref: '#/components/schemas/NotificationRecipient' example: - id: abcd123 type: email target: alerts@example.com SLOHourBucket: type: object properties: start_time: type: integer format: int64 description: Start of the hour as a Unix timestamp (seconds). readOnly: true example: 1745168400 end_time: type: integer format: int64 description: 'End of the hour as a Unix timestamp (seconds). Always `start_time + 3600`. ' readOnly: true example: 1745172000 total_count: type: integer description: Total number of events (good + bad) in this hour. readOnly: true example: 74520 error_count: type: integer description: Number of failed (bad) events in this hour. readOnly: true example: 182 is_partial: type: boolean description: 'When `true`, this bucket covers the current in-progress hour and its counts will increase until the hour completes. Clients should treat `is_partial: true` buckets as provisional. ' readOnly: true example: false UpdateBudgetRateBurnAlertRequest: title: Budget Rate allOf: - $ref: '#/components/schemas/BudgetRateBurnAlert' - type: object required: - recipients properties: recipients: type: array minItems: 1 description: 'A list of [Recipients](/api/recipients/) to notify when an alert fires. Using `type`+`target` is deprecated. First, create the Recipient via the Recipients API, and then specify the ID. ' items: $ref: '#/components/schemas/NotificationRecipient' example: - id: abcd123 type: email target: alerts@example.com SLOHistoryRequest: type: object required: - ids - start_time - end_time properties: ids: type: array description: 'A list of SLO IDs to retrieve history for. Cannot be an empty array or more than 24 in length. ' minItems: 1 maxItems: 24 example: - 2LBq9LckbcA - CzcpPs7cJ4d start_time: type: integer description: The starting Unix timestamp, in seconds since the epoch, to retrieve historical data for. Cannot be more than a year in the past. example: 1742230800 end_time: type: integer description: The ending Unix timestamp, in seconds since the epoch, to retrieve historical data for. Must be greater than `start_time`. Cannot be a future timestamp. example: 1745254800 UpdateExhaustionTimeBurnAlertRequest: allOf: - $ref: '#/components/schemas/ExhaustionTimeBurnAlert' - type: object required: - recipients properties: recipients: type: array minItems: 1 description: 'A list of [Recipients](/api/recipients/) to notify when an alert fires. Using `type`+`target` is deprecated. First, create the Recipient via the Recipients API, and then specify the ID. ' items: $ref: '#/components/schemas/NotificationRecipient' example: - id: abcd123 type: email target: alerts@example.com ExhaustionTimeBurnAlert: title: Exhaustion Time allOf: - $ref: '#/components/schemas/BurnAlertSharedParams' - type: object required: - exhaustion_minutes properties: alert_type: type: string description: 'One of the supported alert types: 1. `exhaustion_time`: Notifies when you are about to run out of SLO budget within a specified number of hours. 1. `budget_rate`: Notifies when budget drops by at least a specified percentage within a defined time window. ' default: exhaustion_time enum: - exhaustion_time - budget_rate example: exhaustion_time exhaustion_minutes: type: integer minimum: 0 description: 'Required when `alert_type` is `exhaustion_time`. Must not be specified when `alert_type` is `budget_rate`. Amount of time (in minutes) left until your projected SLO budget is exhausted. The alert will fire when this exhaustion threshold is reached. ' example: 120 Tag: type: object required: - key - value properties: key: type: string description: A key to identify the tag, lowercase letters only. maxLength: 32 value: type: string description: A value for the tag, must begin with a lowercase letter, contain only alphanumeric characters (all letters lowercase) and special characters of `/` and `-` allowed. maxLength: 128 SLOHistory: type: object properties: timestamp: type: integer description: The starting Unix timestamp, in seconds since the epoch, for the interval. readOnly: true example: 1744650000 compliance: type: number description: 'Historical compliance of the SLO in this interval. ' format: double readOnly: true example: 91.44851657940663 budget_remaining: type: number description: 'How much error budget remains for the SLO in this interval. ' format: double readOnly: true example: 14.48516579406632 BurnAlertSharedParams: type: object properties: id: type: string description: Unique identifier (ID) of a Burn alert. readOnly: true example: fS7vfB81Wcy description: type: string description: A description of the Burn Alert. maxLength: 1023 example: Use this runbook if this alert fires. triggered: type: boolean description: 'Indicates if the Burn Alert has been triggered. This field is read-only and is set to `true` when the alert is triggered. ' readOnly: true example: false created_at: type: string format: date-time description: The ISO8601-formatted time when the Burn Alert was created. readOnly: true example: '2022-09-22T17:32:11Z' updated_at: type: string format: date-time description: The ISO8601-formatted time when the Burn Alert was updated. readOnly: true example: '2022-10-31T15:08:11Z' auto_investigate: x-internal: true type: boolean description: 'When true, Honeycomb will automatically start an investigation when this Burn Alert fires. ' default: false example: false CreateExhaustionTimeBurnAlertRequest: allOf: - $ref: '#/components/schemas/ExhaustionTimeBurnAlert' - type: object required: - slo - recipients properties: slo: type: object description: Details about the SLO associated with the burn alert. required: - id properties: id: type: string description: Unique identifier (ID) of a SLO. example: id: 2LBq9LckbcA recipients: type: array minItems: 1 description: 'A list of [Recipients](/api/recipients/) to notify when an alert fires. Using `type`+`target` is deprecated. First, create the Recipient via the Recipients API, and then specify the ID. ' items: $ref: '#/components/schemas/NotificationRecipient' example: - id: abcd123 type: email target: alerts@example.com BurnAlertListResponse: type: object required: - alert_type properties: alert_type: type: string oneOf: - $ref: '#/components/schemas/ExhaustionTimeBurnAlertListResponse' - $ref: '#/components/schemas/BudgetRateBurnAlertListResponse' discriminator: propertyName: alert_type mapping: exhaustion_time: '#/components/schemas/ExhaustionTimeBurnAlertListResponse' budget_rate: '#/components/schemas/BudgetRateBurnAlertListResponse' SLOCountsResponse: type: object properties: slo_id: type: string description: The unique identifier of the SLO. readOnly: true example: bZ1aRHAUsjG resolution_seconds: type: integer description: The width of each window in seconds. Always `60`. readOnly: true example: 60 epoch: type: string description: 'A hash of the SLO''s SLI expression and dataset configuration. This value changes whenever the SLO definition changes in a way that affects count computation (e.g. a derived column expression update). Clients should compare this value across responses: a change means counts have reset under a new key and any client-side cache should be invalidated. ' readOnly: true example: a3f9c2d1e8b74056 period_start: type: integer format: int64 description: 'Unix timestamp of the start of the current accumulation period (the most recent hour boundary). The cumulative totals used to compute deltas reset to zero at this point. Clients should re-baseline their delta computations whenever this value changes between responses. ' readOnly: true example: 1745251200 windows: type: array description: 'Ordered list of per-minute count windows within the requested time range. Gaps between windows indicate minutes with no recorded snapshot. An empty array means no data exists for the requested range. ' items: $ref: '#/components/schemas/SLOCountWindow' ValidationError: x-tags: - Errors allOf: - $ref: '#/components/schemas/DetailedError' - type: object properties: status: type: number readOnly: true default: 422 type: type: string readOnly: true default: https://api.honeycomb.io/problems/validation-failed title: type: string readOnly: true default: The provided input is invalid. type_detail: type: array items: type: object properties: field: type: string readOnly: true code: type: string readOnly: true enum: - invalid - missing - incorrect_type - already_exists description: type: string readOnly: true UpdateBurnAlertRequest: type: object required: - alert_type properties: alert_type: type: string oneOf: - $ref: '#/components/schemas/UpdateExhaustionTimeBurnAlertRequest' - $ref: '#/components/schemas/UpdateBudgetRateBurnAlertRequest' discriminator: propertyName: alert_type mapping: exhaustion_time: '#/components/schemas/UpdateExhaustionTimeBurnAlertRequest' budget_rate: '#/components/schemas/UpdateBudgetRateBurnAlertRequest' CreateBudgetRateBurnAlertRequest: allOf: - $ref: '#/components/schemas/BudgetRateBurnAlert' - type: object required: - slo - recipients properties: slo: type: object description: Details about the SLO associated with the burn alert. required: - id properties: id: type: string description: Unique identifier (ID) of a SLO. example: id: 2LBq9LckbcA recipients: type: array minItems: 1 description: 'A list of [Recipients](/api/recipients/) to notify when an alert fires. Using `type`+`target` is deprecated. First, create the Recipient via the Recipients API, and then specify the ID. ' items: $ref: '#/components/schemas/NotificationRecipient' example: - id: abcd123 type: email target: alerts@example.com SLODetailedResponse: allOf: - $ref: '#/components/schemas/SLO' type: object properties: compliance: type: number description: 'Reporting data to express historical compliance of the SLO. Only included when the `?detailed` query param is passed. ' format: double readOnly: true example: 95.39 budget_remaining: type: number description: 'Reporting data to express how much error budget remains for the time period of the SLO. Only included when the `?detailed` query param is passed. ' format: double readOnly: true example: 7.73 status: type: string description: 'Reporting data to express the status of the SLO. Status can be one of the following: - `normal` : The SLO has no burn alerts triggered. - `triggered`: The SLO has at least one burn alert triggered. - `no_alerts`: The SLO has no burn alerts associated with it. - `no_events`: The SLO has no events streaming in. Only included when the `?detailed` query param is passed. ' enum: - normal - triggered - no_alerts - no_events readOnly: true example: normal burn_rate: type: number description: 'Reporting data to express the ratio of actual failures in the SLO to expected failures in the given time window. The time window defaults to 4 hours for the API response. Only included when the `?detailed` query param is passed. ' format: double readOnly: true example: 5.39 SLOCreate: type: object required: - name - time_period_days - target_per_million - sli properties: id: type: string readOnly: true name: type: string description: The name of the SLO. minLength: 1 maxLength: 120 example: My SLO description: type: string description: A nice description of the SLO's intent and context. minLength: 0 maxLength: 1023 example: SLO to ensure requests succeed and are fast sli: type: object description: Reference to the [Calculated Field (also called Derived Column)](/api/calculated-fields/) used as the indicator of event success. required: - alias properties: alias: type: string description: The alias of the Calculated Field (also called Derived Column). minLength: 1 maxLength: 255 example: alias: error_sli time_period_days: type: integer description: The time period, in days, over which the SLO will be evaluated. minimum: 1 example: 30 target_per_million: type: integer description: The number of events out of one million (1,000,000) that you expected qualified events to succeed. minimum: 0 maximum: 999999 example: 990000 tags: type: array description: A list of key-value pairs to help identify the SLO. maxItems: 10 items: $ref: '#/components/schemas/Tag' example: - key: team value: blue reset_at: type: - 'null' - string format: date-time description: The ISO8601-formatted time the SLO was last reset. The value will be `null` if the SLO has not yet been reset. readOnly: true example: 2022-011-11T09:53:04Z created_at: type: string description: The ISO8601-formatted time when the SLO was created. format: date-time readOnly: true example: '2022-09-22T17:32:11Z' updated_at: type: string format: date-time description: The ISO8601-formatted time when the SLO was updated. readOnly: true example: '2022-10-31T15:08:11Z' dataset_slugs: type: array description: The dataset(s) the SLO will be evaluated against. Required if using `__all__` in the path. minItems: 1 maxItems: 10 example: - mydataset1 - mydataset2 DetailedError: x-tags: - Errors description: An RFC7807 'Problem Detail' formatted error message. type: object required: - error - status - type - title properties: error: type: string readOnly: true default: something went wrong! status: type: number readOnly: true description: The HTTP status code of the error. type: type: string readOnly: true description: Type is a URI used to uniquely identify the type of error. title: type: string readOnly: true description: Title is a human-readable summary that explains the `type` of the problem. detail: type: string readOnly: true description: The general, human-readable error message. instance: type: string readOnly: true description: The unique identifier (ID) for this specific error. RecipientType: type: string description: One of the supported Recipient Types enum: - pagerduty - email - slack - webhook - msteams - msteams_workflow BudgetRateBurnAlert: title: Budget Rate allOf: - $ref: '#/components/schemas/BurnAlertSharedParams' - type: object required: - alert_type - budget_rate_window_minutes - budget_rate_decrease_threshold_per_million properties: alert_type: type: string description: 'One of the supported alert types: 1. `exhaustion_time`: Notifies when you are about to run out of SLO budget within a specified number of hours. 1. `budget_rate`: Notifies when budget drops by at least a specified percentage within a defined time window. ' default: exhaustion_time enum: - exhaustion_time - budget_rate example: budget_rate budget_rate_window_minutes: type: integer minimum: 60 description: 'Required when `alert_type` is `budget_rate`. Must not be specified when `alert_type` is `exhaustion_time`. Time period (in minutes) over which a budget rate will be calculated. Must be no greater than the associated SLO''s time period. ' example: 120 budget_rate_decrease_threshold_per_million: type: integer minimum: 1 maximum: 1000000 description: 'Required when `alert_type` is `budget_rate`. Must not be specified when `alert_type` is `exhaustion_time`. The percent the budget has decreased over the budget rate window, represented as a value out of one million. The alert will fire when this budget decrease threshold is reached. See the table below for some example conversions from desired budget decrease percent to the representation as a value out of one million | Desired percent | Value per million | |-----------------|-------------------| | 0.001% | 1 | | 1% | 10,000 | | 5% | 50,000 | | 99.99% | 999,900 | ' example: 1000 CreateBurnAlertRequest: type: object required: - alert_type properties: alert_type: type: string oneOf: - $ref: '#/components/schemas/CreateExhaustionTimeBurnAlertRequest' - $ref: '#/components/schemas/CreateBudgetRateBurnAlertRequest' discriminator: propertyName: alert_type mapping: exhaustion_time: '#/components/schemas/CreateExhaustionTimeBurnAlertRequest' budget_rate: '#/components/schemas/CreateBudgetRateBurnAlertRequest' SLO: type: object required: - name - time_period_days - target_per_million - sli properties: id: type: string readOnly: true name: type: string description: The name of the SLO. minLength: 1 maxLength: 120 example: My SLO description: type: string description: A nice description of the SLO's intent and context. minLength: 0 maxLength: 1023 example: SLO to ensure requests succeed and are fast sli: type: object description: Reference to the [Calculated Field](/api/calculated-fields/) used as the indicator of event success. required: - alias properties: alias: type: string description: The alias of the Calculated Field (also called Derived Column). minLength: 1 maxLength: 255 example: alias: error_sli time_period_days: type: integer description: The time period, in days, over which the SLO will be evaluated. minimum: 1 example: 30 target_per_million: type: integer description: The number of events out of one million (1,000,000) that you expected qualified events to succeed. minimum: 0 maximum: 999999 example: 990000 tags: type: array description: A list of key-value pairs to help identify the SLO. maxItems: 10 items: $ref: '#/components/schemas/Tag' example: - key: team value: blue reset_at: type: - 'null' - string format: date-time description: The ISO8601-formatted time the SLO was last reset. The value will be `null` if the SLO has not yet been reset. readOnly: true example: 2022-011-11T09:53:04Z created_at: type: string description: The ISO8601-formatted time when the SLO was created. format: date-time readOnly: true example: '2022-09-22T17:32:11Z' updated_at: type: string format: date-time description: The ISO8601-formatted time when the SLO was updated. readOnly: true example: '2022-10-31T15:08:11Z' dataset_slugs: type: array description: The dataset(s) the SLO will be evaluated against. Required if using `__all__` in the path. readOnly: true minItems: 1 maxItems: 10 example: - mydataset1 - mydataset2 BudgetRateBurnAlertListResponse: title: Budget Rate allOf: - $ref: '#/components/schemas/BudgetRateBurnAlert' - type: object properties: slo: type: object description: Details about the SLO associated with the burn alert. properties: id: type: string description: Unique identifier (ID) of a SLO. example: id: 2LBq9LckbcA SLOHistoryResponse: type: object description: 'A mapping from SLO IDs (e.g., "2LBq9LckbcA") to their historical data. Each SLO ID maps to an array of compliance and budget intervals. ' additionalProperties: type: array items: $ref: '#/components/schemas/SLOHistory' example: 2LBq9LckbcA: - timestamp: 1744650000 compliance: 91.44851657940663 budget_remaining: 14.48516579406632 - timestamp: 1744653600 compliance: 97.98746514671242 budget_remaining: 88.13453467953423 CzcpPs7cJ4d: - timestamp: 1744650000 compliance: 93.53414567784128 budget_remaining: -71.02966841186735 NotificationRecipientDetails: type: object properties: pagerduty_severity: description: 'When using a Recipient of `type = "pagerduty"`, the severity of the alert can be specified. ' type: string default: critical enum: - critical - error - warning - info variables: description: 'When using a Recipient of `type = "webhook"`, the alert-level variables can be specified. ' type: array items: type: object required: - name properties: name: type: string pattern: ^[a-z](?:[a-zA-Z0-9]+$)?$ maxLength: 64 example: severity value: type: string maxLength: 256 example: warning NotificationRecipient: type: object properties: id: type: string type: deprecated: true description: 'One of the allowed Recipient types. Deprecated: Use the Recipients API first, then pass the Recipient ID. ' allOf: - $ref: '#/components/schemas/RecipientType' target: type: string deprecated: true description: 'The target of the notification. For example, the specific Slack channel or email address. For Recipients of `type = "webhook"` or `type = "msteams_workflow"`, this will be the Name in the UI and `webhook_name` in the Recipients API. Deprecated: Use the Recipients API first, then pass the Recipient ID. ' details: $ref: '#/components/schemas/NotificationRecipientDetails' ExhaustionTimeBurnAlertListResponse: allOf: - $ref: '#/components/schemas/ExhaustionTimeBurnAlert' - type: object properties: slo: type: object description: Details about the SLO associated with the burn alert. properties: id: type: string description: Unique identifier (ID) of a SLO. example: id: 2LBq9LckbcA BurnAlertDetailResponse: type: object required: - alert_type properties: alert_type: type: string oneOf: - $ref: '#/components/schemas/ExhaustionTimeBurnAlertDetailResponse' - $ref: '#/components/schemas/BudgetRateBurnAlertDetailResponse' discriminator: propertyName: alert_type mapping: exhaustion_time: '#/components/schemas/ExhaustionTimeBurnAlertDetailResponse' budget_rate: '#/components/schemas/BudgetRateBurnAlertDetailResponse' SLOCountWindow: type: object properties: window_start: type: integer description: Start of the window as a Unix timestamp (seconds). readOnly: true example: 1745251200 window_end: type: integer description: 'End of the window as a Unix timestamp (seconds). Always `window_start + 60`. ' readOnly: true example: 1745254260 total_count: type: integer description: Total number of events (good + bad) in this window. readOnly: true example: 1243 error_count: type: integer description: Number of failed (bad) events in this window. readOnly: true example: 3 is_partial: type: boolean description: "When `true`, the data for this window may be incomplete. This occurs in three cases:\n1. **No prior anchor**: The first window has no preceding snapshot\n to delta from, so the\ \ value is a raw cumulative total rather\n than a true per-minute delta.\n\n2. **Settlement window**: The window started within the last 10\n minutes. Late-arriving events from client buffering\ \ or\n ingestion lag may still appear in a subsequent snapshot.\n\n3. **Hour boundary reset**: Cumulative totals reset to zero at\n each hour boundary. A request spanning a boundary will\ \ see\n the new hour's counts start near zero while the anchor came\n from the prior hour's larger total. Both `total_count` and\n `error_count` are zeroed for this window. Use `period_start`\n\ \ to detect this and avoid requesting ranges that cross a\n boundary.\n\nClients building alerting on top of this data should treat `is_partial: true` windows as provisional.\n" readOnly: true example: false Error: x-tags: - Errors type: object description: A legacy error, containing only a textual description. properties: error: type: string readOnly: true responses: ValidationFailed: description: Validation Failed headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/problem+json: schema: $ref: '#/components/schemas/ValidationError' example: status: 422 type: https://api.honeycomb.io/problems/validation-failed error: The provided input is invalid. title: The provided input is invalid type_detail: - field: type code: invalid description: 'type: must be a valid value' application/json: schema: $ref: '#/components/schemas/Error' application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' InternalError: description: InternalError content: application/problem+json: schema: $ref: '#/components/schemas/DetailedError' application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' Forbidden: description: Forbidden content: application/json: schema: $ref: '#/components/schemas/Error' examples: deny-management-apis: description: Team cannot access management APIs. value: error: Your team has been denied access to Management APIs, please contact support to be unblocked. application/problem+json: schema: $ref: '#/components/schemas/DetailedError' application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' NotFound: description: Not Found headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/Error' example: error: dataset not found application/problem+json: schema: $ref: '#/components/schemas/DetailedError' example: status: 404 type: https://api.honeycomb.io/problems/not-found title: The requested resource cannot be found. error: Dataset not found detail: Dataset not found application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' Unauthorized: description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/Error' example: error: unknown API key - check your credentials application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' GenericError: description: Error content: application/json: schema: $ref: '#/components/schemas/Error' RateLimited: description: Rate Limit Exceeded headers: Retry-After: $ref: '#/components/headers/RetryAfter' Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/json: schema: $ref: '#/components/schemas/Error' example: error: Rate Limited application/problem+json: schema: $ref: '#/components/schemas/DetailedError' example: status: 429 type: https://api.honeycomb.io/problems/rate-limited title: You have exceeded your rate limit. error: You have exceeded your rate limit. detail: Please try again after 2025-02-01T15:23:12Z. application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' example: errors: - id: 06dcdd6508ca822f0e7e2bb4121c1f52 code: rate-limited/may-retry title: request rate limit exceeded detail: Please try again after 2025-02-01T15:23:12Z. BadRequest: description: The provided request body was invalid. headers: Ratelimit: $ref: '#/components/headers/RateLimit' RateLimitPolicy: $ref: '#/components/headers/RateLimitPolicy' content: application/problem+json: schema: $ref: '#/components/schemas/DetailedError' examples: DetailedError: value: status: 400 type: https://api.honeycomb.io/problems/unparseable title: The request body could not be parsed. error: invalid gzip data application/json: schema: $ref: '#/components/schemas/Error' examples: GenericError: value: error: invalid Query data application/vnd.api+json: schema: $ref: '#/components/schemas/JSONAPIError' examples: JSONAPIError: value: errors: - id: 06dcdd6508ca822f0e7e2bb4121c1f52 code: invalid title: request body could not be parsed detail: invalid gzip data headers: RateLimitPolicy: description: "The (draft07) recommended header from the IETF on rate limiting.\nThe value of the header is formatted \"X;w=Y\".\nWhere:\n - X is the maximum number of requests allowed in a window\n\ \ - Y is the size of the window in seconds\n" schema: type: string example: 100;w=60 RetryAfter: description: 'The RFC7231 header used to indicate when a client should retry requests. ' schema: type: string example: Fri, 22 Mar 2024 18:37:53 GMT RateLimit: description: "The (draft07) recommended header from the IETF on rate limiting.\nThe value of the header is formatted \"limit=X, remaining=Y, reset=Z\".\nWhere:\n - X is the maximum number of requests\ \ allowed in the window\n - Y is the number of requests remaining in the window\n - Z is the number of seconds until the limit resets\n" schema: type: string example: limit=100, remaining=50, reset=60