# Connect apps service

Service for creating and managing Connect Apps

OpenAPI file: [`nominal.connect.v1.json`](https://dev.nominal.io/api/_downloads/12d94d4c23e4abbe527502d4c7f7f7db/nominal.connect.v1.json)

## Endpoints

### Create connect app

POST `/connect/v1/apps`

Create a new Connect App, either with a bundle file or as an empty app

Body

`displayName` string
:   separate from the bundle title to allow for creating empty apps At least 1 character.

`description` string
:   ​

`labels` array of string
:   ​

`properties` map of string to string
:   ​

`isPublished` boolean
:   ​

`workspace` string
:   ​

`bundle` [`ConnectAppBundle`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundle)
:   optional to allow for creating “empty” in-progress connect apps

    Fields of `ConnectAppBundle`

    `s3Path` [`Handle`](https://dev.nominal.io/api/rest/connect-apps-service.md#handle)
    :   ​

        Fields of `Handle`

        `s3` string
        :   ​

    `metadata` [`ConnectAppBundleMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundlemetadata)
    :   ​

        Fields of `ConnectAppBundleMetadata`

        `title` string
        :   ​

        `containsExperimentalFeatures` boolean
        :   ​

        `sha256Checksum` string
        :   ​

        `connectFilePath` string
        :   name of the .connect file inside the bundle. Will default to app.connect

`commitMessage` string
:   ​

Response

`app` [`ConnectApp`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectapp)
:   ​

    Fields of `ConnectApp`

    `rid` string
    :   ​

    `commit` string
    :   ​

    `metadata` [`ConnectAppMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappmetadata)
    :   ​

        Fields of `ConnectAppMetadata`

        `rid` string
        :   ​

        `displayName` string
        :   ​

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `isArchived` boolean
        :   ​

        `isPublished` boolean
        :   ​

        `createdAt` string (date-time)
        :   ​

        `createdBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `workspace` string
        :   ​

    `bundle` [`ConnectAppBundle`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundle)
    :   ​

        Fields of `ConnectAppBundle`

        `s3Path` [`Handle`](https://dev.nominal.io/api/rest/connect-apps-service.md#handle)
        :   ​

            Fields of `Handle`

            `s3` string
            :   ​

        `metadata` [`ConnectAppBundleMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundlemetadata)
        :   ​

            Fields of `ConnectAppBundleMetadata`

            `title` string
            :   ​

            `containsExperimentalFeatures` boolean
            :   ​

            `sha256Checksum` string
            :   ​

            `connectFilePath` string
            :   name of the .connect file inside the bundle. Will default to app.connect

    `versionNumber` string (uint64)
    :   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/connect/v1/apps" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "displayName": "<display name>",
  "description": "<description>",
  "labels": [
    "<labels>"
  ],
  "properties": {
    "<key>": "<value>"
  },
  "isPublished": true,
  "workspace": "<workspace>",
  "bundle": {
    "s3Path": {
      "s3": "<s3>"
    },
    "metadata": {
      "title": "<title>",
      "containsExperimentalFeatures": true,
      "sha256Checksum": "<sha256 checksum>",
      "connectFilePath": "<connect file path>"
    }
  },
  "commitMessage": "<commit message>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/connect/v1/apps",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "displayName": "<display name>",
        "description": "<description>",
        "labels": ["<labels>"],
        "properties": {"<key>": "<value>"},
        "isPublished": True,
        "workspace": "<workspace>",
        "bundle": {
            "s3Path": {"s3": "<s3>"},
            "metadata": {
                "title": "<title>",
                "containsExperimentalFeatures": True,
                "sha256Checksum": "<sha256 checksum>",
                "connectFilePath": "<connect file path>",
            },
        },
        "commitMessage": "<commit message>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/connect/v1/apps",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "displayName": "<display name>",
        "description": "<description>",
        "labels": ["<labels>"],
        "properties": {"<key>": "<value>"},
        "isPublished": True,
        "workspace": "<workspace>",
        "bundle": {
            "s3Path": {"s3": "<s3>"},
            "metadata": {
                "title": "<title>",
                "containsExperimentalFeatures": True,
                "sha256Checksum": "<sha256 checksum>",
                "connectFilePath": "<connect file path>",
            },
        },
        "commitMessage": "<commit message>",
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/connect/v1/apps",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "displayName": "<display name>",
                "description": "<description>",
                "labels": ["<labels>"],
                "properties": {"<key>": "<value>"},
                "isPublished": True,
                "workspace": "<workspace>",
                "bundle": {
                    "s3Path": {"s3": "<s3>"},
                    "metadata": {
                        "title": "<title>",
                        "containsExperimentalFeatures": True,
                        "sha256Checksum": "<sha256 checksum>",
                        "connectFilePath": "<connect file path>",
                    },
                },
                "commitMessage": "<commit message>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "app": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "displayName": "<display name>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "workspace": "<workspace>"
    },
    "bundle": {
      "s3Path": {
        "s3": "<s3>"
      },
      "metadata": {
        "title": "<title>",
        "containsExperimentalFeatures": true,
        "sha256Checksum": "<sha256 checksum>",
        "connectFilePath": "<connect file path>"
      }
    },
    "versionNumber": "1"
  }
}
```

### Archive connect apps

POST `/connect/v1/apps/archive`

Archive Connect Apps

Body

`rids` array of string
:   ​

Response

`rids` array of string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/connect/v1/apps/archive" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "rids": [
    "<rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/connect/v1/apps/archive",
            headers={"Authorization": "Bearer <api key>"},
            json={"rids": ["<rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rids": [
    "<rids>"
  ]
}
```

