---
title: "Update app"
method: PUT
path: "/apps/{app_id}"
tags: ["apps"]
---

# Update app

`PUT /apps/{app_id}`

## Request

- Base URL: `https://api.opal.dev/v1`
- URL: `https://api.opal.dev/v1/apps/{app_id}`
- Auth: HTTP bearer

Updates an `App`. Currently supports only Push-only apps (`CUSTOM`) and
Custom Connector apps (`CUSTOM_CONNECTOR`).

## Path parameters

- `app_id` string, uuid, required

## Request body

- UpdateAppInfo: Information needed to update an app. Currently supports only Push-only apps (`CUSTOM`) and Custom Connector apps (`CUSTOM_CONNECTOR`).
  - `name` string: The updated name of the app.
  - `description` string: The updated description of the app.
  - `admin_owner_id` string, uuid: The updated ID of the owner of the app.
  - `visibility` 'GLOBAL' | 'LIMITED': The visibility level of the entity.
  - `visibility_group_ids` string[]: The IDs of groups that can see this app when visibility is `LIMITED`. Must be empty when the effective visibility is `GLOBAL` (either sent explicitly on this request or already stored on the app); the server returns `400` otherwise. Deprecated in favor of `PUT /v1/apps/{app_id}/visibility`.
  - `import_visibility` 'GLOBAL' | 'LIMITED': The visibility level of the entity.
  - `custom_connector` UpdateCustomConnectorInfo: Information needed to update a Custom Connector app. Omitted fields are left unchanged. Provide `signing_secret` only when rotating the secret.
    - `identifier` string: The identifier of the Custom Connector.
    - `base_url` string: The base URL of the Custom Connector.
    - `signing_secret` string: New signing secret. Write-only; never returned by the API. Omit to leave the existing secret unchanged.
    - `tls_mode` boolean: Whether TLS verification is enabled for the Custom Connector.
    - `tls_ca_cert_content` string, nullable: Optional PEM-encoded CA certificate content for TLS.
    - `supports_groups` boolean: Whether the Custom Connector supports groups.
    - `supports_nested_resources` boolean: Whether the Custom Connector supports nested resources.
    - `supports_nested_groups` boolean: Whether the Custom Connector supports nested groups.
    - `supports_event_ingestion` boolean: Whether the Custom Connector supports event ingestion.
    - `supports_idp` boolean: Whether the Custom Connector can be connected as an upstream user directory.

## Response `200`

The updated app.

