https://app.honeybadger.io/v3/projects/{project_id}/faults/{fault_id}/notices
faults:read
Returns a list of notices for a fault.
Example request
curl "https://app.honeybadger.io/v3/projects/$PROJECT_ID/faults/$FAULT_ID/notices" \ -H "Authorization: Bearer $HONEYBADGER_API_TOKEN"Parameters
6Path parameters
| Field | Type | Description |
|---|---|---|
project_id required | string | Project ID. |
fault_id required | string | Fault ID. |
Query parameters
| Field | Type | Description |
|---|---|---|
limit | integer | Maximum items to return. Values above 100 are treated as 100. Default: 25. Min 1, max 100. |
before | string | Cursor for fetching older items. |
after | string | Cursor for fetching newer items. |
unmapped | boolean | Return the backtrace as the client reported it instead of source-mapped. Accepts true/false, 1/0, yes/no, on/off. Default: false. |
Responses
2200 Success
Example payload
{ "data": [ { "id": "1e2ba1f0-4f3c-4b1a-9c7e-6f2f5c0f1a3b", "fault_id": "12345", "project_id": "Xk9mZp", "environment": "production", "message": "undefined method 'foo' for nil:NilClass", "created_at": "2026-01-01T00:00:00Z", "request": { "url": "https://shop.example.com/checkout", "component": "CheckoutController", "action": "create", "params": {}, "session": {} }, "context": {}, "backtrace": [ { "file": "app/models/checkout.rb", "line": 42, "column": 8, "method": "submit_order", "in_app": true, "mapping": "source_mapped", "source": [ null ] } ], "backtrace_mode": "source_mapped", "backtrace_total_frames": 25, "backtrace_truncated": true, "request_fields_removed": [ "params" ], "links": { "web": "https://app.honeybadger.io/projects/Xk9mZp" } } ], "pagination": { "limit": 25, "has_older": true, "has_newer": true, "oldest_cursor": "eyJ0IjoxNzA0MDY3MjAwLCJpIjoiTm04cFF4In0", "newest_cursor": "eyJ0IjoxNzA0MTUzNjAwLCJpIjoiWGs5bVpwIn0" }, "links": { "self": "/v3/projects/Xk9mZp/faults/12345/notices?limit=25", "older": "/v3/projects/Xk9mZp/faults/12345/notices?before=eyJ0IjoxNzA0MDY3MjAwMTIzNDU2LCJpIjoiRHAyeU5rIn0&limit=25", "newer": "/v3/projects/Xk9mZp/faults/12345/notices?after=eyJ0IjoxNzA0MTUzNjAwMTIzNDU2LCJpIjoiRHA4d1FzIn0&limit=25" }, "meta": { "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b" }}Response schema42
| Field | Type | Description |
|---|---|---|
data required | array<object> | |
data[].id required | uuid | The notice's ID, a UUID that addresses it without its project or fault. |
data[].fault_id required | string | ID of the fault this notice belongs to. |
data[].project_id required | string | ID of the project. |
data[].environment | string | null | Environment name: the fault's environment, or the one the notice reported when the fault has none. Null when neither is set. |
data[].message required | string | null | Error message. Null when the notifier reported none. |
data[].created_at required | date-time | When the notice was received. |
data[].request | object | null | Request details when the error occurred. Fields not reported are null. |
data[].request.url | string | null | Request URL. |
data[].request.component | string | null | Controller or component name. |
data[].request.action | string | null | Action name. |
data[].request.params | object | null | Request parameters. |
data[].request.session | object | null | Session data. |
data[].context | object | Custom context data sent with the notice. |
data[].backtrace | array<object> | Stack trace frames, at most 20. Source-mapped by default; pass unmapped=true for the frames exactly as the client sent them. |
data[].backtrace[].file | string | null | Path to the source file. Null when the notifier sent a backtrace entry that carried no file, or one that was not a frame at all. |
data[].backtrace[].line | integer | null | Line number within file. Null when the notifier sent a value that is not a line number, such as (eval). |
data[].backtrace[].column | integer | null | Column number. Usually present only on source-mapped frames. |
data[].backtrace[].method | string | null | Name of the method or function. Null when the notifier omitted it, and routinely on source-mapped frames where the map carries no name for the position. |
data[].backtrace[].in_app | boolean | Whether this frame is the project's own code rather than a framework, gem or dependency. Derived from the project root the notifier reported. |
data[].backtrace[].mapping | string | Whether this specific frame was resolved through a source map. Mapping is applied one frame at a time and falls back to the reported frame, so a source-mapped trace can contain reported frames. Always reported when unmapped=true was requested. Allowed values: source_mapped, reported. |
data[].backtrace[].source | array<object> | Contiguous runs of source lines around the frame. Normally one block; a notifier-sent snippet with a gap produces one block per run. Empty when no source is available, when the notifier sent it in a shape other than a map of line number to content, or when no entry carried a usable line number. At most 25 lines in total. |
data[].backtrace[].source[].first_line required | integer | Line number of the first entry in lines. |
data[].backtrace[].source[].lines required | array<string> | Source lines in order. Each line is truncated to 1024 characters. Across all of a frame's blocks at most 25 lines are returned, chosen nearest the frame's own line so that line is always present when the notifier sent it. |
data[].backtrace_mode | string | Which representation of the trace this response carries. source_mapped when a stored mapped trace was served, reported when the frames are as the client sent them — either because unmapped=true was requested or because no different mapped trace was stored. Allowed values: source_mapped, reported. |
data[].backtrace_total_frames | integer | Total frames in the selected trace before the 20-frame limit was applied. |
data[].backtrace_truncated | boolean | Whether backtrace omits frames because of the 20-frame limit. |
data[].request_fields_removed | array | null | Names of request fields removed at ingest because the payload exceeded the size limit. Null when nothing was removed. |
data[].links | object | Links into the Honeybadger web UI. |
data[].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. |
pagination | object | Pagination for a time-ordered collection. |
pagination.limit required | integer | Maximum items per page. Min 1, max 100. |
pagination.has_older required | boolean | Whether older items exist. When true, follow links.older. |
pagination.has_newer required | boolean | Whether newer items exist. When true, follow links.newer. |
pagination.oldest_cursor | string | null | Cursor for the oldest item on this page. Pass it back unchanged as before. Absent or null on collections that page on a timestamp rather than a cursor; use links.older instead. |
pagination.newest_cursor | string | null | Cursor for the newest item on this page. Pass it back unchanged as after. Absent or null on collections that page on a timestamp rather than a cursor, and on one-directional collections; use links.newer instead. |
links | object | Navigation links for a time-ordered collection. Each link is a root-relative path (/v3/...); resolve it against the API host. |
links.self required | uri-reference | This page. |
links.older | string | null | Page of older items, or null when none exist. |
links.newer | string | null | Page of newer items, or null when none exist. Always null on one-directional collections, which are documented as such. |
meta | object | |
meta.request_id | string | Unique identifier for the request, for correlating with support. |
301 This fault was merged into another fault.
Location is the same resource on the fault it was merged into: …/faults/<survivor> for the fault, or the same subresource path and query for occurrences, affected users and notices. Only reads redirect; writes get a 409 fault_merged.
Errors
5
400
Bad Request
A query parameter is malformed or outside its allowed values. error.details names the parameter.
Example payload
{ "error": { "code": "invalid_parameter", "message": "unmapped must be true or false", "details": [ { "field": "unmapped", "message": "must be true or false" } ] }, "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. |
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
No path names the account, so the API token has to. This is returned when the token covers more than one account and the account a request applies to cannot be determined. Use a token bound to a single account.
Example payload
{ "error": { "code": "ambiguous_account", "message": "This credential covers more than one account, so the account a request applies to is ambiguous. Use a token bound to a single account." }, "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. |