### Search connect apps

POST `/connect/v1/apps/search`

Searches for Connect Apps, returning paged results. Workspaces the caller lacks workspace:view on are filtered out rather than failing the call.

Body

`query` [`ConnectAppSearchQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchquery)
:   ​

    Fields of `ConnectAppSearchQuery`

    one of 7 fields required
    :   ​

        **searchText**

        `searchText` string
        :   ​

        **label**

        `label` string
        :   ​

        **property**

        `property` [`Property`](https://dev.nominal.io/api/rest/connect-apps-service.md#property)
        :   ​

            Fields of `Property`

            `name` string
            :   ​

            `value` string
            :   ​

        **and**

        `and` [`ConnectAppSearchAndQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchandquery)
        :   ​

            Fields of `ConnectAppSearchAndQuery`

            `queries` array of [`ConnectAppSearchQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchquery)
            :   ​

        **or**

        `or` [`ConnectAppSearchOrQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchorquery)
        :   ​

            Fields of `ConnectAppSearchOrQuery`

            `queries` array of [`ConnectAppSearchQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchquery)
            :   ​

        **workspace**

        `workspace` string
        :   ​

        **isArchived**

        `isArchived` boolean
        :   ​

`options` [`SearchConnectAppsOptions`](https://dev.nominal.io/api/rest/connect-apps-service.md#searchconnectappsoptions)
:   ​

    Fields of `SearchConnectAppsOptions`

    `isDescending` boolean
    :   default is true

    `sortField` [`SearchConnectAppsSortField`](https://dev.nominal.io/api/rest/connect-apps-service.md#searchconnectappssortfield)
    :   default is title

        Values of `SearchConnectAppsSortField`

        `SEARCH_CONNECT_APPS_SORT_FIELD_UNSPECIFIED`
        :   ​

        `SEARCH_CONNECT_APPS_SORT_FIELD_TITLE`
        :   ​

        `SEARCH_CONNECT_APPS_SORT_FIELD_CREATED_AT`
        :   ​

        `SEARCH_CONNECT_APPS_SORT_FIELD_DISPLAY_NAME`
        :   ​

`pageSize` integer
:   From 1 to 1,000.

`nextPageToken` string
:   ​

Response

`appMetadata` array of [`ConnectAppMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappmetadata)
:   ​

    Fields of `ConnectAppMetadata`

    `rid` string
    :   ​

    `displayName` string
    :   ​

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `isArchived` boolean
    :   ​

    `isPublished` boolean
    :   ​

    `createdAt` string (date-time)
    :   ​

    `createdBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `workspace` string
    :   ​

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/connect/v1/apps/search" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "query": {
    "searchText": "<search text>"
  },
  "options": {
    "isDescending": true,
    "sortField": "SEARCH_CONNECT_APPS_SORT_FIELD_TITLE"
  },
  "pageSize": 1,
  "nextPageToken": "<next page token>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "query": {"searchText": "<search text>"},
        "options": {
            "isDescending": True,
            "sortField": "SEARCH_CONNECT_APPS_SORT_FIELD_TITLE",
        },
        "pageSize": 1,
        "nextPageToken": "<next page token>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "query": {"searchText": "<search text>"},
        "options": {
            "isDescending": True,
            "sortField": "SEARCH_CONNECT_APPS_SORT_FIELD_TITLE",
        },
        "pageSize": 1,
        "nextPageToken": "<next page token>",
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/connect/v1/apps/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "query": {"searchText": "<search text>"},
                "options": {
                    "isDescending": True,
                    "sortField": "SEARCH_CONNECT_APPS_SORT_FIELD_TITLE",
                },
                "pageSize": 1,
                "nextPageToken": "<next page token>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "appMetadata": [
    {
      "rid": "<rid>",
      "displayName": "<display name>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "workspace": "<workspace>"
    }
  ],
  "nextPageToken": "<next page token>"
}
```

