Skip to content

Update an integration

View Markdown
PATCH https://app.honeybadger.io/v3/projects/{project_id}/integrations/{integration_id}
Required scope integrations:write

Updates an integration’s settings. A successful update also clears error, so an active integration starts delivering again.

Example request
Terminal window
curl -X PATCH "https://app.honeybadger.io/v3/projects/$PROJECT_ID/integrations/$INTEGRATION_ID" \
-H "Authorization: Bearer $HONEYBADGER_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"active": false
}'

Parameters

2

Path parameters

FieldTypeDescription
project_id requiredstringProject ID.
integration_id requiredstringIntegration ID.

Request body

Fields to change on an integration. Omitted fields are left as they are. type can’t be changed. Read-only fields are ignored. Type-specific settings go under config, listed per type in Integration types.

FieldTypeDescription
activebooleanWhether to use the integration. An OAuth integration that's active sends nothing until someone connects it in the web UI at links.web.
eventsarray | nullEvents this integration notifies on. On create, defaults to the type's default events. Null resets it to the type's defaults. A set; order is ignored and duplicates are dropped. up and down need uptime monitoring, rate_exceeded escalation, and volume_spike anomaly detection on the plan; the defaults leave them out on plans without them. Allowed values: occurred, rate_exceeded, assigned, resolved, unresolved, commented, deployed, up, down, cert_will_expire, flooded, check_in_missing, check_in_reporting, alarm_alert, alarm_ok, volume_spike.
ratestring | nullPeriod the rate_exceeded threshold counts over. Null resets it to wday. Period the rate_exceeded threshold counts over: min a minute, hour an hour, wday a day (24 hours, not a weekday), week a week. Allowed values: min, hour, wday, week. Default: "wday".
thresholdinteger | nullNumber of occurrences before rate_exceeded fires. Null resets it to 100. Default: 100.
notification_limitinteger | nullMaximum notifications in a 10-minute window before flood control. Null removes the limit.
site_idsarray | nullSites whose up and down events this integration receives. null follows every site in the project, including ones added later; a create that leaves it out does the same. [] follows none, and a list follows just those sites. A set; order is ignored and duplicates are dropped.
check_in_idsarray | nullCheck-ins whose events this integration receives. null follows every check-in in the project, including ones added later; a create that leaves it out does the same. [] follows none, and a list follows just those check-ins. A set; order is ignored and duplicates are dropped.
alarm_alert_idsarray | nullIDs of alarms whose alert events this integration receives. Null or empty clears it. A set; order is ignored and duplicates are dropped.
alarm_ok_idsarray | nullIDs of alarms whose recovery events this integration receives. Null or empty clears it. A set; order is ignored and duplicates are dropped.
excluded_environmentsarray | nullErrors from these environments never notify through this integration. Takes precedence over included_environments. An environment can be excluded before it first reports. Null or empty clears it. Changing it requires environment settings on the plan. A set; order is ignored and duplicates are dropped.
included_environmentsarray | nullWhen non-empty, only errors from these environments notify through this integration, including environments that haven't reported yet. Empty means every environment not excluded. Null or empty clears it. Changing it requires environment settings on the plan. A set; order is ignored and duplicates are dropped.
filtersarray | nullAn ordered list. Each event that has a filter notifies only for errors matching its query. Replaces the stored filters; null or empty clears them. Changing it requires integration filters on the plan.
filters[].event requiredstringAn event a filter applies to, or all for every event. Allowed values: occurred, rate_exceeded, assigned, resolved, unresolved, commented, deployed, up, down, cert_will_expire, flooded, check_in_missing, check_in_reporting, alarm_alert, alarm_ok, volume_spike, all.
filters[].query requiredstringAn error search query, as in the Errors search box. Min length 1.
configobjectType-specific settings, listed per type in Integration types. Merged into the stored settings: a key left out keeps its value; a key sent as null is cleared, or reset to its default. Secrets are never returned; leave them out to keep them.

Responses

1

200 Success

Example payload
{
"data": {
"id": "Ch9wLp",
"project_id": "Xk9mZp",
"type": "Slack",
"active": true,
"events": [
"occurred",
"resolved",
"assigned"
],
"site_ids": null,
"check_in_ids": null,
"excluded_environments": [
"development"
],
"included_environments": [],
"filters": [
{
"event": "occurred",
"query": "environment:production"
}
],
"alarm_alert_ids": [],
"alarm_ok_ids": [],
"threshold": 100,
"rate": "min",
"notification_limit": null,
"connected": true,
"config": {},
"error": true,
"error_reason": "The webhook URL returned 410 Gone",
"created_at": "2026-01-01T00:00:00Z",
"links": {
"web": "https://app.honeybadger.io/projects/Xk9mZp"
}
},
"meta": {
"request_id": "6f1c2b0e-8d4a-4f6e-9b2a-3c5d7e9f1a2b"
}
}
Response schema27
FieldTypeDescription
data requiredobjectA notification integration.
data.id requiredstring
data.project_id requiredstringID of the project this integration belongs to.
data.type requiredstringIntegration type.
data.active requiredbooleanWhether to use the integration. An OAuth integration that isn't connected sends nothing until it is.
data.events requiredarray<string>Events this integration notifies on.
data.site_ids requiredarray | nullSites whose up and down events this integration receives. null means every site in the project, including ones added later.
data.check_in_ids requiredarray | nullCheck-ins whose events this integration receives. null means every check-in in the project, including ones added later.
data.excluded_environments requiredarray<string>Errors from these environments never notify through this integration. Takes precedence over included_environments.
data.included_environments requiredarray<string>When non-empty, only errors from these environments notify through this integration.
data.filters requiredarray<object>An ordered list. Each event that has a filter notifies only for errors matching its query.
data.filters[].event requiredstringAn event a filter applies to, or all for every event. Allowed values: occurred, rate_exceeded, assigned, resolved, unresolved, commented, deployed, up, down, cert_will_expire, flooded, check_in_missing, check_in_reporting, alarm_alert, alarm_ok, volume_spike, all.
data.filters[].query requiredstringAn error search query, as in the Errors search box. Min length 1.
data.alarm_alert_ids requiredarray<string>IDs of alarms whose alert events this integration receives.
data.alarm_ok_ids requiredarray<string>IDs of alarms whose recovery events this integration receives.
data.threshold requiredintegerOccurrence threshold before rate_exceeded fires.
data.rate requiredstringPeriod the rate_exceeded threshold counts over: min a minute, hour an hour, wday a day (24 hours, not a weekday), week a week. Allowed values: min, hour, wday, week.
data.notification_limit requiredinteger | nullMaximum notifications in a 10-minute window before flood control.
data.connectedbooleanPresent on OAuth integrations (Slack, GitHub, GitLab, Bitbucket, Jira Cloud, Asana, Intercom and the like) and WebSocket integrations. On an OAuth integration it says whether the integration is authenticated, which someone does in the web UI at links.web. Separate from active: an active integration that isn't connected sends nothing until it is, and connecting doesn't change active. GitHub authenticates through the GitHub App: the app is installed on the repo, and the installation is attached when someone with access to it saves the integration. A creator who signed in to Honeybadger with GitHub is connected on create. On a WebSocket integration it says whether a client checked in within the last two minutes.
data.config requiredobjectThe type's settings, one IntegrationConfig<Type> per type. Unset settings are null. Write-only secrets are never returned. Other settings are, including webhook URLs, which can contain credentials.
data.errorbooleanSet when a delivery fails in a way that stops the integration; error_reason says why. The integration sends nothing while it's set. A successful update clears it.
data.error_reasonstringReason for the error state, if any.
data.created_at requireddate-timeWhen the integration was created.
data.links requiredobjectLinks into the Honeybadger web UI.
data.links.web requireduriThe 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.
metaobject
meta.request_idstringUnique identifier for the request, for correlating with support.

Errors

4

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
FieldTypeDescription
error requiredobject
error.code requiredstringMachine-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 requiredstringHuman-readable explanation.
error.detailsarray<object> | objectA 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.
metaobject
meta.request_idstringUnique 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
FieldTypeDescription
error requiredobject
error.code requiredstringMachine-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 requiredstringHuman-readable explanation.
error.detailsarray<object> | objectA 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.
metaobject
meta.request_idstringUnique 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
FieldTypeDescription
error requiredobject
error.code requiredstringMachine-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 requiredstringHuman-readable explanation.
error.detailsarray<object> | objectA 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.
metaobject
meta.request_idstringUnique identifier for the request, for correlating with support.

422 Unprocessable Content

Validation error

Example payload
{
"error": {
"code": "validation_error",
"message": "Name can't be blank",
"details": [
{
"field": "name",
"message": "can't be blank"
}
]
},
"meta": {
"request_id": "abc123"
}
}
Response schema6
FieldTypeDescription
error requiredobject
error.code requiredstringMachine-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 requiredstringHuman-readable explanation.
error.detailsarray<object> | objectA 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.
metaobject
meta.request_idstringUnique identifier for the request, for correlating with support.