- App: # App Object ### Description The `App` object is used to represent an app to an application. ### Usage Example List from the `GET Apps` endpoint.
  - `app_id` string, uuid, required: The ID of the app.
  - `name` string, required: The name of the app.
  - `description` string, required: A description of the app.
  - `admin_owner_id` string, uuid, required: The ID of the owner of the app.
  - `app_type` 'ACTIVE_DIRECTORY' | 'ANTHROPIC' | 'AZURE_AD' | 'AWS' | 'AWS_SSO' | 'CLICKHOUSE' | 'COUPA' | 'CURSOR' | 'CUSTOM' | 'CONFLUENCE' | 'CUSTOM_CONNECTOR' | 'DATABRICKS' | 'DATASTAX_ASTRA' | 'ALICLOUD' | 'DEVIN' | 'DOCUSIGN' | 'DUO' | 'GCP' | 'GIT_HUB' | 'GIT_LAB' | 'GOOGLE_GROUPS' | 'GOOGLE_WORKSPACE' | 'GRAFANA' | 'HUBSPOT' | 'ILEVEL' | 'INCIDENTIO' | 'JIRA' | 'LDAP' | 'LINEAR' | 'MARIADB' | 'MONGO' | 'MONGO_ATLAS' | 'MYSQL' | 'NETSUITE' | 'DATADOG' | 'OKTA_CIAM' | 'OKTA_DIRECTORY' | 'OPENAI_PLATFORM' | 'OPAL' | 'ORACLE_FUSION' | 'PAGERDUTY' | 'POSTGRES' | 'ROOTLY' | 'SALESFORCE' | 'SNOWFLAKE' | 'SLACK' | 'TABLEAU' | 'TAILSCALE' | 'TELEPORT' | 'TWINGATE' | 'VAULT' | 'WORKDAY' | 'ZENDESK' | 'ZOOM' | 'RAMP' | 'WRIKE' | 'VERCEL' | 'AXIOM' | 'ACTIVECAMPAIGN' | 'ASANA' | 'BITWARDEN' | 'BOX' | 'CALENDLY' | 'ONELOGIN' | 'SQUARE' | 'RIPPLING', required: The type of an app.
  - `visibility` 'GLOBAL' | 'LIMITED': The visibility level of the entity.
  - `visibility_group_ids` string[]: The IDs of groups that can see this app when visibility is `LIMITED`. Must be empty when visibility is `GLOBAL`.
  - `import_visibility` 'GLOBAL' | 'LIMITED': The visibility level of the entity.
  - `validations` AppValidation[]: Validation checks of an apps' configuration and permissions.
    - `key` string, required: The key of the app validation. These are not unique IDs between runs.
    - `name` string, required: The human-readable description of whether the validation has the permissions.
    - `usage_reason` string: The reason for needing the validation.
    - `details` string: Extra details regarding the validation. Could be an error message or restrictions on permissions.
    - `severity` 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW', required: The severity of an app validation.
    - `status` 'SUCCESS' | 'FAILED', required: The status of an app validation.
    - `updated_at` string, date-time, required: The date and time the app validation was last run.
  - `custom_connector` CustomConnectorAppConfig: Configuration for a Custom Connector app. Does not include the signing secret; secrets are write-only and never returned by the API.
    - `identifier` string, required: The identifier of the Custom Connector.
    - `base_url` string, required: The base URL of the Custom Connector.
    - `tls_mode` boolean, required: Whether TLS verification is enabled for the Custom Connector.
    - `tls_ca_cert_content` string, nullable: Optional PEM-encoded CA certificate content for TLS.
    - `supports_groups` boolean, required: Whether the Custom Connector supports groups.
    - `supports_nested_resources` boolean, required: Whether the Custom Connector supports nested resources.
    - `supports_nested_groups` boolean, required: Whether the Custom Connector supports nested groups.
    - `supports_event_ingestion` boolean, required: Whether the Custom Connector supports event ingestion.
    - `supports_idp` boolean, required: Whether the Custom Connector can be connected as an upstream user directory.

## Other responses

- `400`: Invalid request body — for example, `visibility_group_ids` is non-empty while the effective visibility is `GLOBAL` (either explicitly on this request or already stored on the app), or a `custom_connector` field is invalid for this app type.

## Changes

- **2026-11-04** `e7877ea96eab`: 8 breaking, 1 warning, 3 info
  - added `#/components/schemas/VisibilityTypeEnum` to the `import_visibility` request property `allOf` list
  - added `#/components/schemas/VisibilityTypeEnum` to the `visibility` request property `allOf` list
  - removed the enum value `GLOBAL` of the request property `import_visibility`
  - removed the enum value `GLOBAL` of the request property `visibility`
  - …8 more
- **2026-10-28** `c54b1c07fcdb`: 1 warning
  - added the new `ONELOGIN` enum value to the `app_type` response property for the response status `200`
- **2026-10-26** `33189b4d5538`: 2 info
  - added the new optional request property `custom_connector/supports_idp`
  - added the required property `custom_connector/supports_idp` to the response with the `200` status
- **2026-10-22** `8fce5da23873`: 2 warning, 1 info
  - added the new `BOX` enum value to the `app_type` response property for the response status `200`
  - added the new `CALENDLY` enum value to the `app_type` response property for the response status `200`
  - added the non-success response with the status `400`
- **2026-10-20** `c257c18a4ecb`: 1 warning
  - added the new `SQUARE` enum value to the `app_type` response property for the response status `200`

[Operation history](https://skmtc.dev/opal/apis/opal-api/changes/apps/:app_id/put.md)

---

[API](https://skmtc.dev/opal/apis/opal-api.md) - [All operations](https://skmtc.dev/opal/apis/opal-api/llms.txt) - [OpenAPI document](https://skmtc.dev/opal/apis/opal-api/revisions/e7877ea96eab?raw)