### Unarchive connect apps

POST `/connect/v1/apps/unarchive`

Unarchive Connect Apps

Body

`rids` array of string
:   ​

Response

`rids` array of string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/connect/v1/apps/unarchive" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "rids": [
    "<rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/connect/v1/apps/unarchive",
            headers={"Authorization": "Bearer <api key>"},
            json={"rids": ["<rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rids": [
    "<rids>"
  ]
}
```

### Get connect app

GET `/connect/v1/apps/{rid}`

Get a Connect App by its RID

Path parameters

`rid` string required
:   ​

Query parameters

`branchOrCommit.branch` string
:   ​

`branchOrCommit.commit` string
:   ​

Response

`app` [`ConnectApp`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectapp)
:   ​

    Fields of `ConnectApp`

    `rid` string
    :   ​

    `commit` string
    :   ​

    `metadata` [`ConnectAppMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappmetadata)
    :   ​

        Fields of `ConnectAppMetadata`

        `rid` string
        :   ​

        `displayName` string
        :   ​

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `isArchived` boolean
        :   ​

        `isPublished` boolean
        :   ​

        `createdAt` string (date-time)
        :   ​

        `createdBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `workspace` string
        :   ​

    `bundle` [`ConnectAppBundle`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundle)
    :   ​

        Fields of `ConnectAppBundle`

        `s3Path` [`Handle`](https://dev.nominal.io/api/rest/connect-apps-service.md#handle)
        :   ​

            Fields of `Handle`

            `s3` string
            :   ​

        `metadata` [`ConnectAppBundleMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundlemetadata)
        :   ​

            Fields of `ConnectAppBundleMetadata`

            `title` string
            :   ​

            `containsExperimentalFeatures` boolean
            :   ​

            `sha256Checksum` string
            :   ​

            `connectFilePath` string
            :   name of the .connect file inside the bundle. Will default to app.connect

    `versionNumber` string (uint64)
    :   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/connect/v1/apps/<rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/connect/v1/apps/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "app": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "displayName": "<display name>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "workspace": "<workspace>"
    },
    "bundle": {
      "s3Path": {
        "s3": "<s3>"
      },
      "metadata": {
        "title": "<title>",
        "containsExperimentalFeatures": true,
        "sha256Checksum": "<sha256 checksum>",
        "connectFilePath": "<connect file path>"
      }
    },
    "versionNumber": "1"
  }
}
```

### Get connect app bundle download URL

GET `/connect/v1/apps/{rid}/bundle-download`

Get a pre-signed URL for downloading the bundle of a Connect App at a specific commit or the latest commit on the main branch

Path parameters

`rid` string required
:   ​

Query parameters

`branchOrCommit.branch` string
:   ​

`branchOrCommit.commit` string
:   ​

Response

`url` string
:   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/bundle-download" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/bundle-download",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/bundle-download",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/bundle-download",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "url": "<url>"
}
```

### Commit

POST `/connect/v1/apps/{rid}/commit`

Commit a bundle to the main branch

Path parameters

`rid` string required
:   ​

Body

