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