Rename, disable or enable an integration
/api/v1/organizations/{id}/oauth-clients/{clientId}Changes an integration's name or is_active. Send If-Match with the integration's version to refuse a stale write (409 version_mismatch). A disabled integration is refused new tokens straight away; a token already issued lasts until it expires.
Authentication
Authorization Option A JWT access token. Never send alongside X-API-Key: a request carrying both is refused.
X-API-Key Option B API key for management-tier access. Never send alongside an Authorization header: a request carrying both is refused.
Path Parameters
idstring Required clientIdstring Required Headers
If-MatchOptimistic-lock version of the resource. Send the `version` field returned on read; the server rejects with 409 if the row has changed since.
Request body
application/json
namestring Optional is_activeboolean Optional `false` refuses it new tokens straight away; a token already issued lasts until it expires.
Responses
application/json
data *OrganizationIntegrationResponseDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
application/json
error *ApiErrorBodyDto
Errors
When the request can't be completed, the response body includes a stable error code you can branch on, and a correlation_id (also sent as the X-Correlation-Id header). Quote the correlation id when you contact support: it identifies the exact request in Canopy's logs.
organization.integrations_disabledForbiddenThe Environment does not let organizations create integrations: <code>organization_integrations_enabled</code> is off, which it is by default. Every route under <code>/api/v1/organizations/{org_id}/oauth-clients</code> answers this until the developer turns it on.
Turn on <strong>Let organizations create integrations</strong> on <strong>Tenant → Authentication → Tokens</strong> and choose <strong>Roles integrations may hold</strong>, or send <code>organization_integrations_enabled: true</code> with <code>organization_integration_role_ids</code> to the Environment's auth settings.
organization.integration_not_foundNot foundNo integration with that <code>client_id</code> belongs to the organization. A machine client the developer pinned to the organization is not one of its integrations and reads as not found here.
List the organization's integrations (<code>GET /api/v1/organizations/{org_id}/oauth-clients</code>) and use a <code>client_id</code> from there. Manage a developer's client on <code>/api/v1/oauth-clients</code>.
organization.integration_name_takenConflictAnother of the organization's integrations has this name. Names are compared without regard to case.
Choose another name.
version_mismatchConflictThe request sent <code>If-Match</code> with a version older than the resource's current one: somebody changed it since it was read. The error's <code>data</code> carries the resource as it now stands under <code>current</code>.
Read the resource again, show the reader what changed, and retry with the current <code>version</code>.
Returned object
curl -X PATCH "https://auth.canopy-io.com/api/v1/organizations/value/oauth-clients/value" \ -H "If-Match: "3"" \ -H "X-API-Key: $CANOPY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "is_active": false }'
{ "data": { "id": "string", "client_id": "string", "name": "string", "is_active": false, "organization_node_id": "string", "created_by_name": "string", "last_token_at": "2026-04-20T12:00:00.000Z", "previous_secret_expires_at": "2026-04-20T12:00:00.000Z", "secret_rotated_at": "2026-04-20T12:00:00.000Z", "version": 0, "created_at": "2026-04-20T12:00:00.000Z", "roles": [ { "id": "string", "identity_id": "string", "oauth_client_id": "string", "application_node_id": "string", "role_id": "string", "role_name": "string", "node_name": "string", "effective_from": "2026-04-20T12:00:00.000Z", "effective_to": "2026-04-20T12:00:00.000Z", "created_at": "2026-04-20T12:00:00.000Z", "updated_at": "2026-04-20T12:00:00.000Z", "version": 0 } ], "connection": { "token_endpoint": "string", "audience": "string", "token_lifetime_seconds": 0 } } }
Tell us how we can improve this guide.