`bundle` [`ConnectAppBundle`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundle)
:   ​

    Fields of `ConnectAppBundle`

    `s3Path` [`Handle`](https://dev.nominal.io/api/rest/connect-apps-service.md#handle)
    :   ​

        Fields of `Handle`

        `s3` string
        :   ​

    `metadata` [`ConnectAppBundleMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundlemetadata)
    :   ​

        Fields of `ConnectAppBundleMetadata`

        `title` string
        :   ​

        `containsExperimentalFeatures` boolean
        :   ​

        `sha256Checksum` string
        :   ​

        `connectFilePath` string
        :   name of the .connect file inside the bundle. Will default to app.connect

`message` string
:   ​

Response

`app` [`ConnectApp`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectapp)
:   ​

    Fields of `ConnectApp`

    `rid` string
    :   ​

    `commit` string
    :   ​

    `metadata` [`ConnectAppMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappmetadata)
    :   ​

        Fields of `ConnectAppMetadata`

        `rid` string
        :   ​

        `displayName` string
        :   ​

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `isArchived` boolean
        :   ​

        `isPublished` boolean
        :   ​

        `createdAt` string (date-time)
        :   ​

        `createdBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `workspace` string
        :   ​

    `bundle` [`ConnectAppBundle`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundle)
    :   ​

        Fields of `ConnectAppBundle`

        `s3Path` [`Handle`](https://dev.nominal.io/api/rest/connect-apps-service.md#handle)
        :   ​

            Fields of `Handle`

            `s3` string
            :   ​

        `metadata` [`ConnectAppBundleMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundlemetadata)
        :   ​

            Fields of `ConnectAppBundleMetadata`

            `title` string
            :   ​

            `containsExperimentalFeatures` boolean
            :   ​

            `sha256Checksum` string
            :   ​

            `connectFilePath` string
            :   name of the .connect file inside the bundle. Will default to app.connect

    `versionNumber` string (uint64)
    :   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/commit" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "bundle": {
    "s3Path": {
      "s3": "<s3>"
    },
    "metadata": {
      "title": "<title>",
      "containsExperimentalFeatures": true,
      "sha256Checksum": "<sha256 checksum>",
      "connectFilePath": "<connect file path>"
    }
  },
  "message": "<message>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/commit",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "bundle": {
            "s3Path": {"s3": "<s3>"},
            "metadata": {
                "title": "<title>",
                "containsExperimentalFeatures": True,
                "sha256Checksum": "<sha256 checksum>",
                "connectFilePath": "<connect file path>",
            },
        },
        "message": "<message>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/commit",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "bundle": {
            "s3Path": {"s3": "<s3>"},
            "metadata": {
                "title": "<title>",
                "containsExperimentalFeatures": True,
                "sha256Checksum": "<sha256 checksum>",
                "connectFilePath": "<connect file path>",
            },
        },
        "message": "<message>",
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/commit",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "bundle": {
                    "s3Path": {"s3": "<s3>"},
                    "metadata": {
                        "title": "<title>",
                        "containsExperimentalFeatures": True,
                        "sha256Checksum": "<sha256 checksum>",
                        "connectFilePath": "<connect file path>",
                    },
                },
                "message": "<message>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "app": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "displayName": "<display name>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "workspace": "<workspace>"
    },
    "bundle": {
      "s3Path": {
        "s3": "<s3>"
      },
      "metadata": {
        "title": "<title>",
        "containsExperimentalFeatures": true,
        "sha256Checksum": "<sha256 checksum>",
        "connectFilePath": "<connect file path>"
      }
    },
    "versionNumber": "1"
  }
}
```

### Update connect app metadata

PUT `/connect/v1/apps/{rid}/metadata`

Update metadata fields of a Connect App

Path parameters

`rid` string required
:   ​

Body

`displayName` string
:   ​

`description` string
:   ​

`labels` [`LabelUpdateWrapper`](https://dev.nominal.io/api/rest/connect-apps-service.md#labelupdatewrapper)
:   ​

    Fields of `LabelUpdateWrapper`

    `labels` array of string
    :   ​

`properties` [`PropertyUpdateWrapper`](https://dev.nominal.io/api/rest/connect-apps-service.md#propertyupdatewrapper)
:   ​

    Fields of `PropertyUpdateWrapper`

    `properties` map of string to string
    :   ​

`isArchived` boolean
:   ​

`isPublished` boolean
:   ​

Response

`appMetadata` [`ConnectAppMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappmetadata)
:   ​

    Fields of `ConnectAppMetadata`

    `rid` string
    :   ​

    `displayName` string
    :   ​

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `isArchived` boolean
    :   ​

    `isPublished` boolean
    :   ​

    `createdAt` string (date-time)
    :   ​

    `createdBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `workspace` string
    :   ​

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/metadata" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "displayName": "<display name>",
  "description": "<description>",
  "labels": {
    "labels": [
      "<labels>"
    ]
  },
  "properties": {
    "properties": {
      "<key>": "<value>"
    }
  },
  "isArchived": true,
  "isPublished": true
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "displayName": "<display name>",
        "description": "<description>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
        "isArchived": True,
        "isPublished": True,
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "displayName": "<display name>",
        "description": "<description>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
        "isArchived": True,
        "isPublished": True,
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/connect/v1/apps/<rid>/metadata",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "displayName": "<display name>",
                "description": "<description>",
                "labels": {"labels": ["<labels>"]},
                "properties": {"properties": {"<key>": "<value>"}},
                "isArchived": True,
                "isPublished": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "appMetadata": {
    "rid": "<rid>",
    "displayName": "<display name>",
    "description": "<description>",
    "labels": [
      "<labels>"
    ],
    "properties": {
      "<key>": "<value>"
    },
    "isArchived": true,
    "isPublished": true,
    "createdAt": "2026-01-01T00:00:00Z",
    "createdBy": "<created by>",
    "updatedAt": "2026-01-01T00:00:00Z",
    "workspace": "<workspace>"
  }
}
```

