---
title: "Create app"
method: POST
path: "/apps"
tags: ["apps"]
---

# Create app

`POST /apps`

## Request

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

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

## Request body

- CreateAppInfo: Information needed to create an app. Currently supports only Push-only apps (`CUSTOM`) and Custom Connector apps (`CUSTOM_CONNECTOR`).
  - `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`; 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` CreateCustomConnectorInfo: Information needed to create a Custom Connector app.
    - `identifier` string, required: The identifier of the Custom Connector.
    - `base_url` string, required: The base URL of the Custom Connector.
    - `signing_secret` string, required: The signing secret used to authenticate requests to the Custom Connector. Write-only; never returned by the API.
    - `tls_mode` boolean: Whether TLS verification is enabled. Defaults to `true` when omitted.
    - `tls_ca_cert_content` string, nullable: Optional PEM-encoded CA certificate content for TLS.
    - `supports_groups` boolean: Whether the Custom Connector supports groups. Defaults to `false`.
    - `supports_nested_resources` boolean: Whether the Custom Connector supports nested resources. Defaults to `false`.
    - `supports_nested_groups` boolean: Whether the Custom Connector supports nested groups. Defaults to `false`.
    - `supports_event_ingestion` boolean: Whether the Custom Connector supports event ingestion. Defaults to `false`.
    - `supports_idp` boolean: Whether the Custom Connector can be connected as an upstream user directory. Defaults to `false`.

## Response `200`

The app that was created.

- 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 `visibility` is `GLOBAL`, an unsupported `app_type`, or a missing/invalid `custom_connector` configuration.

## Changes

- **2026-11-04** `e7877ea96eab`: 8 breaking, 1 warning, 4 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`
  - …9 more
- **2026-10-28** `c54b1c07fcdb`: 1 warning, 1 info
  - added the new `ONELOGIN` enum value to the `app_type` response property for the response status `200`
  - added the new `ONELOGIN` enum value to the request property `app_type`
- **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, 3 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 new `BOX` enum value to the request property `app_type`
  - added the new `CALENDLY` enum value to the request property `app_type`
  - …1 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/opal/apis/opal-api/changes/apps/post.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)
