---
title: Resolve faults
description: 'Marks faults as resolved. Name them with fault_ids, narrow them with q or a time filter, or pass "all": true to resolve every fault in the project.'
url: https://docs.honeybadger.io/api/v3/faults/resolve-faults/
---

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.

POST `https://app.honeybadger.io/v3/projects/{project_id}/faults/resolve`

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

Marks faults as resolved. Name them with `fault_ids`, narrow them with `q` or a time filter, or pass `"all": true` to resolve every fault in the project. The request must include one of these.

Example request

```sh
curl -X POST "https://app.honeybadger.io/v3/projects/$PROJECT_ID/faults/resolve" \
  -H "Authorization: Bearer $HONEYBADGER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "fault_ids": [
    "12345",
    "12346"
  ]
}'
```

## Parameters

### Path parameters

| Field | Type | Description |
| - | - | - |
| `project_id` required | string | Project ID. |

## Request body

Selects the faults a bulk operation applies to

| Field | Type | Description |
| - | - | - |
| `all` | boolean | Apply to every fault the other filters match, which with no other filters is every fault in the project. Required to make an unbounded change explicit; ignored when `fault_ids` names specific faults. |
| `dry_run` | boolean | Report what the request would change without changing it — no state change, no comments, no timeline entries. The response has the same shape either way, with `dry_run` echoed back. |
| `fault_ids` | array\<string> | IDs of the faults to change. If any ID isn't a fault in this project, nothing changes. Omit to act on everything the query and time filters match; with no filters, that requires `"all": true`. |
| `q` | string | Search query, in the syntax of the web UI's error search, applied when `fault_ids` is left out. See [Error search](https://docs.honeybadger.io/guides/errors/search/) for the syntax and filters. |
| `created_after` | number | Only faults created after this Unix timestamp. Applied when `fault_ids` is omitted, alongside q. |
| `occurred_after` | number | Only faults that occurred after this Unix timestamp. Applied when `fault_ids` is omitted, alongside `q`. |
| `occurred_before` | number | Only faults that occurred before this Unix timestamp. Applied when `fault_ids` is omitted, alongside `q`. |

## Responses

### 200 Applied, or reported without applying when `dry_run` was set.

The body says how many faults changed and names them.

Example payload

```json
{
  "data": {
    "count": 12,
    "dry_run": false,
    "fault_ids": [
      "12345",
      "12346"
    ],
    "fault_ids_truncated": false
  },
  "meta": {
    "request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b"
  }
}
```

Response schema

| Field | Type | Description |
| - | - | - |
| `data` required | object | |
| `data.count` required | integer | How many faults changed. Exact, and counts what changed rather than what matched: resolving a hundred faults of which ninety were already resolved reports ten. On a dry run, how many would have changed. |
| `data.dry_run` required | boolean | True when nothing was written. Echoed back so a response is never ambiguous about whether it took effect. |
| `data.fault_ids` required | array\<string> | IDs of the faults that changed, capped at 100. `count` is exact regardless; see `fault_ids_truncated`. |
| `data.fault_ids_truncated` | boolean | True when more faults changed than `fault_ids` lists. |
| `meta` | object | |
| `meta.request_id` | string | Unique identifier for the request, for correlating with support. |

## Errors

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

The request was refused and nothing was changed. `error.code` and `error.details` say why — see the examples below.

Example payload: missing\_selection (The body named no faults)

```json
{
  "error": {
    "code": "validation_error",
    "message": "Name the faults to change with fault_ids, narrow them with a filter, or pass all=true to change every fault in the project.",
    "details": [
      {
        "field": "fault_ids",
        "message": "required unless a filter or all=true is given"
      }
    ]
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Example payload: unrecognised\_filter (q contained a filter that matches nothing)

```json
{
  "error": {
    "code": "validation_error",
    "message": "Unrecognised search filters: is:unresolved. They match nothing, so this would have applied to every fault the rest of the query matched.",
    "details": [
      {
        "field": "q",
        "message": "unrecognised filter is:unresolved"
      }
    ]
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Example payload: unknown\_fault\_ids (\`fault\_ids\` named a fault that isn't in this project)

```json
{
  "error": {
    "code": "validation_error",
    "message": "fault_ids has unknown ids: 99999",
    "details": [
      {
        "field": "fault_ids",
        "message": "has unknown ids: 99999"
      }
    ]
  },
  "meta": {
    "request_id": "abc123"
  }
}
```

Example payload: ambiguous\_account (\`assignee:me\` in q, from a credential that covers more than one account)

```json
{
  "error": {
    "code": "ambiguous_account",
    "message": "This credential covers more than one account, so \"me\" is ambiguous."
  },
  "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/)