## Errors

[Errors](https://dev.nominal.io/api.md#errors) shows how these errors are sent.

Each error’s `errorName` is `NominalConnectV1:` followed by its name below.

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `ConnectAppsServiceErrorCannotCommitToArchivedConnectApp` | Cannot commit to an archived connect app |
| 400 | `ConnectAppsServiceErrorInvalidSearchToken` | Invalid search token |
| 404 | `ConnectAppsServiceErrorAppNotFound` | Connect app not found |
| 404 | `ConnectAppsServiceErrorCommitNotFound` | Connect app commit not found |
| 404 | `ConnectAppsServiceErrorMissingBundle` | Connect app bundle is missing in this commit |

## Types

### ConnectApp

`rid` string
:   ​

`commit` string
:   ​

`metadata` [`ConnectAppMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappmetadata)
:   ​

`bundle` [`ConnectAppBundle`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundle)
:   ​

`versionNumber` string (uint64)
:   ​

### ConnectAppBundle

`s3Path` [`Handle`](https://dev.nominal.io/api/rest/connect-apps-service.md#handle)
:   ​

`metadata` [`ConnectAppBundleMetadata`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappbundlemetadata)
:   ​

### ConnectAppBundleMetadata

wrapper message for metadata that will probably be extended in the future

`title` string
:   ​

`containsExperimentalFeatures` boolean
:   ​

`sha256Checksum` string
:   ​

`connectFilePath` string
:   name of the .connect file inside the bundle. Will default to app.connect

### ConnectAppMetadata

`rid` string
:   ​

`displayName` string
:   ​

`description` string
:   ​

`labels` array of string
:   ​

`properties` map of string to string
:   ​

`isArchived` boolean
:   ​

`isPublished` boolean
:   ​

`createdAt` string (date-time)
:   ​

`createdBy` string
:   ​

`updatedAt` string (date-time)
:   ​

`workspace` string
:   ​

### ConnectAppSearchAndQuery

`queries` array of [`ConnectAppSearchQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchquery)
:   ​

### ConnectAppSearchOrQuery

`queries` array of [`ConnectAppSearchQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchquery)
:   ​

### ConnectAppSearchQuery

Set exactly one of the fields below.

one of 7 fields required
:   ​

    **searchText**

    `searchText` string
    :   ​

    **label**

    `label` string
    :   ​

    **property**

    `property` [`Property`](https://dev.nominal.io/api/rest/connect-apps-service.md#property)
    :   ​

    **and**

    `and` [`ConnectAppSearchAndQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchandquery)
    :   ​

    **or**

    `or` [`ConnectAppSearchOrQuery`](https://dev.nominal.io/api/rest/connect-apps-service.md#connectappsearchorquery)
    :   ​

    **workspace**

    `workspace` string
    :   ​

    **isArchived**

    `isArchived` boolean
    :   ​

### Handle

`s3` string
:   ​

### LabelUpdateWrapper

Wrapper classes to allow for optional fields on update requests

`labels` array of string
:   ​

### Property

`name` string
:   ​

`value` string
:   ​

### PropertyUpdateWrapper

`properties` map of string to string
:   ​

### SearchConnectAppsOptions

`isDescending` boolean
:   default is true

`sortField` [`SearchConnectAppsSortField`](https://dev.nominal.io/api/rest/connect-apps-service.md#searchconnectappssortfield)
:   default is title

### SearchConnectAppsSortField

`SEARCH_CONNECT_APPS_SORT_FIELD_UNSPECIFIED`
:   ​

`SEARCH_CONNECT_APPS_SORT_FIELD_TITLE`
:   ​

`SEARCH_CONNECT_APPS_SORT_FIELD_CREATED_AT`
:   ​

`SEARCH_CONNECT_APPS_SORT_FIELD_DISPLAY_NAME`
:   ​

Page design based on [Scalar](https://scalar.com), MIT License.
