https://app.honeybadger.io/v3/projects/{project_id}/insights/queries
insights:read
Runs a BadgerQL query against the project’s event streams and returns the result. It’s a POST, but it changes nothing.
Pass stream_ids to choose streams, or leave it out to search them all. Events on a stream that isn’t selected return no rows. See BadgerQL for the query language.
Example request
curl -X POST "https://app.honeybadger.io/v3/projects/$PROJECT_ID/insights/queries" \ -H "Authorization: Bearer $HONEYBADGER_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "query": "@size > 0 | limit 10"}'Parameters
1Path parameters
| Field | Type | Description |
|---|---|---|
project_id required | string | Project ID. |
Request body
| Field | Type | Description |
|---|---|---|
query required | string | BadgerQL query. |
stream_ids | array<string> | Streams to search. Omit it, or pass an empty array, to search every stream on the project. Every ID must belong to this project; repeated IDs are deduplicated. |
ts | string | Time range for the query. |
timezone | string | Timezone for time bucketing and display. |
Responses
1200 The query result.
Its fields depend on the query: an aggregation returns different fields from an event listing. links.web opens this query in the Honeybadger web UI, with the request’s ts, stream_ids and timezone (UTC when none was sent). Present even when data carries an error from a query that failed while running.
Example payload
{ "data": {}, "links": { "web": "https://app.honeybadger.io/projects/Xk9mZp" }, "meta": { "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b" }}Response schema5
| Field | Type | Description |
|---|---|---|
data required | object | The query result; its fields depend on the query. |
links required | object | Opens this query in Insights. |
links.web required | uri | The resource's page in the Honeybadger web UI, as an absolute URL. Resources without a page, such as outages and deploys, don't have links. For a project provisioned through Heroku, error, notice and comment links go through Heroku's single sign-on. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
Errors
6
401
Unauthorized
The credential is missing, invalid, expired or revoked (unauthorized), or was sent in a way v3 doesn’t accept (see the examples).
Example payload: unauthorized (Missing, malformed, expired or revoked credential)
{ "error": { "code": "unauthorized", "message": "Access denied" }, "meta": { "request_id": "abc123" }}Example payload: unsupported_auth_scheme (Sent as HTTP basic, which v3 does not accept)
{ "error": { "code": "unsupported_auth_scheme", "message": "Send the credential as `Authorization: Bearer <token>`; v3 does not accept HTTP basic" }, "meta": { "request_id": "abc123" }}Example payload: credential_in_query (Sent as the `auth_token` query parameter)
{ "error": { "code": "credential_in_query", "message": "Credentials must be sent in the Authorization header" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
403
Forbidden
The credential isn’t allowed to do this. error.code says why. An account or project the credential doesn’t cover is 404 not_found, not 403.
Example payload: access_denied (The credential isn't allowed to do this to this record)
{ "error": { "code": "access_denied", "message": "Access denied" }, "meta": { "request_id": "abc123" }}Example payload: insufficient_scope (The credential lacks the permission this endpoint requires)
{ "error": { "code": "insufficient_scope", "message": "Insufficient scope", "details": { "required_scope": "faults:write", "token_scopes": [ "faults:read", "insights:read" ] } }, "meta": { "request_id": "abc123" }}Example payload: requires_user_token (The endpoint records who acted, and an account token has nobody)
{ "error": { "code": "requires_user_token", "message": "This endpoint records the person who acted, so it requires a user credential rather than an account token" }, "meta": { "request_id": "abc123" }}Example payload: project_restricted (A project-restricted credential cannot create a project)
{ "error": { "code": "project_restricted", "message": "Project-restricted tokens cannot create projects" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
404
Not Found
Resource not found
Example payload
{ "error": { "code": "not_found", "message": "Resource not found" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
422
Unprocessable Content
The query was rejected. For a syntax or semantic error, error.message explains it and error may carry more keys. Also returned when query is missing or not a string, when stream_ids isn’t an array of strings, or when a stream ID isn’t one of the project’s.
Example payload
{ "error": {}, "meta": { "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b" }}Response schema3
| Field | Type | Description |
|---|---|---|
error required | object | |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
429
Too Many Requests
Rate limit exceeded. The limit is per credential owner per hour: a person’s tokens share one budget, and an account token uses the account’s. Wait Retry-After seconds and retry.
Example payload
{ "error": { "code": "rate_limit_exceeded", "message": "Rate limit exceeded" }, "meta": { "request_id": "abc123" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
503
Service Unavailable
Insights didn’t answer. Retry.
Example payload
{ "error": { "code": "unauthorized", "message": "Access denied", "details": [ { "field": "name", "message": "can't be blank" } ] }, "meta": { "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b" }}Response schema6
| Field | Type | Description |
|---|---|---|
error required | object | |
error.code required | string | Machine-readable code. Branch on this, not the message. Allowed values: unauthorized, unsupported_auth_scheme, credential_in_query, access_denied, insufficient_scope, requires_user_token, project_restricted, account_inactive, account_parked, feature_unavailable, not_found, validation_error, delete_failed, limit_reached, rate_limit_exceeded, concurrent_request, streams_provisioning, ingestion_key_not_accepted, maintenance_mode, invalid_parameter, forbidden_attributes, service_unavailable, ambiguous_account, fault_merged. |
error.message required | string | Human-readable explanation. |
error.details | array<object> | object | A list of {field, message} on validation_error and invalid_parameter, and on feature_unavailable or limit_reached when one field caused the refusal; {required_scope, token_scopes} on insufficient_scope; {merged_into, location} on fault_merged. Absent when there's nothing to add. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |