---
title: Get a notice
description: Returns a notice by its ID, without its project or fault in the path.
url: https://docs.honeybadger.io/api/v3/notices/get-notice/
---

API v3 is in preview

Endpoints and response shapes [can change before general availability](https://docs.honeybadger.io/api/v3/#preview). API v2 is unchanged.

GET `https://app.honeybadger.io/v3/notices/{uuid}`

[Required scope](https://docs.honeybadger.io/api/v3/authentication/#scopes) `faults:read`

Returns a notice by its ID, without its project or fault in the path.

Example request

```sh
curl "https://app.honeybadger.io/v3/notices/$UUID" \
  -H "Authorization: Bearer $HONEYBADGER_API_TOKEN"
```

## Parameters

### Path parameters

| Field | Type | Description |
| - | - | - |
| `uuid` required | uuid | Notice ID. |

### Query parameters

| Field | Type | Description |
| - | - | - |
| `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

### 200 Success

Example payload

```json
{
  "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": [
          {
            "first_line": 41,
            "lines": [
              "  def submit",
              "    charge!",
              "  end"
            ]
          }
        ]
      }
    ],
    "backtrace_mode": "source_mapped",
    "backtrace_total_frames": 25,
    "backtrace_truncated": true,
    "request_fields_removed": [
      "params"
    ],
    "links": {
      "web": "https://app.honeybadger.io/projects/Xk9mZp"
    }
  },
  "meta": {
    "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b"
  }
}
```

Response schema

| Field | Type | Description |
| - | - | - |
| `data` required | object | An individual error occurrence. |
| `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. |
| `meta` | object | |
| `meta.request_id` | string | Unique identifier for the request, for correlating with support. |

## Errors

### 400 Bad Request

A query parameter is malformed or outside its allowed values. `error.details` names the parameter.

Example payload

```json
{
  "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 schema

| 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)

```json
{
  "error": {
    "code": "unauthorized",
    "message": "Access denied"
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Example payload: unsupported\_auth\_scheme (Sent as HTTP basic, which v3 does not accept)

```json
{
  "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)

```json
{
  "error": {
    "code": "credential_in_query",
    "message": "Credentials must be sent in the Authorization header"
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Response schema

| 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)

```json
{
  "error": {
    "code": "access_denied",
    "message": "Access denied"
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Example payload: insufficient\_scope (The credential lacks the permission this endpoint requires)

```json
{
  "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)

```json
{
  "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)

```json
{
  "error": {
    "code": "project_restricted",
    "message": "Project-restricted tokens cannot create projects"
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Response schema

| 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

```json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found"
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Response schema

| 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

```json
{
  "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 schema

| 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. |

---

## Try Honeybadger for FREE

Intelligent logging, error tracking, and Just Enough APM™ in one dev-friendly platform. Find and fix problems before users notice.

[Start free trial](https://app.honeybadger.io/users/sign_up)

[See plans and pricing](https://www.honeybadger.io/plans/)
