---
title: "Update a specific app visible to the current tenant actor (v2)"
method: PATCH
path: "/v2/apps/{appId}"
tags: ["Apps"]
---

# Update a specific app visible to the current tenant actor (v2)

`PATCH /v2/apps/{appId}`

## Request

- Base URL: `https://api.chat.ethora.com`
- URL: `https://api.chat.ethora.com/v2/apps/{appId}`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

**Auth**: Tenant Actor

Partially updates an app by id.
Supports `User JWT` and `B2B Server JWT`.
`appDescription` is accepted as a compatibility alias for the legacy stored `appTagline` field.

## Path parameters

- `appId` string, required

## Request body

- object
  - `displayName` string: Human-readable app name shown in the admin panel, sign-up screens, and chat headers. 3-100 chars.
  - `domainName` string: Subdomain used for the hosted app at `<domainName>.<rootDomain>`. Alphanumeric only (no dashes); must be unique across the platform.
  - `appTagline` string: Short marketing line shown beneath the display name on the sign-up screen. Free-form.
  - `appDescription` string: Alias of `appTagline` accepted on update endpoints for clarity. If both are sent, they end up in the same field.
  - `logoImage` string: Main app logo. POST/PUT accept either a file upload (multipart) or a URL (JSON). 1:1 ratio recommended, displayed at 120x120 px in the admin panel.
  - `sublogoImage` string: Optional secondary logo / favicon. Same input shapes as `logoImage`.
  - `primaryColor` string: Brand colour as a 6-digit hex string (e.g. `#0052CD`). Used as the accent throughout the chat UI.
  - `bundleId` string: iOS/Android bundle identifier in reverse-DNS form (e.g. `com.acme.chat`). Required for native push notifications.
  - `coinSymbol` string: Short ticker for the app's coin (e.g. `ETO`). Used in token balances and transaction summaries.
  - `coinName` string: Display name for the app's coin (e.g. `Ethora Coin`).
  - `defaultProfileIsPublic` boolean: Default value of `profileIsPublic` for newly-created users in this app. If true, anyone in the app can view a new user's profile by default; if false, only the user themself + admins.
  - `defaultAssetsArePublic` boolean: Default value of `assetsArePublic` for newly-created users in this app. If true, a new user's owned tokens / assets are visible on their public profile by default; if false, hidden.
  - `allowUsersToBecomeTenants` boolean: If true, end-users of this app can become tenants themselves (create their own apps, take their account independent of this app). Used for the base app where any signup can spin up their own apps. Default false for child apps.
  - `defaultAccessProfileOpen` boolean: **Deprecated** - kept as a backward-compatible alias for `defaultProfileIsPublic`. New integrations should use `defaultProfileIsPublic`.
  - `defaultAccessAssetsOpen` boolean: **Deprecated** - kept as a backward-compatible alias for `defaultAssetsArePublic`. New integrations should use `defaultAssetsArePublic`.
  - `usersCanFree` boolean: **Deprecated** - kept as a backward-compatible alias for `allowUsersToBecomeTenants`. New integrations should use `allowUsersToBecomeTenants`.
  - `isAllowedNewAppCreate` boolean: If true, end-users of this app see an "Create your own app" affordance after login. Typically only the base app has this on.
  - `platformPushEnabled` boolean: Platform-key pushes (the base app's FCM/APNs keys serve every app of the install) are on by default; false creates the app with them switched off, the same switch as PUT /v1/push/platform/{appId}. If the push service cannot be reached, the app is still created and the switch can be set afterwards.
  - `afterLoginPage` 'profile' | 'chats' | 'admin': Page the user lands on after login. One of `chats`, `profile`.
  - `allowUsersToCreateRooms` boolean: If true, end-users can create their own chat rooms. If false, only admins can create rooms via the API.
  - `e2eeEnabled` boolean: If true, this app's users can open end-to-end encrypted (OMEMO 2) 1:1 chats: `POST /v1/chats/private` accepts `e2ee: true`, and `GET /apps/get-config` reports the flag so the client shows the affordance. If false (the default), that request answers `403 E2EE_DISABLED` and only plaintext rooms can be created. The install-wide `features.e2ee` deploy flag is the outer gate - a chat is encryptable only when both are on. Turning this off stops NEW encrypted rooms being created; rooms already encrypted stay so.
  - `userRegistrationDisabled` boolean: If true, self-service registration is closed for this app: `POST /v1/users`, `POST /v1|v2/users/sign-up-with-email` and `POST /v1/users/sign-up-resend-email` answer `403 REGISTRATION_DISABLED`. Owner/B2B provisioning (`/users/create-with-app-id/{id}`, `/users/batch`, `/v2/apps/{appId}/users/batch`) and all login, refresh and password-reset flows are unaffected. Negative on purpose: apps that predate the field have no such key and stay registration-allowed with no migration.
  - `requireMfaForAdmins` boolean: When true, users who hold an admin ACL on this app (or are platform super admins) and have not enrolled in MFA get `mfaEnrolmentRequired: true` in the login response, and the admin panel steers them to Account > Security. Login is not blocked; end users and API clients are unaffected.
  - `broadcastSender` object: Per-app default identity stamped on broadcast announcements when the broadcast caller doesn't supply `sender` in the POST /v2/chats/broadcast (or /v2/apps/{appId}/chats/broadcast) body. Without this, chat-component renders broadcasts as "Deleted User" because the system chat account JID is not in usersSet. Pass an empty string for either field to clear it.
    - `name` string
    - `photoUrl` string, uri

## Response `200`

ok

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: app not found
- `422`: Unprocessable Entity
- `500`: Internal Server Error

---

[API](https://skmtc.dev/ethora/apis/platform-api.md) · [All operations](https://skmtc.dev/ethora/apis/platform-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ethora/apis/platform-api/revisions/01b6e64378ee?raw)
