{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/app-definition-yaml/latest.json",
  "x-lintel": {
    "source": "https://appsemble.app/api.json#/components/schemas/AppDefinition",
    "sourceSha256": "cc7a9a6c0ada31dd6eb6641ed8b9dd1adf43d2fc42d34f3fe714a62571521fee",
    "fileMatch": [
      "app-definition.yaml"
    ],
    "parsers": [
      "yaml"
    ]
  },
  "openapi": "3.0.2",
  "components": {
    "parameters": {
      "$filter": {
        "name": "$filter",
        "in": "query",
        "description": "\n    An OData filter\n\n    <http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_SystemQueryOptionfilter>\n  ",
        "schema": {
          "type": "string"
        }
      },
      "$orderby": {
        "name": "$orderby",
        "in": "query",
        "description": "\n    An OData query option to fetch ordered data\n\n    <https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_SystemQueryOptionorderby>\n  ",
        "schema": {
          "type": "string"
        }
      },
      "$own": {
        "name": "$own",
        "schema": {
          "type": "boolean"
        },
        "description": "If only the resources created by the authenticated app member should be included",
        "in": "query"
      },
      "$select": {
        "name": "$select",
        "in": "query",
        "description": "\n    The OData `$select` query option.\n\n    This is a comma separated string of fields to select. Only filtering flat properties is\n    supported.\n\n    <http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_SystemQueryOptionselect>\n  ",
        "schema": {
          "type": "string"
        }
      },
      "$skip": {
        "name": "$skip",
        "in": "query",
        "description": "Start the query from an offset.",
        "schema": {
          "type": "integer",
          "minimum": 0
        }
      },
      "$top": {
        "name": "$top",
        "in": "query",
        "description": "Limit the number of entities returned.",
        "schema": {
          "type": "integer",
          "minimum": 0
        }
      },
      "appId": {
        "name": "appId",
        "in": "path",
        "description": "The ID of the app on which to perform an operation",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/App/properties/id"
        }
      },
      "appMemberId": {
        "name": "memberId",
        "in": "path",
        "description": "The id of the app member on which to perform an operation",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/AppMember/properties/id"
        }
      },
      "appOAuth2SecretId": {
        "name": "appOAuth2SecretId",
        "in": "path",
        "description": "The ID of the app OAuth2 secret on which to perform an operation",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/AppOAuth2Secret/properties/id"
        }
      },
      "appSamlSecretId": {
        "name": "appSamlSecretId",
        "in": "path",
        "description": "The ID of the app SAML secret on which to perform an operation",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "appVariableId": {
        "name": "appVariableId",
        "in": "path",
        "description": "The id of the app variable on which to perform an operation",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "assetId": {
        "name": "assetId",
        "in": "path",
        "description": "The ID of the asset on which to perform an operation",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/Asset/properties/id"
        }
      },
      "blockId": {
        "name": "blockId",
        "in": "path",
        "description": "The ID of the block on which to perform an operation, but without the organization scope.",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$"
        }
      },
      "blockVersion": {
        "name": "blockVersion",
        "in": "path",
        "description": "The version of the block on which to perform an operation.",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/BlockVersion/properties/version"
        }
      },
      "delimiter": {
        "name": "delimiter",
        "in": "query",
        "description": "\nDelimiter to be used to parse the CSV file\n  ",
        "schema": {
          "type": "string"
        }
      },
      "endpoint": {
        "name": "endpoint",
        "in": "query",
        "description": "The URL of the endpoint associated with the subscription.",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uri"
        }
      },
      "groupId": {
        "name": "groupId",
        "in": "path",
        "description": "The ID of the group on which to perform an operation",
        "required": true,
        "schema": {
          "type": "number"
        }
      },
      "groupMemberId": {
        "name": "groupMemberId",
        "in": "path",
        "description": "The id of the group member on which to perform an operation",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/AppMember/properties/id"
        }
      },
      "height": {
        "name": "height",
        "in": "query",
        "description": "Height the image should be rescaled to.",
        "required": false,
        "schema": {
          "type": "number"
        }
      },
      "language": {
        "name": "language",
        "in": "path",
        "description": "The language on which to perform an operation",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "organizationId": {
        "name": "organizationId",
        "required": true,
        "in": "path",
        "description": "The ID of the organization on which to perform an operation",
        "schema": {
          "$ref": "#/components/schemas/Organization/properties/id"
        }
      },
      "organizationSubscriptionId": {
        "name": "organizationSubscriptionId",
        "required": true,
        "in": "path",
        "description": "The ID of the subscription on which to perform an operation",
        "schema": {
          "$ref": "#/components/schemas/OrganizationSubscription/properties/id"
        }
      },
      "readmeId": {
        "name": "readmeId",
        "in": "path",
        "description": "The id of an app readme",
        "required": true,
        "schema": {
          "type": "number"
        }
      },
      "resourceId": {
        "name": "resourceId",
        "in": "path",
        "description": "The ID of the resource on which to perform an operation",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/Resource/properties/id"
        }
      },
      "resourceType": {
        "name": "resourceType",
        "in": "path",
        "description": "The type of the resource on which to perform an operation",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "roles": {
        "name": "roles",
        "in": "query",
        "description": "The roles of app members on which to perform an operation",
        "schema": {
          "type": "string"
        }
      },
      "screenshotId": {
        "name": "screenshotId",
        "in": "path",
        "description": "The id of an app screenshot",
        "required": true,
        "schema": {
          "type": "number"
        }
      },
      "seed": {
        "name": "seed",
        "in": "query",
        "description": "\n    Whether the resources or assets are seed instead.\n    ",
        "schema": {
          "type": "string"
        }
      },
      "selectedGroupId": {
        "name": "selectedGroupId",
        "in": "query",
        "description": "The currently selected group of the app member.",
        "schema": {
          "type": "number"
        }
      },
      "serviceSecretId": {
        "name": "serviceSecretId",
        "in": "path",
        "description": "The id of the app service secret on which to perform an operation",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "trainingId": {
        "name": "trainingId",
        "in": "path",
        "description": "Id of the training on which the operation will be performed.",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/Training/properties/id"
        }
      },
      "view": {
        "name": "view",
        "in": "query",
        "description": "The view of the resource to fetch.",
        "schema": {
          "type": "string"
        }
      },
      "webhookName": {
        "name": "webhookName",
        "in": "path",
        "description": "The name of the webhook to call",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "webhookSecretId": {
        "name": "webhookSecretId",
        "in": "path",
        "description": "The id of the app webhook secret on which to perform an operation",
        "required": true,
        "schema": {
          "type": "string"
        }
      },
      "width": {
        "name": "width",
        "in": "query",
        "description": "Width the image should be rescaled to.",
        "required": false,
        "schema": {
          "type": "number"
        }
      }
    },
    "requestBodies": {
      "oauth2Consent": {
        "description": "The OAuth2 client credentials",
        "required": true,
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "required": [
                "redirectUri",
                "scope"
              ],
              "description": "A representation of a user’s OAuth2 consent when logging in to an app.",
              "additionalProperties": false,
              "properties": {
                "redirectUri": {
                  "type": "string",
                  "format": "uri",
                  "description": "The URI to redirect the user back to."
                },
                "scope": {
                  "type": "string",
                  "description": "The OAuth2 scope requested by the app."
                }
              }
            }
          }
        }
      },
      "resource": {
        "description": "A resource definition",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Resource"
            }
          },
          "multipart/form-data": {
            "schema": {
              "type": "object",
              "required": [
                "resource"
              ],
              "description": "A `multipart/form-data` representation of a resource.",
              "additionalProperties": false,
              "properties": {
                "resource": {
                  "$ref": "#/components/schemas/Resource"
                },
                "assets": {
                  "type": "array",
                  "description": "A list of assets that should be linked to the resource.",
                  "items": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        }
      },
      "user": {
        "description": "A user profile",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/UserInfo"
            }
          }
        }
      }
    },
    "responses": {
      "app": {
        "description": "An app response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/App"
            }
          }
        }
      },
      "blockVersion": {
        "description": "A block definition response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/BlockVersion"
            }
          }
        }
      },
      "default": {
        "description": "The default error response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "invite": {
        "description": "An invite response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Organization"
            }
          }
        }
      },
      "oauth2AuthorizationCode": {
        "description": "An OAuth2 authorization code.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/App"
            }
          }
        }
      },
      "organization": {
        "description": "An organization response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Organization"
            }
          }
        }
      },
      "resource": {
        "description": "A resource response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Resource"
            }
          },
          "text/csv": {
            "schema": {
              "type": "string"
            }
          }
        }
      },
      "subscriptions": {
        "description": "A subscription response.",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "description": "A mapping of resources names to resource subscriptions.",
              "additionalProperties": {
                "$ref": "#/components/schemas/ResourceSubscription"
              }
            }
          }
        }
      }
    },
    "schemas": {
      "App": {
        "type": "object",
        "description": "An app definition defines what an app will look like.",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "number",
            "minimum": 0,
            "readOnly": true,
            "description": "The unique identifier for the app.\n\nThis value will be generated automatically by the API.\n"
          },
          "OrganizationId": {
            "$ref": "#/components/schemas/Organization/properties/id"
          },
          "path": {
            "type": "string",
            "minLength": 1,
            "maxLength": 41,
            "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$",
            "description": "The URL path segment on which this app is reachable.\n\nThis may only contain lower case characters, numbers, and hyphens. By default this is a\nnormalized version of the app name.\n"
          },
          "domain": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 0
              },
              {
                "type": "string",
                "format": "hostname"
              }
            ],
            "description": "The domain name on which this app should be served.\n\nIf this is unspecified, the app will be served from the path on the domain of the server\n`HOSTNAME` variable.\n"
          },
          "visibility": {
            "description": "Determine the app visibility of the app in the Appsemble app store.\n\nThis doesn’t affect whether or not the app can be accessed on its own domain.\n\n- **public**: The app is publicly listed in the Appsemble app store.\n- **unlisted**: The app store page can be accessed, but the app isn’t listed publicly in the\n  Appsemble app store.\n- **private**: The app is only visible to people who are part of the organization.\n",
            "default": "unlisted",
            "enum": [
              "public",
              "unlisted",
              "private"
            ]
          },
          "showAppDefinition": {
            "type": "boolean",
            "description": "Whether or not people who have access to the app may see the app definition."
          },
          "locked": {
            "enum": [
              "fullLock",
              "studioLock",
              "unlocked"
            ],
            "default": "unlocked",
            "description": "Determines whether this app should be locked from being updated.\n      If this is set to `fullLock`, no changes can be made to the app,\n      if this is set to `studioLock`, no changes can be made from the studio but updating from the CLI is possible,\n      and to make any changes from the studio, this should be set to `unlocked`.\n"
          },
          "totp": {
            "enum": [
              "disabled",
              "enabled",
              "required"
            ],
            "default": "disabled",
            "description": "The TOTP (two-factor authentication) setting for the app.\n\n- **disabled**: TOTP is not available for app members.\n- **enabled**: TOTP is available but optional for app members.\n- **required**: TOTP is required for all app members. **WARNING**: Setting this will lock out existing users who have not yet enabled 2FA on their accounts.\n"
          },
          "displayAppMemberName": {
            "type": "boolean",
            "description": "Whether to display app member name in the title bar."
          },
          "displayInstallationPrompt": {
            "type": "boolean",
            "description": "Whether to display installtion prompt to the users of app"
          },
          "template": {
            "type": "boolean",
            "description": "Determines whether this app should be included when fetching for templates."
          },
          "demoMode": {
            "type": "boolean",
            "description": "Determines whether this app should be used in demo mode."
          },
          "longDescription": {
            "type": "string",
            "description": "\nA long description for the app.\n\nThe long description will be rendered on the app details page. Markdown content is supported.\n"
          },
          "definition": {
            "type": "object",
            "additionalProperties": true,
            "description": "An app definition describes what an Appsemble app looks like."
          },
          "screenshotUrls": {
            "type": "array",
            "description": "A list of URLs referencing app screenshots",
            "items": {
              "type": "string"
            }
          },
          "googleAnalyticsID": {
            "type": "string",
            "description": "If this is specified, Google analytics will be applied to the app",
            "pattern": "^(|UA-[0-9]{4,10}-[0-9]{1,4}|G-[0-9A-Z]{4,})$"
          },
          "sentryDsn": {
            "type": "string",
            "description": "The Sentry DSN to use for this app.\n\nIf this is specified, the given Sentry DSN will be used for error tracking. Apps without a custom\ndomain fall back to use the Appsemble server Sentry DSN.\n",
            "format": "url"
          },
          "sentryEnvironment": {
            "type": "string",
            "description": "The name that should be used as the sentry environment.\n\n  This is only applied when `sentryDsn` is specified."
          },
          "controllerCode": {
            "type": "string",
            "description": "Custom app logic as a JavaScript string"
          },
          "controllerImplementations": {
            "type": "string",
            "description": "Appsemble SDK interfaces implementations"
          },
          "supportedLanguages": {
            "type": "array",
            "description": "Supported languages for an app",
            "items": {
              "type": "string",
              "minLength": 2
            }
          }
        }
      },
      "AppAccount": {
        "type": "object",
        "description": "An object representing a member of an app",
        "additionalProperties": false,
        "properties": {
          "app": {
            "$ref": "#/components/schemas/App",
            "description": "The app this account is for."
          },
          "appMemberInfo": {
            "$ref": "#/components/schemas/AppMemberInfo",
            "description": "The app member info."
          },
          "sso": {
            "type": "array",
            "description": "The single sign on configurations which link the user to an external account.",
            "items": {
              "$ref": "#/components/schemas/SSOConfiguration"
            }
          }
        }
      },
      "AppCollection": {
        "type": "object",
        "description": "An app collection",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true,
            "description": "The unique ID of the app collection."
          },
          "name": {
            "type": "string",
            "description": "The name of the app collection."
          },
          "OrganizationId": {
            "type": "string",
            "description": "The ID of the organization that owns the app collection."
          },
          "OrganizationName": {
            "type": "string",
            "description": "The name of the organization that owns the app collection."
          },
          "visibility": {
            "enum": [
              "private",
              "public"
            ],
            "description": "The visibility of the app collection."
          },
          "$expert": {
            "type": "object",
            "additionalProperties": false,
            "description": "The app collection’s expert/curator.",
            "properties": {
              "name": {
                "type": "string",
                "description": "The name of the expert."
              },
              "description": {
                "type": "string",
                "description": "The description of the expert."
              },
              "profileImage": {
                "type": "string",
                "description": "The URL at which the expert’s profile image can be found."
              }
            }
          },
          "headerImage": {
            "type": "string",
            "description": "The URL at which the app collection’s header image can be found."
          },
          "$created": {
            "type": "string",
            "format": "date-time",
            "description": "When the collection was first created as an ISO 8601 formatted string"
          },
          "$updated": {
            "type": "string",
            "format": "date-time",
            "description": "When the collection was last updated as an ISO 8601 formatted string"
          }
        }
      },
      "AppCollectionDefinition": {
        "type": "object",
        "description": "An app collection",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "The name of the app collection.",
            "minLength": 1,
            "maxLength": 30
          },
          "visibility": {
            "enum": [
              "private",
              "public"
            ],
            "description": "The visibility of the app collection."
          },
          "expertName": {
            "type": "string",
            "description": "The name of the app collection’s expert/curator.",
            "minLength": 1,
            "maxLength": 30
          },
          "expertDescription": {
            "type": "string",
            "description": "The description of the app collection’s expert/curator.",
            "maxLength": 4000
          },
          "expertProfileImage": {
            "type": "string",
            "format": "binary",
            "description": "The profile image of the app collection’s expert/curator."
          },
          "headerImage": {
            "type": "string",
            "format": "binary",
            "description": "The header image of the app collection."
          },
          "domain": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 0
              },
              {
                "type": "string",
                "format": "hostname",
                "maxLength": 253
              }
            ]
          }
        }
      },
      "AppMember": {
        "type": "object",
        "description": "An object representing a member of an app",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true,
            "description": "The id of the app member."
          },
          "role": {
            "type": "string",
            "description": "The role of the app member within the app."
          },
          "name": {
            "type": "string",
            "description": "The full name of the app member."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "The email address of the app member."
          }
        }
      },
      "AppMemberInfo": {
        "type": "object",
        "description": "An object representing the OAuth2 info of a member of an app",
        "additionalProperties": false,
        "properties": {
          "sub": {
            "type": "string",
            "readOnly": true,
            "description": "The id of the app member."
          },
          "name": {
            "type": "string",
            "description": "The full name of the app member."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "The email address of the app member."
          },
          "email_verified": {
            "type": "boolean",
            "description": "Whether this email address has been verified."
          },
          "picture": {
            "type": "string",
            "format": "url",
            "description": "The URL of the profile picture of the app member."
          },
          "locale": {
            "type": "string",
            "description": "The locale of the app member."
          },
          "zoneinfo": {
            "enum": [
              "Africa/Abidjan",
              "Africa/Accra",
              "Africa/Addis_Ababa",
              "Africa/Algiers",
              "Africa/Asmera",
              "Africa/Bamako",
              "Africa/Bangui",
              "Africa/Banjul",
              "Africa/Bissau",
              "Africa/Blantyre",
              "Africa/Brazzaville",
              "Africa/Bujumbura",
              "Africa/Cairo",
              "Africa/Casablanca",
              "Africa/Ceuta",
              "Africa/Conakry",
              "Africa/Dakar",
              "Africa/Dar_es_Salaam",
              "Africa/Djibouti",
              "Africa/Douala",
              "Africa/El_Aaiun",
              "Africa/Freetown",
              "Africa/Gaborone",
              "Africa/Harare",
              "Africa/Johannesburg",
              "Africa/Juba",
              "Africa/Kampala",
              "Africa/Khartoum",
              "Africa/Kigali",
              "Africa/Kinshasa",
              "Africa/Lagos",
              "Africa/Libreville",
              "Africa/Lome",
              "Africa/Luanda",
              "Africa/Lubumbashi",
              "Africa/Lusaka",
              "Africa/Malabo",
              "Africa/Maputo",
              "Africa/Maseru",
              "Africa/Mbabane",
              "Africa/Mogadishu",
              "Africa/Monrovia",
              "Africa/Nairobi",
              "Africa/Ndjamena",
              "Africa/Niamey",
              "Africa/Nouakchott",
              "Africa/Ouagadougou",
              "Africa/Porto-Novo",
              "Africa/Sao_Tome",
              "Africa/Tripoli",
              "Africa/Tunis",
              "Africa/Windhoek",
              "America/Adak",
              "America/Anchorage",
              "America/Anguilla",
              "America/Antigua",
              "America/Araguaina",
              "America/Argentina/La_Rioja",
              "America/Argentina/Rio_Gallegos",
              "America/Argentina/Salta",
              "America/Argentina/San_Juan",
              "America/Argentina/San_Luis",
              "America/Argentina/Tucuman",
              "America/Argentina/Ushuaia",
              "America/Aruba",
              "America/Asuncion",
              "America/Bahia",
              "America/Bahia_Banderas",
              "America/Barbados",
              "America/Belem",
              "America/Belize",
              "America/Blanc-Sablon",
              "America/Boa_Vista",
              "America/Bogota",
              "America/Boise",
              "America/Buenos_Aires",
              "America/Cambridge_Bay",
              "America/Campo_Grande",
              "America/Cancun",
              "America/Caracas",
              "America/Catamarca",
              "America/Cayenne",
              "America/Cayman",
              "America/Chicago",
              "America/Chihuahua",
              "America/Ciudad_Juarez",
              "America/Coral_Harbour",
              "America/Cordoba",
              "America/Costa_Rica",
              "America/Coyhaique",
              "America/Creston",
              "America/Cuiaba",
              "America/Curacao",
              "America/Danmarkshavn",
              "America/Dawson",
              "America/Dawson_Creek",
              "America/Denver",
              "America/Detroit",
              "America/Dominica",
              "America/Edmonton",
              "America/Eirunepe",
              "America/El_Salvador",
              "America/Fort_Nelson",
              "America/Fortaleza",
              "America/Glace_Bay",
              "America/Godthab",
              "America/Goose_Bay",
              "America/Grand_Turk",
              "America/Grenada",
              "America/Guadeloupe",
              "America/Guatemala",
              "America/Guayaquil",
              "America/Guyana",
              "America/Halifax",
              "America/Havana",
              "America/Hermosillo",
              "America/Indiana/Knox",
              "America/Indiana/Marengo",
              "America/Indiana/Petersburg",
              "America/Indiana/Tell_City",
              "America/Indiana/Vevay",
              "America/Indiana/Vincennes",
              "America/Indiana/Winamac",
              "America/Indianapolis",
              "America/Inuvik",
              "America/Iqaluit",
              "America/Jamaica",
              "America/Jujuy",
              "America/Juneau",
              "America/Kentucky/Monticello",
              "America/Kralendijk",
              "America/La_Paz",
              "America/Lima",
              "America/Los_Angeles",
              "America/Louisville",
              "America/Lower_Princes",
              "America/Maceio",
              "America/Managua",
              "America/Manaus",
              "America/Marigot",
              "America/Martinique",
              "America/Matamoros",
              "America/Mazatlan",
              "America/Mendoza",
              "America/Menominee",
              "America/Merida",
              "America/Metlakatla",
              "America/Mexico_City",
              "America/Miquelon",
              "America/Moncton",
              "America/Monterrey",
              "America/Montevideo",
              "America/Montserrat",
              "America/Nassau",
              "America/New_York",
              "America/Nome",
              "America/Noronha",
              "America/North_Dakota/Beulah",
              "America/North_Dakota/Center",
              "America/North_Dakota/New_Salem",
              "America/Ojinaga",
              "America/Panama",
              "America/Paramaribo",
              "America/Phoenix",
              "America/Port-au-Prince",
              "America/Port_of_Spain",
              "America/Porto_Velho",
              "America/Puerto_Rico",
              "America/Punta_Arenas",
              "America/Rankin_Inlet",
              "America/Recife",
              "America/Regina",
              "America/Resolute",
              "America/Rio_Branco",
              "America/Santarem",
              "America/Santiago",
              "America/Santo_Domingo",
              "America/Sao_Paulo",
              "America/Scoresbysund",
              "America/Sitka",
              "America/St_Barthelemy",
              "America/St_Johns",
              "America/St_Kitts",
              "America/St_Lucia",
              "America/St_Thomas",
              "America/St_Vincent",
              "America/Swift_Current",
              "America/Tegucigalpa",
              "America/Thule",
              "America/Tijuana",
              "America/Toronto",
              "America/Tortola",
              "America/Vancouver",
              "America/Whitehorse",
              "America/Winnipeg",
              "America/Yakutat",
              "Antarctica/Casey",
              "Antarctica/Davis",
              "Antarctica/DumontDUrville",
              "Antarctica/Macquarie",
              "Antarctica/Mawson",
              "Antarctica/McMurdo",
              "Antarctica/Palmer",
              "Antarctica/Rothera",
              "Antarctica/Syowa",
              "Antarctica/Troll",
              "Antarctica/Vostok",
              "Arctic/Longyearbyen",
              "Asia/Aden",
              "Asia/Almaty",
              "Asia/Amman",
              "Asia/Anadyr",
              "Asia/Aqtau",
              "Asia/Aqtobe",
              "Asia/Ashgabat",
              "Asia/Atyrau",
              "Asia/Baghdad",
              "Asia/Bahrain",
              "Asia/Baku",
              "Asia/Bangkok",
              "Asia/Barnaul",
              "Asia/Beirut",
              "Asia/Bishkek",
              "Asia/Brunei",
              "Asia/Calcutta",
              "Asia/Chita",
              "Asia/Colombo",
              "Asia/Damascus",
              "Asia/Dhaka",
              "Asia/Dili",
              "Asia/Dubai",
              "Asia/Dushanbe",
              "Asia/Famagusta",
              "Asia/Gaza",
              "Asia/Hebron",
              "Asia/Hong_Kong",
              "Asia/Hovd",
              "Asia/Irkutsk",
              "Asia/Jakarta",
              "Asia/Jayapura",
              "Asia/Jerusalem",
              "Asia/Kabul",
              "Asia/Kamchatka",
              "Asia/Karachi",
              "Asia/Katmandu",
              "Asia/Khandyga",
              "Asia/Krasnoyarsk",
              "Asia/Kuala_Lumpur",
              "Asia/Kuching",
              "Asia/Kuwait",
              "Asia/Macau",
              "Asia/Magadan",
              "Asia/Makassar",
              "Asia/Manila",
              "Asia/Muscat",
              "Asia/Nicosia",
              "Asia/Novokuznetsk",
              "Asia/Novosibirsk",
              "Asia/Omsk",
              "Asia/Oral",
              "Asia/Phnom_Penh",
              "Asia/Pontianak",
              "Asia/Pyongyang",
              "Asia/Qatar",
              "Asia/Qostanay",
              "Asia/Qyzylorda",
              "Asia/Rangoon",
              "Asia/Riyadh",
              "Asia/Saigon",
              "Asia/Sakhalin",
              "Asia/Samarkand",
              "Asia/Seoul",
              "Asia/Shanghai",
              "Asia/Singapore",
              "Asia/Srednekolymsk",
              "Asia/Taipei",
              "Asia/Tashkent",
              "Asia/Tbilisi",
              "Asia/Tehran",
              "Asia/Thimphu",
              "Asia/Tokyo",
              "Asia/Tomsk",
              "Asia/Ulaanbaatar",
              "Asia/Urumqi",
              "Asia/Ust-Nera",
              "Asia/Vientiane",
              "Asia/Vladivostok",
              "Asia/Yakutsk",
              "Asia/Yekaterinburg",
              "Asia/Yerevan",
              "Atlantic/Azores",
              "Atlantic/Bermuda",
              "Atlantic/Canary",
              "Atlantic/Cape_Verde",
              "Atlantic/Faeroe",
              "Atlantic/Madeira",
              "Atlantic/Reykjavik",
              "Atlantic/South_Georgia",
              "Atlantic/St_Helena",
              "Atlantic/Stanley",
              "Australia/Adelaide",
              "Australia/Brisbane",
              "Australia/Broken_Hill",
              "Australia/Darwin",
              "Australia/Eucla",
              "Australia/Hobart",
              "Australia/Lindeman",
              "Australia/Lord_Howe",
              "Australia/Melbourne",
              "Australia/Perth",
              "Australia/Sydney",
              "Europe/Amsterdam",
              "Europe/Andorra",
              "Europe/Astrakhan",
              "Europe/Athens",
              "Europe/Belgrade",
              "Europe/Berlin",
              "Europe/Bratislava",
              "Europe/Brussels",
              "Europe/Bucharest",
              "Europe/Budapest",
              "Europe/Busingen",
              "Europe/Chisinau",
              "Europe/Copenhagen",
              "Europe/Dublin",
              "Europe/Gibraltar",
              "Europe/Guernsey",
              "Europe/Helsinki",
              "Europe/Isle_of_Man",
              "Europe/Istanbul",
              "Europe/Jersey",
              "Europe/Kaliningrad",
              "Europe/Kiev",
              "Europe/Kirov",
              "Europe/Lisbon",
              "Europe/Ljubljana",
              "Europe/London",
              "Europe/Luxembourg",
              "Europe/Madrid",
              "Europe/Malta",
              "Europe/Mariehamn",
              "Europe/Minsk",
              "Europe/Monaco",
              "Europe/Moscow",
              "Europe/Oslo",
              "Europe/Paris",
              "Europe/Podgorica",
              "Europe/Prague",
              "Europe/Riga",
              "Europe/Rome",
              "Europe/Samara",
              "Europe/San_Marino",
              "Europe/Sarajevo",
              "Europe/Saratov",
              "Europe/Simferopol",
              "Europe/Skopje",
              "Europe/Sofia",
              "Europe/Stockholm",
              "Europe/Tallinn",
              "Europe/Tirane",
              "Europe/Ulyanovsk",
              "Europe/Vaduz",
              "Europe/Vatican",
              "Europe/Vienna",
              "Europe/Vilnius",
              "Europe/Volgograd",
              "Europe/Warsaw",
              "Europe/Zagreb",
              "Europe/Zurich",
              "Indian/Antananarivo",
              "Indian/Chagos",
              "Indian/Christmas",
              "Indian/Cocos",
              "Indian/Comoro",
              "Indian/Kerguelen",
              "Indian/Mahe",
              "Indian/Maldives",
              "Indian/Mauritius",
              "Indian/Mayotte",
              "Indian/Reunion",
              "Pacific/Apia",
              "Pacific/Auckland",
              "Pacific/Bougainville",
              "Pacific/Chatham",
              "Pacific/Easter",
              "Pacific/Efate",
              "Pacific/Enderbury",
              "Pacific/Fakaofo",
              "Pacific/Fiji",
              "Pacific/Funafuti",
              "Pacific/Galapagos",
              "Pacific/Gambier",
              "Pacific/Guadalcanal",
              "Pacific/Guam",
              "Pacific/Honolulu",
              "Pacific/Kiritimati",
              "Pacific/Kosrae",
              "Pacific/Kwajalein",
              "Pacific/Majuro",
              "Pacific/Marquesas",
              "Pacific/Midway",
              "Pacific/Nauru",
              "Pacific/Niue",
              "Pacific/Norfolk",
              "Pacific/Noumea",
              "Pacific/Pago_Pago",
              "Pacific/Palau",
              "Pacific/Pitcairn",
              "Pacific/Ponape",
              "Pacific/Port_Moresby",
              "Pacific/Rarotonga",
              "Pacific/Saipan",
              "Pacific/Tahiti",
              "Pacific/Tarawa",
              "Pacific/Tongatapu",
              "Pacific/Truk",
              "Pacific/Wake",
              "Pacific/Wallis"
            ],
            "description": "The time zone of the app member."
          },
          "role": {
            "type": "string",
            "description": "The role of the app member within the app"
          },
          "properties": {
            "type": "object",
            "description": "The custom properties of the app member.",
            "additionalProperties": true
          },
          "unverifiedEmail": {
            "type": "string",
            "description": "Unverified email of the app member which will replace the main email when verified"
          }
        }
      },
      "AppMessages": {
        "type": "object",
        "description": "The response object of an messages create call.",
        "required": [
          "language",
          "messages"
        ],
        "additionalProperties": false,
        "properties": {
          "language": {
            "type": "string",
            "description": "The language the messages represent."
          },
          "messages": {
            "$ref": "#/components/schemas/AppsembleMessages"
          },
          "force": {
            "type": "boolean",
            "writeOnly": true,
            "description": "If this is true, the app lock is ignored."
          }
        }
      },
      "AppOAuth2Secret": {
        "type": "object",
        "description": "Settings for login in apps using third party OAuth2 providers",
        "required": [
          "authorizationUrl",
          "clientId",
          "clientSecret",
          "icon",
          "name",
          "scope",
          "tokenUrl"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "number",
            "description": "An autogenerated ID",
            "readOnly": true
          },
          "authorizationUrl": {
            "type": "string",
            "format": "uri",
            "description": "The OAuth2 redirect URL."
          },
          "tokenUrl": {
            "type": "string",
            "format": "uri",
            "description": "The URL to request access tokens from."
          },
          "clientId": {
            "type": "string",
            "description": "The public client id which identifies Appsemble to the authorization server."
          },
          "clientSecret": {
            "type": "string",
            "description": "The OAuth2 client secret."
          },
          "icon": {
            "type": "string",
            "description": "A Font Awesome icon which represents the OAuth2 provider."
          },
          "name": {
            "type": "string",
            "description": "A display name which represents the OAuth2 provider."
          },
          "scope": {
            "type": "string",
            "description": "The login scope that will be requested from the authorization server."
          },
          "userInfoUrl": {
            "type": "string",
            "format": "uri",
            "description": "The URL to request user info from"
          },
          "remapper": {
            "type": "array",
            "description": "A remapper to apply on retrieved user information from the user info endpoint.",
            "items": {}
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "description": "When the secret was created originally."
          },
          "updated": {
            "type": "string",
            "format": "date-time",
            "description": "When the secret was last updated."
          }
        }
      },
      "AppServiceSecret": {
        "type": "object",
        "description": "App service secret settings",
        "required": [
          "urlPatterns",
          "authenticationMethod"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "number",
            "description": "An autogenerated ID.",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "description": "An optional name to give extra clarity what the secret is used for."
          },
          "urlPatterns": {
            "type": "string",
            "description": "The url pattern that is matched when a proxied request action is called."
          },
          "authenticationMethod": {
            "enum": [
              "http-basic",
              "client-certificate",
              "client-credentials",
              "cookie",
              "custom-header",
              "query-parameter"
            ],
            "description": "The method to authenticate the request action with."
          },
          "identifier": {
            "type": "string",
            "description": "The parameter name, header name, username or certificate that goes with the secret."
          },
          "secret": {
            "type": "string",
            "description": "The secret to authenticate the proxied outgoing request with."
          },
          "tokenUrl": {
            "type": "string",
            "description": "The URL to request access tokens from."
          },
          "scope": {
            "type": "string",
            "description": "The scope to request access tokens for."
          },
          "public": {
            "type": "boolean",
            "description": "If a secret is marked public, it can be applied to the unauthenticated users, e.g. in the requests originating in a custom sign up or login page.",
            "default": false
          },
          "ca": {
            "type": "string",
            "description": "The custom certificate authority."
          }
        }
      },
      "AppVariable": {
        "type": "object",
        "description": "App variable",
        "required": [
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "number",
            "description": "An autogenerated ID.",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "description": "The name of the variable, that will be accessible from clients."
          },
          "value": {
            "description": "The value of the variable.",
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "boolean"
              },
              {
                "type": "number"
              }
            ]
          }
        }
      },
      "AppWebhookSecret": {
        "type": "object",
        "description": "App webhook secret settings",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "number",
            "description": "An autogenerated ID.",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "description": "An optional name to give extra clarity what the secret is used for."
          },
          "webhookName": {
            "type": "string",
            "description": "The name of the webhook the secret is tied to"
          },
          "secret": {
            "type": "string",
            "description": "The autogenerated secret to authenticate the webhook caller with."
          }
        }
      },
      "AppsembleMessages": {
        "type": "object",
        "description": "A mapping of the messages for this language",
        "additionalProperties": false,
        "properties": {
          "core": {
            "type": "object",
            "description": "Translations for the core of the app.",
            "additionalProperties": {
              "type": "string"
            }
          },
          "app": {
            "type": "object",
            "description": "Translations for global block messages and meta properties of the app.",
            "additionalProperties": {
              "type": "string"
            }
          },
          "blocks": {
            "type": "object",
            "description": "Translations for the core of the app.",
            "additionalProperties": {
              "type": "object",
              "description": "The name of the block type.",
              "pattern": "^@([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)/([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$",
              "additionalProperties": {
                "type": "object",
                "description": "The version of the block.",
                "pattern": "^\\d+\\.\\d+\\.\\d+(-[\\d.a-z-]+)?$",
                "additionalProperties": {
                  "type": "string"
                }
              }
            }
          },
          "messageIds": {
            "type": "object",
            "description": "A list of custom message IDs used by the app.",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "Asset": {
        "type": "object",
        "description": "The response object of an asset publish call.",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true,
            "description": "The unique identifier for the asset.",
            "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$"
          },
          "mime": {
            "type": "string",
            "readOnly": true,
            "description": "The IANA MIME type of the asset."
          },
          "filename": {
            "type": "string",
            "readOnly": true,
            "description": "The filename of the asset."
          },
          "name": {
            "type": "string",
            "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$",
            "description": "The given name of the asset. Assets may be referenced by their name or ID in the API."
          }
        }
      },
      "BlockVersion": {
        "type": "object",
        "description": "A version of a block definition\n\nBlock versions can’t be updated or deleted. This ensures apps that use a block version can never\nbe broken by alterations of block definitions.\n",
        "required": [
          "name",
          "version",
          "files"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "readOnly": true,
            "description": "The name of a block.\n\nThis uses the same form as scoped npm packages. For example, `@appsemble/form`.\n",
            "pattern": "^@([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)/([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$"
          },
          "description": {
            "type": "string",
            "description": "The description of the block.",
            "maxLength": 160
          },
          "longDescription": {
            "type": "string",
            "description": "The long description of the block."
          },
          "repositoryUrl": {
            "type": "string",
            "format": "uri",
            "description": "A URL to the source code repository of the block."
          },
          "icon": {
            "type": "string",
            "format": "binary",
            "description": "An icon to represent the block in Appsemble studio."
          },
          "iconUrl": {
            "type": "string",
            "format": "uri",
            "description": "The relative URL on which the icon is served",
            "readOnly": true
          },
          "version": {
            "type": "string",
            "pattern": "^\\d+\\.\\d+\\.\\d+(-[\\d.a-z-]+)?$",
            "description": "A [semver](https://semver.org) representation of the block version."
          },
          "visibility": {
            "enum": [
              "public",
              "unlisted"
            ],
            "default": "public",
            "description": "Whether the block should be listed publicly for users who aren’t part of the block’s organization.\n\n- **`public`**: The block is visible for everyone.\n- **`unlisted`**: The block will only be visible if the user is logged in and is part of the block’s organization."
          },
          "layout": {
            "description": "How the block will be displayed on the screen.\n\n- **`float`**: The block will float somewhere on the screen.\n- **`grow`**: The block will be positioned in the main page. It will grow to fill up remaining\n  space on the page.\n- **`static`**: The block will be positioned in the main page. It will take up a fixed amount of\n  space.\n- **`hidden`**: The block will not be rendered at all.\n",
            "default": "grow",
            "enum": [
              "float",
              "grow",
              "static",
              "hidden"
            ]
          },
          "actions": {
            "type": "object",
            "description": "An object which describes the actions a block can trigger.\n\nThis will be used to validate app definitions.\n",
            "additionalProperties": true
          },
          "parameters": {
            "type": "object",
            "additionalProperties": true,
            "description": "A draft 7 JSON schema to use for block parameter validation.\n\nIf the parameters of a block definition don’t conform to this schema, the app definition will be\nconsidered invalid.\n"
          },
          "events": {
            "type": "object",
            "description": "An object describing the names of the events the block can listen and emit to.",
            "additionalProperties": false,
            "properties": {
              "listen": {
                "type": "object",
                "description": "A mapping of events this block may listen on",
                "additionalProperties": {
                  "description": "A mapping of events this block may listen on",
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "description": {
                      "type": "string"
                    }
                  }
                }
              },
              "emit": {
                "type": "object",
                "description": "A mapping of events this block may emit",
                "additionalProperties": {
                  "description": "A mapping of events this block may emit",
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "description": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "resources": {
            "type": "object",
            "description": "deprecated",
            "additionalProperties": true
          },
          "messages": {
            "type": "object",
            "description": "The translated messages for the block.\n\nEnglish (`en`) messages are required.\n",
            "required": [
              "en"
            ],
            "properties": {
              "en": {
                "type": "object",
                "description": "A mapping of language IDs to their English translation",
                "additionalProperties": {
                  "type": "string",
                  "description": "The default translations to use.",
                  "minLength": 1
                }
              }
            },
            "additionalProperties": {
              "type": "object",
              "description": "A mapping of language IDs to their internationalized translation",
              "additionalProperties": {
                "type": "string",
                "description": "The translated messages for this language."
              }
            }
          },
          "files": {
            "type": "array",
            "description": "A list of file assets that belong to the app version.",
            "minLength": 1,
            "items": {
              "type": "string",
              "format": "binary"
            }
          },
          "examples": {
            "type": "array",
            "description": "A list of exmples how the block can be used within an app definition.",
            "items": {
              "type": "string"
            }
          },
          "wildcardActions": {
            "type": "boolean",
            "description": "Whether action validation for wildcard action is skipped.\n\nIf true, ignore unused actions that fall under '$any'."
          }
        }
      },
      "Error": {
        "type": "object",
        "description": "The generic error object returned by any expected API errors.",
        "readOnly": true,
        "additionalProperties": false,
        "properties": {
          "statusCode": {
            "type": "number",
            "description": "Matches the HTTP response status code.",
            "example": 404
          },
          "error": {
            "type": "string",
            "description": "Matches the HTTP response status description.",
            "example": "Not Found"
          },
          "message": {
            "type": "string",
            "description": "A message describing the error.",
            "example": "Entity not found"
          }
        }
      },
      "GroupMember": {
        "type": "object",
        "description": "An object representing a member of a group",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true,
            "description": "The id of the app member."
          },
          "role": {
            "type": "string",
            "description": "The role of the app member within the group."
          },
          "name": {
            "$ref": "#/components/schemas/AppMember/properties/name"
          },
          "email": {
            "$ref": "#/components/schemas/AppMember/properties/email"
          }
        }
      },
      "Health": {
        "type": "object",
        "description": "A health check status",
        "readOnly": true,
        "additionalProperties": false,
        "properties": {
          "database": {
            "type": "boolean",
            "description": "Whether or not the database status is healthy"
          }
        }
      },
      "OAuth2AuthorizationCode": {
        "type": "object",
        "description": "OAuth2 client credentials",
        "required": [
          "code"
        ],
        "additionalProperties": false,
        "properties": {
          "code": {
            "type": "string",
            "description": "The OAuth2 authorization code.",
            "readOnly": true
          }
        }
      },
      "OAuth2ClientCredentials": {
        "type": "object",
        "description": "OAuth2 client credentials",
        "required": [
          "description",
          "scopes"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "description": "The generated client id",
            "readOnly": true
          },
          "secret": {
            "type": "string",
            "description": "The generated client secret",
            "readOnly": true
          },
          "description": {
            "type": "string",
            "description": "A description for the user to recognize the client.",
            "maxLength": 50
          },
          "expires": {
            "type": "string",
            "description": "When the client credentials expire automatically.",
            "format": "date-time"
          },
          "scopes": {
            "type": "array",
            "description": "The scopes that have been granted to the client.",
            "items": {
              "enum": [
                "apps:export",
                "apps:write",
                "apps:delete",
                "blocks:write",
                "blocks:delete",
                "organizations:write",
                "resources:read",
                "resources:write",
                "assets:write",
                "groups:read",
                "groups:write"
              ]
            }
          }
        }
      },
      "Organization": {
        "type": "object",
        "description": "An organization groups a set of users, apps, themes, and permissions together",
        "required": [
          "id"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$",
            "minLength": 1,
            "maxLength": 30,
            "description": "The unique identifier for the organization."
          },
          "name": {
            "type": "string",
            "description": "The display name for the organization."
          },
          "description": {
            "type": "string",
            "description": "The description of the organization.",
            "maxLength": 160
          },
          "email": {
            "type": "string",
            "description": "The email address of the organization."
          },
          "website": {
            "type": "string",
            "description": "The website of the organization."
          },
          "iconUrl": {
            "type": "string",
            "description": "The URL used to fetch the organization’s icon."
          },
          "vatIdNumber": {
            "type": "string",
            "description": "The VAT id number of the organization."
          },
          "streetName": {
            "type": "string",
            "description": "Street name that will appear on the invoice."
          },
          "houseNumber": {
            "type": "string",
            "description": "House number of the organization,"
          },
          "city": {
            "type": "string",
            "description": "City where the organization is located"
          },
          "zipCode": {
            "type": "string",
            "description": "Zip code of the organization"
          },
          "countryCode": {
            "type": "string",
            "description": "Country code of the country where the organization is located"
          },
          "invoiceReference": {
            "type": "string",
            "description": "The reference identifier that will appear on the invoices."
          },
          "stripeCustomerId": {
            "type": "string",
            "description": "Stripe internal ID of the customer used to match it with the organization in our database."
          }
        }
      },
      "OrganizationMember": {
        "type": "object",
        "description": "A member of an organization.",
        "required": [
          "id"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "$ref": "#/components/schemas/User/properties/id"
          },
          "name": {
            "$ref": "#/components/schemas/User/properties/name"
          },
          "primaryEmail": {
            "type": "string",
            "format": "email",
            "description": "The primary email address of the user."
          },
          "role": {
            "enum": [
              "Member",
              "AppTranslator",
              "AppContentsExplorer",
              "AppContentsManager",
              "AppMemberManager",
              "AppGroupManager",
              "AppGroupMembersManager",
              "AppManager",
              "AppCollectionManager",
              "BlockManager",
              "Maintainer",
              "Owner"
            ]
          },
          "properties": {
            "type": "object",
            "description": "Additional custom properties that a user might have.",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      },
      "OrganizationSubscription": {
        "type": "object",
        "description": "A subscription holds permission to what the users withing an organization are allowed to do.",
        "required": [
          "id",
          "subscriptionPlan",
          "organizationId"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "number",
            "description": "The unique identifier for the subscription."
          },
          "cancelled": {
            "type": "boolean",
            "description": "Whether the subscription will be renewed at the end."
          },
          "cancellationReason": {
            "type": "string",
            "description": "Users reasoning for cancelling the subscription."
          },
          "expirationDate": {
            "type": "string",
            "description": "The expiration date of the subscription.",
            "format": "date-time"
          },
          "subscriptionPlan": {
            "description": "The plan associated with the subscription.",
            "enum": [
              "free",
              "premium"
            ]
          },
          "renewalPeriod": {
            "description": "The renewal period associated with the subscription.",
            "enum": [
              "month",
              "year"
            ]
          },
          "organizationId": {
            "type": "string",
            "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$",
            "minLength": 1,
            "maxLength": 30,
            "description": "The unique identifier for the organization."
          }
        }
      },
      "Rating": {
        "type": "object",
        "description": "A representation of an App rating.",
        "additionalProperties": false,
        "required": [
          "rating"
        ],
        "properties": {
          "rating": {
            "type": "number",
            "minimum": 1,
            "maximum": 5,
            "description": "A value ranging from 1 to 5 stars rating of the App."
          },
          "description": {
            "type": "string",
            "description": "An optional explanation of the given rating."
          },
          "name": {
            "$ref": "#/components/schemas/User/properties/name",
            "readOnly": true,
            "description": "The name of the user who submitted the rating."
          }
        }
      },
      "Resource": {
        "type": "object",
        "additionalProperties": true,
        "description": "A resource can be anything defined as described in an app resource definition.",
        "properties": {
          "id": {
            "type": "number",
            "readOnly": true
          },
          "$clonable": {
            "type": "boolean"
          },
          "$ephemeral": {
            "type": "boolean"
          },
          "$expires": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "string",
                "pattern": "^(\\d+(y|yr|years))?\\s*(\\d+months)?\\s*(\\d+(w|wk|weeks))?\\s*(\\d+(d|days))?\\s*(\\d+(h|hr|hours))?\\s*(\\d+(m|min|minutes))?\\s*(\\d+(s|sec|seconds))?$"
              }
            ]
          }
        }
      },
      "ResourceSubscription": {
        "type": "object",
        "additionalProperties": false,
        "description": "This describes how a user is subscribed to a resource.",
        "properties": {
          "create": {
            "type": "boolean",
            "description": "If true, the user is subscribed to any create actions for the resource type"
          },
          "update": {
            "type": "boolean",
            "description": "If true, the user is subscribed to any update actions for the resource type"
          },
          "delete": {
            "type": "boolean",
            "description": "If true, the user is subscribed to any delete actions for the resource type"
          },
          "subscriptions": {
            "type": "object",
            "description": "A mapping of resource IDs to individual resource subscriptions",
            "additionalProperties": {
              "type": "object",
              "description": "The subscription status of a user for a single resource.",
              "additionalProperties": false,
              "properties": {
                "update": {
                  "type": "boolean",
                  "description": "If true, the user is subscribed to update actions on this particular resource."
                },
                "delete": {
                  "type": "boolean",
                  "description": "If true, the user will be notified when this particular resource is deleted."
                }
              }
            }
          }
        }
      },
      "SSLSecret": {
        "type": "object",
        "additionalProperties": false,
        "description": "The SSL secret of an app.",
        "properties": {
          "certificate": {
            "type": "string",
            "description": "The public SSL certificate chain in PEM format."
          },
          "key": {
            "type": "string",
            "description": "The SSL private key in PEM format."
          }
        }
      },
      "SSOConfiguration": {
        "type": "object",
        "description": "A single sign on configuration which is exposed to users.",
        "additionalProperties": false,
        "properties": {
          "url": {
            "type": "string",
            "format": "url",
            "description": "The URL users will be redirected to in the login process."
          },
          "name": {
            "type": "string",
            "description": "A user readable name for the configuration."
          },
          "icon": {
            "type": "string",
            "description": "A Font Awesome icon."
          }
        }
      },
      "ScimPatchOp": {
        "type": "object",
        "description": "A SCIM patch operation",
        "required": [
          "schemas",
          "operations"
        ],
        "additionalProperties": true,
        "properties": {
          "schemas": {
            "type": "array",
            "maxItems": 1,
            "minItems": 1,
            "items": {
              "enum": [
                "urn:ietf:params:scim:api:messages:2.0:PatchOp"
              ]
            }
          },
          "operations": {
            "type": "array",
            "description": "Patch operations to apply to the resource",
            "items": {
              "anyOf": [
                {
                  "type": "object",
                  "description": "A SCIM patch single replace operation",
                  "additionalProperties": false,
                  "required": [
                    "op",
                    "path",
                    "value"
                  ],
                  "properties": {
                    "op": {
                      "enum": [
                        "add",
                        "replace"
                      ]
                    },
                    "name": {
                      "type": "string"
                    },
                    "path": {
                      "type": "string"
                    },
                    "value": {}
                  }
                },
                {
                  "type": "object",
                  "description": "A SCIM patch bulk replace operation",
                  "additionalProperties": false,
                  "required": [
                    "op",
                    "path"
                  ],
                  "properties": {
                    "op": {
                      "enum": [
                        "remove"
                      ]
                    },
                    "path": {
                      "type": "string"
                    }
                  }
                }
              ]
            }
          }
        }
      },
      "ScimSecret": {
        "type": "object",
        "additionalProperties": false,
        "description": "An app’s SCIM configuration.",
        "properties": {
          "enabled": {
            "type": "boolean",
            "description": "Whether or not SCIM is enabled for the app."
          },
          "token": {
            "type": "string",
            "description": "The secret SCIM token"
          }
        }
      },
      "ScimUser": {
        "type": "object",
        "additionalProperties": true,
        "description": "The definition of a user according to the SCIM documentation.",
        "required": [
          "emails",
          "schemas",
          "userName"
        ],
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "userName": {
            "type": "string",
            "description": "A unique identifier for the user (generally maps to the Azure AD user principal name)"
          },
          "active": {
            "type": "boolean"
          },
          "meta": {
            "type": "object",
            "additionalProperties": false,
            "description": "Read-only metadata maintained by the service provider",
            "properties": {
              "resourceType": {
                "type": "string"
              },
              "created": {
                "type": "string"
              },
              "lastModified": {
                "type": "string"
              },
              "location": {
                "type": "string"
              }
            }
          },
          "emails": {
            "type": "array",
            "minLength": 1,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "description": "A user's email. By default, one of these should be of type 'work' and have 'primary' set to true. Value contains actual address",
              "required": [
                "primary",
                "type",
                "value"
              ],
              "properties": {
                "primary": {
                  "type": "boolean"
                },
                "type": {
                  "type": "string"
                },
                "value": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Training": {
        "type": "object",
        "description": "Object representation of a training",
        "additionalProperties": false,
        "required": [
          "id"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Id of the training"
          }
        }
      },
      "TrainingCompleted": {
        "type": "object",
        "description": "Object which stores that a user has completed a certain training",
        "additionalProperties": false,
        "properties": {
          "trainingId": {
            "type": "string",
            "description": "The training that the user has completed.",
            "readOnly": true
          },
          "userId": {
            "type": "string",
            "description": "The user who completed the training"
          }
        }
      },
      "User": {
        "type": "object",
        "description": "An object representing a user",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true,
            "description": "The id of the user."
          }
        }
      },
      "UserEmail": {
        "type": "object",
        "description": "\n    An email address that is linked to a user.\n\n    Users may use any of their email addresses to login.\n  ",
        "required": [
          "email"
        ],
        "additionalProperties": false,
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "description": "The email address that is registered"
          },
          "verified": {
            "type": "boolean",
            "readOnly": true,
            "description": "Wether or not the email address has been verified by the user."
          }
        }
      },
      "UserInfo": {
        "type": "object",
        "description": "An object representing the OAuth2 info of a user",
        "additionalProperties": false,
        "properties": {
          "sub": {
            "type": "string",
            "readOnly": true,
            "description": "The id of the user."
          },
          "name": {
            "type": "string",
            "description": "The full name of the user."
          },
          "email": {
            "type": "string",
            "description": "The email of the user."
          },
          "email_verified": {
            "type": "boolean",
            "description": "Whether this email address has been verified."
          },
          "picture": {
            "type": "string",
            "format": "url",
            "description": "The URL of the profile picture of the user."
          },
          "locale": {
            "type": "string",
            "description": "The locale of the user."
          },
          "timezone": {
            "enum": [
              "Africa/Abidjan",
              "Africa/Accra",
              "Africa/Addis_Ababa",
              "Africa/Algiers",
              "Africa/Asmera",
              "Africa/Bamako",
              "Africa/Bangui",
              "Africa/Banjul",
              "Africa/Bissau",
              "Africa/Blantyre",
              "Africa/Brazzaville",
              "Africa/Bujumbura",
              "Africa/Cairo",
              "Africa/Casablanca",
              "Africa/Ceuta",
              "Africa/Conakry",
              "Africa/Dakar",
              "Africa/Dar_es_Salaam",
              "Africa/Djibouti",
              "Africa/Douala",
              "Africa/El_Aaiun",
              "Africa/Freetown",
              "Africa/Gaborone",
              "Africa/Harare",
              "Africa/Johannesburg",
              "Africa/Juba",
              "Africa/Kampala",
              "Africa/Khartoum",
              "Africa/Kigali",
              "Africa/Kinshasa",
              "Africa/Lagos",
              "Africa/Libreville",
              "Africa/Lome",
              "Africa/Luanda",
              "Africa/Lubumbashi",
              "Africa/Lusaka",
              "Africa/Malabo",
              "Africa/Maputo",
              "Africa/Maseru",
              "Africa/Mbabane",
              "Africa/Mogadishu",
              "Africa/Monrovia",
              "Africa/Nairobi",
              "Africa/Ndjamena",
              "Africa/Niamey",
              "Africa/Nouakchott",
              "Africa/Ouagadougou",
              "Africa/Porto-Novo",
              "Africa/Sao_Tome",
              "Africa/Tripoli",
              "Africa/Tunis",
              "Africa/Windhoek",
              "America/Adak",
              "America/Anchorage",
              "America/Anguilla",
              "America/Antigua",
              "America/Araguaina",
              "America/Argentina/La_Rioja",
              "America/Argentina/Rio_Gallegos",
              "America/Argentina/Salta",
              "America/Argentina/San_Juan",
              "America/Argentina/San_Luis",
              "America/Argentina/Tucuman",
              "America/Argentina/Ushuaia",
              "America/Aruba",
              "America/Asuncion",
              "America/Bahia",
              "America/Bahia_Banderas",
              "America/Barbados",
              "America/Belem",
              "America/Belize",
              "America/Blanc-Sablon",
              "America/Boa_Vista",
              "America/Bogota",
              "America/Boise",
              "America/Buenos_Aires",
              "America/Cambridge_Bay",
              "America/Campo_Grande",
              "America/Cancun",
              "America/Caracas",
              "America/Catamarca",
              "America/Cayenne",
              "America/Cayman",
              "America/Chicago",
              "America/Chihuahua",
              "America/Ciudad_Juarez",
              "America/Coral_Harbour",
              "America/Cordoba",
              "America/Costa_Rica",
              "America/Coyhaique",
              "America/Creston",
              "America/Cuiaba",
              "America/Curacao",
              "America/Danmarkshavn",
              "America/Dawson",
              "America/Dawson_Creek",
              "America/Denver",
              "America/Detroit",
              "America/Dominica",
              "America/Edmonton",
              "America/Eirunepe",
              "America/El_Salvador",
              "America/Fort_Nelson",
              "America/Fortaleza",
              "America/Glace_Bay",
              "America/Godthab",
              "America/Goose_Bay",
              "America/Grand_Turk",
              "America/Grenada",
              "America/Guadeloupe",
              "America/Guatemala",
              "America/Guayaquil",
              "America/Guyana",
              "America/Halifax",
              "America/Havana",
              "America/Hermosillo",
              "America/Indiana/Knox",
              "America/Indiana/Marengo",
              "America/Indiana/Petersburg",
              "America/Indiana/Tell_City",
              "America/Indiana/Vevay",
              "America/Indiana/Vincennes",
              "America/Indiana/Winamac",
              "America/Indianapolis",
              "America/Inuvik",
              "America/Iqaluit",
              "America/Jamaica",
              "America/Jujuy",
              "America/Juneau",
              "America/Kentucky/Monticello",
              "America/Kralendijk",
              "America/La_Paz",
              "America/Lima",
              "America/Los_Angeles",
              "America/Louisville",
              "America/Lower_Princes",
              "America/Maceio",
              "America/Managua",
              "America/Manaus",
              "America/Marigot",
              "America/Martinique",
              "America/Matamoros",
              "America/Mazatlan",
              "America/Mendoza",
              "America/Menominee",
              "America/Merida",
              "America/Metlakatla",
              "America/Mexico_City",
              "America/Miquelon",
              "America/Moncton",
              "America/Monterrey",
              "America/Montevideo",
              "America/Montserrat",
              "America/Nassau",
              "America/New_York",
              "America/Nome",
              "America/Noronha",
              "America/North_Dakota/Beulah",
              "America/North_Dakota/Center",
              "America/North_Dakota/New_Salem",
              "America/Ojinaga",
              "America/Panama",
              "America/Paramaribo",
              "America/Phoenix",
              "America/Port-au-Prince",
              "America/Port_of_Spain",
              "America/Porto_Velho",
              "America/Puerto_Rico",
              "America/Punta_Arenas",
              "America/Rankin_Inlet",
              "America/Recife",
              "America/Regina",
              "America/Resolute",
              "America/Rio_Branco",
              "America/Santarem",
              "America/Santiago",
              "America/Santo_Domingo",
              "America/Sao_Paulo",
              "America/Scoresbysund",
              "America/Sitka",
              "America/St_Barthelemy",
              "America/St_Johns",
              "America/St_Kitts",
              "America/St_Lucia",
              "America/St_Thomas",
              "America/St_Vincent",
              "America/Swift_Current",
              "America/Tegucigalpa",
              "America/Thule",
              "America/Tijuana",
              "America/Toronto",
              "America/Tortola",
              "America/Vancouver",
              "America/Whitehorse",
              "America/Winnipeg",
              "America/Yakutat",
              "Antarctica/Casey",
              "Antarctica/Davis",
              "Antarctica/DumontDUrville",
              "Antarctica/Macquarie",
              "Antarctica/Mawson",
              "Antarctica/McMurdo",
              "Antarctica/Palmer",
              "Antarctica/Rothera",
              "Antarctica/Syowa",
              "Antarctica/Troll",
              "Antarctica/Vostok",
              "Arctic/Longyearbyen",
              "Asia/Aden",
              "Asia/Almaty",
              "Asia/Amman",
              "Asia/Anadyr",
              "Asia/Aqtau",
              "Asia/Aqtobe",
              "Asia/Ashgabat",
              "Asia/Atyrau",
              "Asia/Baghdad",
              "Asia/Bahrain",
              "Asia/Baku",
              "Asia/Bangkok",
              "Asia/Barnaul",
              "Asia/Beirut",
              "Asia/Bishkek",
              "Asia/Brunei",
              "Asia/Calcutta",
              "Asia/Chita",
              "Asia/Colombo",
              "Asia/Damascus",
              "Asia/Dhaka",
              "Asia/Dili",
              "Asia/Dubai",
              "Asia/Dushanbe",
              "Asia/Famagusta",
              "Asia/Gaza",
              "Asia/Hebron",
              "Asia/Hong_Kong",
              "Asia/Hovd",
              "Asia/Irkutsk",
              "Asia/Jakarta",
              "Asia/Jayapura",
              "Asia/Jerusalem",
              "Asia/Kabul",
              "Asia/Kamchatka",
              "Asia/Karachi",
              "Asia/Katmandu",
              "Asia/Khandyga",
              "Asia/Krasnoyarsk",
              "Asia/Kuala_Lumpur",
              "Asia/Kuching",
              "Asia/Kuwait",
              "Asia/Macau",
              "Asia/Magadan",
              "Asia/Makassar",
              "Asia/Manila",
              "Asia/Muscat",
              "Asia/Nicosia",
              "Asia/Novokuznetsk",
              "Asia/Novosibirsk",
              "Asia/Omsk",
              "Asia/Oral",
              "Asia/Phnom_Penh",
              "Asia/Pontianak",
              "Asia/Pyongyang",
              "Asia/Qatar",
              "Asia/Qostanay",
              "Asia/Qyzylorda",
              "Asia/Rangoon",
              "Asia/Riyadh",
              "Asia/Saigon",
              "Asia/Sakhalin",
              "Asia/Samarkand",
              "Asia/Seoul",
              "Asia/Shanghai",
              "Asia/Singapore",
              "Asia/Srednekolymsk",
              "Asia/Taipei",
              "Asia/Tashkent",
              "Asia/Tbilisi",
              "Asia/Tehran",
              "Asia/Thimphu",
              "Asia/Tokyo",
              "Asia/Tomsk",
              "Asia/Ulaanbaatar",
              "Asia/Urumqi",
              "Asia/Ust-Nera",
              "Asia/Vientiane",
              "Asia/Vladivostok",
              "Asia/Yakutsk",
              "Asia/Yekaterinburg",
              "Asia/Yerevan",
              "Atlantic/Azores",
              "Atlantic/Bermuda",
              "Atlantic/Canary",
              "Atlantic/Cape_Verde",
              "Atlantic/Faeroe",
              "Atlantic/Madeira",
              "Atlantic/Reykjavik",
              "Atlantic/South_Georgia",
              "Atlantic/St_Helena",
              "Atlantic/Stanley",
              "Australia/Adelaide",
              "Australia/Brisbane",
              "Australia/Broken_Hill",
              "Australia/Darwin",
              "Australia/Eucla",
              "Australia/Hobart",
              "Australia/Lindeman",
              "Australia/Lord_Howe",
              "Australia/Melbourne",
              "Australia/Perth",
              "Australia/Sydney",
              "Europe/Amsterdam",
              "Europe/Andorra",
              "Europe/Astrakhan",
              "Europe/Athens",
              "Europe/Belgrade",
              "Europe/Berlin",
              "Europe/Bratislava",
              "Europe/Brussels",
              "Europe/Bucharest",
              "Europe/Budapest",
              "Europe/Busingen",
              "Europe/Chisinau",
              "Europe/Copenhagen",
              "Europe/Dublin",
              "Europe/Gibraltar",
              "Europe/Guernsey",
              "Europe/Helsinki",
              "Europe/Isle_of_Man",
              "Europe/Istanbul",
              "Europe/Jersey",
              "Europe/Kaliningrad",
              "Europe/Kiev",
              "Europe/Kirov",
              "Europe/Lisbon",
              "Europe/Ljubljana",
              "Europe/London",
              "Europe/Luxembourg",
              "Europe/Madrid",
              "Europe/Malta",
              "Europe/Mariehamn",
              "Europe/Minsk",
              "Europe/Monaco",
              "Europe/Moscow",
              "Europe/Oslo",
              "Europe/Paris",
              "Europe/Podgorica",
              "Europe/Prague",
              "Europe/Riga",
              "Europe/Rome",
              "Europe/Samara",
              "Europe/San_Marino",
              "Europe/Sarajevo",
              "Europe/Saratov",
              "Europe/Simferopol",
              "Europe/Skopje",
              "Europe/Sofia",
              "Europe/Stockholm",
              "Europe/Tallinn",
              "Europe/Tirane",
              "Europe/Ulyanovsk",
              "Europe/Vaduz",
              "Europe/Vatican",
              "Europe/Vienna",
              "Europe/Vilnius",
              "Europe/Volgograd",
              "Europe/Warsaw",
              "Europe/Zagreb",
              "Europe/Zurich",
              "Indian/Antananarivo",
              "Indian/Chagos",
              "Indian/Christmas",
              "Indian/Cocos",
              "Indian/Comoro",
              "Indian/Kerguelen",
              "Indian/Mahe",
              "Indian/Maldives",
              "Indian/Mauritius",
              "Indian/Mayotte",
              "Indian/Reunion",
              "Pacific/Apia",
              "Pacific/Auckland",
              "Pacific/Bougainville",
              "Pacific/Chatham",
              "Pacific/Easter",
              "Pacific/Efate",
              "Pacific/Enderbury",
              "Pacific/Fakaofo",
              "Pacific/Fiji",
              "Pacific/Funafuti",
              "Pacific/Galapagos",
              "Pacific/Gambier",
              "Pacific/Guadalcanal",
              "Pacific/Guam",
              "Pacific/Honolulu",
              "Pacific/Kiritimati",
              "Pacific/Kosrae",
              "Pacific/Kwajalein",
              "Pacific/Majuro",
              "Pacific/Marquesas",
              "Pacific/Midway",
              "Pacific/Nauru",
              "Pacific/Niue",
              "Pacific/Norfolk",
              "Pacific/Noumea",
              "Pacific/Pago_Pago",
              "Pacific/Palau",
              "Pacific/Pitcairn",
              "Pacific/Ponape",
              "Pacific/Port_Moresby",
              "Pacific/Rarotonga",
              "Pacific/Saipan",
              "Pacific/Tahiti",
              "Pacific/Tarawa",
              "Pacific/Tongatapu",
              "Pacific/Truk",
              "Pacific/Wake",
              "Pacific/Wallis"
            ],
            "description": "The time zone of the user."
          },
          "subscribed": {
            "type": "boolean",
            "description": "If the user is subscribed to the newsletter."
          }
        }
      }
    },
    "securitySchemes": {
      "app": {
        "type": "oauth2",
        "description": "\n    OAuth2 login for apps.\n\n    The authorization code flow is recommended. The password flow exists for legacy apps and will be\n    removed in the future.\n  ",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "/connect/authorize",
            "tokenUrl": "/apps/{appId}/auth/oauth2/token",
            "refreshUrl": "/apps/{appId}/auth/oauth2/token",
            "scopes": {
              "email": "Read the user email address.",
              "openid": "Login the user to the requesting app using OpenID.",
              "profile": "Read the user profile, including the display name and profile picture.",
              "resources:manage": "Manage app resources on behalf of a user.",
              "groups:read": "Read the groups the user is a part of.",
              "groups:write": "Add new members to a group."
            }
          },
          "password": {
            "tokenUrl": "/apps/{appId}/auth/oauth2/token",
            "refreshUrl": "/apps/{appId}/auth/oauth2/token",
            "scopes": {
              "email": "Read the user email address.",
              "openid": "Login the user to the requesting app using OpenID.",
              "profile": "Read the user profile, including the display name and profile picture.",
              "resources:manage": "Manage app resources on behalf of a user.",
              "groups:read": "Read the groups the user is a part of.",
              "groups:write": "Add new members to a group."
            }
          }
        }
      },
      "basic": {
        "type": "http",
        "scheme": "basic",
        "description": "Used for logging in to the web interface"
      },
      "cli": {
        "type": "oauth2",
        "description": "\n    OAuth2 login for client credentials.\n\n    For example the Appsemble CLI uses this.\n  ",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "/auth/oauth2/token",
            "scopes": {
              "apps:export": "Export apps as zip files",
              "apps:write": "Create and update apps",
              "apps:delete": "Delete apps",
              "blocks:write": "Register and update blocks, and publish new block versions.",
              "blocks:delete": "Delete specific block versions.",
              "organizations:write": "Create and manage organizations.",
              "resources:read": "Read app resources on behalf of a user.",
              "resources:write": "Modify app resources on behalf of a user.",
              "assets:write": "Create app assets on behalf of a user.",
              "groups:read": "Read information about the user’s groups.",
              "groups:write": "Read information about the user’s groups."
            }
          }
        }
      },
      "scim": {
        "type": "http",
        "scheme": "bearer",
        "description": "Used SCIM clients"
      },
      "studio": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "jwt",
        "description": "Used for authenticating requests made using Appsemble studio interface."
      },
      "webhook": {
        "type": "http",
        "scheme": "bearer",
        "description": "Used for webhook calls"
      }
    }
  },
  "externalDocs": {
    "description": "Appsemble developer documentation",
    "url": "https://appsemble.app:9999/docs"
  },
  "info": {
    "title": "Appsemble",
    "description": "Welcome to the Appsemble API.\n\nThe app studio can be found on\n> <https://appsemble.app:9999>\n\nThe OpenAPI explorer can be found on\n> <https://appsemble.app:9999/api-explorer>\n",
    "license": {
      "name": "LGPL",
      "url": "https://gitlab.com/appsemble/appsemble/blob/main/LICENSE.md"
    },
    "version": "0.36.6-test.0"
  },
  "paths": {
    "/api/app-collections/{appCollectionId}/apps/{appId}/pinned": {
      "post": {
        "tags": [
          "main",
          "app-collection",
          "app"
        ],
        "description": "Pin an app to an app collection",
        "operationId": "pinAppToAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection to pin the app to",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          },
          {
            "name": "appId",
            "in": "path",
            "description": "The id of the app to pin",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/App/properties/id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The app was pinned to the app collection",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "pinned": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "delete": {
        "tags": [
          "main",
          "app-collection",
          "app"
        ],
        "description": "Unpin an app from an app collection",
        "operationId": "unpinAppFromAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection to unpin the app from",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          },
          {
            "name": "appId",
            "in": "path",
            "description": "The id of the app to unpin",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/App/properties/id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The app was unpinned from the app collection"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/app-collections/{appCollectionId}/apps/{appId}": {
      "delete": {
        "tags": [
          "main",
          "app-collection",
          "app"
        ],
        "description": "Remove an app from an app collection",
        "operationId": "removeAppFromAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          },
          {
            "name": "appId",
            "in": "path",
            "description": "The id of the app",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The app was removed from the app collection"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/app-collections/{appCollectionId}/apps": {
      "get": {
        "tags": [
          "main",
          "app-collection",
          "app"
        ],
        "description": "Get a list of apps in an app collection",
        "operationId": "queryAppCollectionApps",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          },
          {
            "name": "language",
            "in": "query",
            "description": "The language to include the translations of, if available",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of apps",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/App"
                      },
                      {
                        "type": "object",
                        "properties": {
                          "pinned": {
                            "type": "string",
                            "format": "date-time",
                            "nullable": true
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      },
      "post": {
        "tags": [
          "main",
          "app-collection",
          "app"
        ],
        "description": "Add an app to an app collection",
        "operationId": "addAppToAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "requestBody": {
          "description": "The app to add to the app collection",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "AppId": {
                    "$ref": "#/components/schemas/App/properties/id"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The app was added to the app collection"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/app-collections/{appCollectionId}/expert/profile-image": {
      "get": {
        "tags": [
          "main",
          "app-collection"
        ],
        "description": "Get an app collection’s expert’s profile image",
        "operationId": "getAppCollectionExpertProfileImage",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The app collection’s expert’s profile image",
            "content": {
              "image/png": {},
              "image/jpeg": {},
              "image/tiff": {},
              "image/webp": {}
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/app-collections/{appCollectionId}/header-image": {
      "get": {
        "tags": [
          "main",
          "app-collection"
        ],
        "description": "Get an app collection’s header image",
        "operationId": "getAppCollectionHeaderImage",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The app collection’s header image",
            "content": {
              "image/png": {},
              "image/jpeg": {},
              "image/tiff": {},
              "image/webp": {}
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/app-collections/{appCollectionId}": {
      "get": {
        "tags": [
          "main",
          "app-collection"
        ],
        "description": "Get an app collection",
        "operationId": "getAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "An app collection",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppCollection"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      },
      "patch": {
        "tags": [
          "main",
          "app-collection"
        ],
        "description": "Update an app collection",
        "operationId": "updateAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "requestBody": {
          "description": "The app collection to update",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AppCollectionDefinition"
              },
              "encoding": {
                "expertProfileImage": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                },
                "headerImage": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated app collection",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppCollection"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "delete": {
        "tags": [
          "main",
          "app-collection"
        ],
        "description": "Delete an app collection",
        "operationId": "deleteAppCollection",
        "parameters": [
          {
            "name": "appCollectionId",
            "in": "path",
            "description": "The id of the app collection",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AppCollection/properties/id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "The app collection was deleted"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/app-collections": {
      "get": {
        "tags": [
          "main",
          "app-collection"
        ],
        "description": "Get a list of app collections",
        "operationId": "queryAppCollections",
        "responses": {
          "200": {
            "description": "A list of app collections",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppCollection"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/app-invites/{token}/respond": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "token",
          "in": "path",
          "description": "The token of the invite.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "post": {
        "tags": [
          "app-invite"
        ],
        "description": "Respond to a given invitation.",
        "operationId": "respondAppInvite",
        "requestBody": {
          "description": "The response of the invitation.\n\n        If response is true, user will join the app. If response is false, the user declines the invite and the invite is removed.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "response"
                ],
                "properties": {
                  "response": {
                    "type": "boolean"
                  },
                  "password": {
                    "type": "string",
                    "minLength": 8
                  },
                  "timezone": {
                    "enum": [
                      "Africa/Abidjan",
                      "Africa/Accra",
                      "Africa/Addis_Ababa",
                      "Africa/Algiers",
                      "Africa/Asmera",
                      "Africa/Bamako",
                      "Africa/Bangui",
                      "Africa/Banjul",
                      "Africa/Bissau",
                      "Africa/Blantyre",
                      "Africa/Brazzaville",
                      "Africa/Bujumbura",
                      "Africa/Cairo",
                      "Africa/Casablanca",
                      "Africa/Ceuta",
                      "Africa/Conakry",
                      "Africa/Dakar",
                      "Africa/Dar_es_Salaam",
                      "Africa/Djibouti",
                      "Africa/Douala",
                      "Africa/El_Aaiun",
                      "Africa/Freetown",
                      "Africa/Gaborone",
                      "Africa/Harare",
                      "Africa/Johannesburg",
                      "Africa/Juba",
                      "Africa/Kampala",
                      "Africa/Khartoum",
                      "Africa/Kigali",
                      "Africa/Kinshasa",
                      "Africa/Lagos",
                      "Africa/Libreville",
                      "Africa/Lome",
                      "Africa/Luanda",
                      "Africa/Lubumbashi",
                      "Africa/Lusaka",
                      "Africa/Malabo",
                      "Africa/Maputo",
                      "Africa/Maseru",
                      "Africa/Mbabane",
                      "Africa/Mogadishu",
                      "Africa/Monrovia",
                      "Africa/Nairobi",
                      "Africa/Ndjamena",
                      "Africa/Niamey",
                      "Africa/Nouakchott",
                      "Africa/Ouagadougou",
                      "Africa/Porto-Novo",
                      "Africa/Sao_Tome",
                      "Africa/Tripoli",
                      "Africa/Tunis",
                      "Africa/Windhoek",
                      "America/Adak",
                      "America/Anchorage",
                      "America/Anguilla",
                      "America/Antigua",
                      "America/Araguaina",
                      "America/Argentina/La_Rioja",
                      "America/Argentina/Rio_Gallegos",
                      "America/Argentina/Salta",
                      "America/Argentina/San_Juan",
                      "America/Argentina/San_Luis",
                      "America/Argentina/Tucuman",
                      "America/Argentina/Ushuaia",
                      "America/Aruba",
                      "America/Asuncion",
                      "America/Bahia",
                      "America/Bahia_Banderas",
                      "America/Barbados",
                      "America/Belem",
                      "America/Belize",
                      "America/Blanc-Sablon",
                      "America/Boa_Vista",
                      "America/Bogota",
                      "America/Boise",
                      "America/Buenos_Aires",
                      "America/Cambridge_Bay",
                      "America/Campo_Grande",
                      "America/Cancun",
                      "America/Caracas",
                      "America/Catamarca",
                      "America/Cayenne",
                      "America/Cayman",
                      "America/Chicago",
                      "America/Chihuahua",
                      "America/Ciudad_Juarez",
                      "America/Coral_Harbour",
                      "America/Cordoba",
                      "America/Costa_Rica",
                      "America/Coyhaique",
                      "America/Creston",
                      "America/Cuiaba",
                      "America/Curacao",
                      "America/Danmarkshavn",
                      "America/Dawson",
                      "America/Dawson_Creek",
                      "America/Denver",
                      "America/Detroit",
                      "America/Dominica",
                      "America/Edmonton",
                      "America/Eirunepe",
                      "America/El_Salvador",
                      "America/Fort_Nelson",
                      "America/Fortaleza",
                      "America/Glace_Bay",
                      "America/Godthab",
                      "America/Goose_Bay",
                      "America/Grand_Turk",
                      "America/Grenada",
                      "America/Guadeloupe",
                      "America/Guatemala",
                      "America/Guayaquil",
                      "America/Guyana",
                      "America/Halifax",
                      "America/Havana",
                      "America/Hermosillo",
                      "America/Indiana/Knox",
                      "America/Indiana/Marengo",
                      "America/Indiana/Petersburg",
                      "America/Indiana/Tell_City",
                      "America/Indiana/Vevay",
                      "America/Indiana/Vincennes",
                      "America/Indiana/Winamac",
                      "America/Indianapolis",
                      "America/Inuvik",
                      "America/Iqaluit",
                      "America/Jamaica",
                      "America/Jujuy",
                      "America/Juneau",
                      "America/Kentucky/Monticello",
                      "America/Kralendijk",
                      "America/La_Paz",
                      "America/Lima",
                      "America/Los_Angeles",
                      "America/Louisville",
                      "America/Lower_Princes",
                      "America/Maceio",
                      "America/Managua",
                      "America/Manaus",
                      "America/Marigot",
                      "America/Martinique",
                      "America/Matamoros",
                      "America/Mazatlan",
                      "America/Mendoza",
                      "America/Menominee",
                      "America/Merida",
                      "America/Metlakatla",
                      "America/Mexico_City",
                      "America/Miquelon",
                      "America/Moncton",
                      "America/Monterrey",
                      "America/Montevideo",
                      "America/Montserrat",
                      "America/Nassau",
                      "America/New_York",
                      "America/Nome",
                      "America/Noronha",
                      "America/North_Dakota/Beulah",
                      "America/North_Dakota/Center",
                      "America/North_Dakota/New_Salem",
                      "America/Ojinaga",
                      "America/Panama",
                      "America/Paramaribo",
                      "America/Phoenix",
                      "America/Port-au-Prince",
                      "America/Port_of_Spain",
                      "America/Porto_Velho",
                      "America/Puerto_Rico",
                      "America/Punta_Arenas",
                      "America/Rankin_Inlet",
                      "America/Recife",
                      "America/Regina",
                      "America/Resolute",
                      "America/Rio_Branco",
                      "America/Santarem",
                      "America/Santiago",
                      "America/Santo_Domingo",
                      "America/Sao_Paulo",
                      "America/Scoresbysund",
                      "America/Sitka",
                      "America/St_Barthelemy",
                      "America/St_Johns",
                      "America/St_Kitts",
                      "America/St_Lucia",
                      "America/St_Thomas",
                      "America/St_Vincent",
                      "America/Swift_Current",
                      "America/Tegucigalpa",
                      "America/Thule",
                      "America/Tijuana",
                      "America/Toronto",
                      "America/Tortola",
                      "America/Vancouver",
                      "America/Whitehorse",
                      "America/Winnipeg",
                      "America/Yakutat",
                      "Antarctica/Casey",
                      "Antarctica/Davis",
                      "Antarctica/DumontDUrville",
                      "Antarctica/Macquarie",
                      "Antarctica/Mawson",
                      "Antarctica/McMurdo",
                      "Antarctica/Palmer",
                      "Antarctica/Rothera",
                      "Antarctica/Syowa",
                      "Antarctica/Troll",
                      "Antarctica/Vostok",
                      "Arctic/Longyearbyen",
                      "Asia/Aden",
                      "Asia/Almaty",
                      "Asia/Amman",
                      "Asia/Anadyr",
                      "Asia/Aqtau",
                      "Asia/Aqtobe",
                      "Asia/Ashgabat",
                      "Asia/Atyrau",
                      "Asia/Baghdad",
                      "Asia/Bahrain",
                      "Asia/Baku",
                      "Asia/Bangkok",
                      "Asia/Barnaul",
                      "Asia/Beirut",
                      "Asia/Bishkek",
                      "Asia/Brunei",
                      "Asia/Calcutta",
                      "Asia/Chita",
                      "Asia/Colombo",
                      "Asia/Damascus",
                      "Asia/Dhaka",
                      "Asia/Dili",
                      "Asia/Dubai",
                      "Asia/Dushanbe",
                      "Asia/Famagusta",
                      "Asia/Gaza",
                      "Asia/Hebron",
                      "Asia/Hong_Kong",
                      "Asia/Hovd",
                      "Asia/Irkutsk",
                      "Asia/Jakarta",
                      "Asia/Jayapura",
                      "Asia/Jerusalem",
                      "Asia/Kabul",
                      "Asia/Kamchatka",
                      "Asia/Karachi",
                      "Asia/Katmandu",
                      "Asia/Khandyga",
                      "Asia/Krasnoyarsk",
                      "Asia/Kuala_Lumpur",
                      "Asia/Kuching",
                      "Asia/Kuwait",
                      "Asia/Macau",
                      "Asia/Magadan",
                      "Asia/Makassar",
                      "Asia/Manila",
                      "Asia/Muscat",
                      "Asia/Nicosia",
                      "Asia/Novokuznetsk",
                      "Asia/Novosibirsk",
                      "Asia/Omsk",
                      "Asia/Oral",
                      "Asia/Phnom_Penh",
                      "Asia/Pontianak",
                      "Asia/Pyongyang",
                      "Asia/Qatar",
                      "Asia/Qostanay",
                      "Asia/Qyzylorda",
                      "Asia/Rangoon",
                      "Asia/Riyadh",
                      "Asia/Saigon",
                      "Asia/Sakhalin",
                      "Asia/Samarkand",
                      "Asia/Seoul",
                      "Asia/Shanghai",
                      "Asia/Singapore",
                      "Asia/Srednekolymsk",
                      "Asia/Taipei",
                      "Asia/Tashkent",
                      "Asia/Tbilisi",
                      "Asia/Tehran",
                      "Asia/Thimphu",
                      "Asia/Tokyo",
                      "Asia/Tomsk",
                      "Asia/Ulaanbaatar",
                      "Asia/Urumqi",
                      "Asia/Ust-Nera",
                      "Asia/Vientiane",
                      "Asia/Vladivostok",
                      "Asia/Yakutsk",
                      "Asia/Yekaterinburg",
                      "Asia/Yerevan",
                      "Atlantic/Azores",
                      "Atlantic/Bermuda",
                      "Atlantic/Canary",
                      "Atlantic/Cape_Verde",
                      "Atlantic/Faeroe",
                      "Atlantic/Madeira",
                      "Atlantic/Reykjavik",
                      "Atlantic/South_Georgia",
                      "Atlantic/St_Helena",
                      "Atlantic/Stanley",
                      "Australia/Adelaide",
                      "Australia/Brisbane",
                      "Australia/Broken_Hill",
                      "Australia/Darwin",
                      "Australia/Eucla",
                      "Australia/Hobart",
                      "Australia/Lindeman",
                      "Australia/Lord_Howe",
                      "Australia/Melbourne",
                      "Australia/Perth",
                      "Australia/Sydney",
                      "Europe/Amsterdam",
                      "Europe/Andorra",
                      "Europe/Astrakhan",
                      "Europe/Athens",
                      "Europe/Belgrade",
                      "Europe/Berlin",
                      "Europe/Bratislava",
                      "Europe/Brussels",
                      "Europe/Bucharest",
                      "Europe/Budapest",
                      "Europe/Busingen",
                      "Europe/Chisinau",
                      "Europe/Copenhagen",
                      "Europe/Dublin",
                      "Europe/Gibraltar",
                      "Europe/Guernsey",
                      "Europe/Helsinki",
                      "Europe/Isle_of_Man",
                      "Europe/Istanbul",
                      "Europe/Jersey",
                      "Europe/Kaliningrad",
                      "Europe/Kiev",
                      "Europe/Kirov",
                      "Europe/Lisbon",
                      "Europe/Ljubljana",
                      "Europe/London",
                      "Europe/Luxembourg",
                      "Europe/Madrid",
                      "Europe/Malta",
                      "Europe/Mariehamn",
                      "Europe/Minsk",
                      "Europe/Monaco",
                      "Europe/Moscow",
                      "Europe/Oslo",
                      "Europe/Paris",
                      "Europe/Podgorica",
                      "Europe/Prague",
                      "Europe/Riga",
                      "Europe/Rome",
                      "Europe/Samara",
                      "Europe/San_Marino",
                      "Europe/Sarajevo",
                      "Europe/Saratov",
                      "Europe/Simferopol",
                      "Europe/Skopje",
                      "Europe/Sofia",
                      "Europe/Stockholm",
                      "Europe/Tallinn",
                      "Europe/Tirane",
                      "Europe/Ulyanovsk",
                      "Europe/Vaduz",
                      "Europe/Vatican",
                      "Europe/Vienna",
                      "Europe/Vilnius",
                      "Europe/Volgograd",
                      "Europe/Warsaw",
                      "Europe/Zagreb",
                      "Europe/Zurich",
                      "Indian/Antananarivo",
                      "Indian/Chagos",
                      "Indian/Christmas",
                      "Indian/Cocos",
                      "Indian/Comoro",
                      "Indian/Kerguelen",
                      "Indian/Mahe",
                      "Indian/Maldives",
                      "Indian/Mauritius",
                      "Indian/Mayotte",
                      "Indian/Reunion",
                      "Pacific/Apia",
                      "Pacific/Auckland",
                      "Pacific/Bougainville",
                      "Pacific/Chatham",
                      "Pacific/Easter",
                      "Pacific/Efate",
                      "Pacific/Enderbury",
                      "Pacific/Fakaofo",
                      "Pacific/Fiji",
                      "Pacific/Funafuti",
                      "Pacific/Galapagos",
                      "Pacific/Gambier",
                      "Pacific/Guadalcanal",
                      "Pacific/Guam",
                      "Pacific/Honolulu",
                      "Pacific/Kiritimati",
                      "Pacific/Kosrae",
                      "Pacific/Kwajalein",
                      "Pacific/Majuro",
                      "Pacific/Marquesas",
                      "Pacific/Midway",
                      "Pacific/Nauru",
                      "Pacific/Niue",
                      "Pacific/Norfolk",
                      "Pacific/Noumea",
                      "Pacific/Pago_Pago",
                      "Pacific/Palau",
                      "Pacific/Pitcairn",
                      "Pacific/Ponape",
                      "Pacific/Port_Moresby",
                      "Pacific/Rarotonga",
                      "Pacific/Saipan",
                      "Pacific/Tahiti",
                      "Pacific/Tarawa",
                      "Pacific/Tongatapu",
                      "Pacific/Truk",
                      "Pacific/Wake",
                      "Pacific/Wallis"
                    ]
                  },
                  "locale": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The response has been processed."
          }
        }
      }
    },
    "/api/apps/{appId}/app-invites/{token}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "token",
          "in": "path",
          "description": "The token of the invite.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "app-invite"
        ],
        "description": "Fetch information about an invite.",
        "operationId": "getAppInvite",
        "responses": {
          "200": {
            "description": "An invite response",
            "$ref": "#/components/responses/invite"
          }
        }
      }
    },
    "/api/apps/{appId}/app-members/{appMemberId}/picture": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "appMemberId",
          "in": "path",
          "description": "The id of the member on which to perform the operation",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/AppMember/properties/id"
          }
        }
      ],
      "get": {
        "tags": [
          "common",
          "app-member"
        ],
        "description": "Get an app member’s profile picture.\n\n  This will return a 404 if the user has not uploaded one.",
        "operationId": "getAppMemberPicture",
        "responses": {
          "200": {
            "description": "The profile picture of the app member.",
            "content": {
              "image/png": {},
              "image/jpeg": {},
              "image/tiff": {},
              "image/webp": {}
            }
          }
        }
      }
    },
    "/api/apps/{appId}/app-members/{appMemberId}/properties": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "appMemberId",
          "in": "path",
          "description": "The id of the app member on which to perform an operation",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/AppMember/properties/id"
          }
        }
      ],
      "patch": {
        "tags": [
          "common",
          "app-member"
        ],
        "description": "Patch the properties of an app member.",
        "operationId": "patchAppMemberProperties",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "properties": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "The member’s custom properties."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated app member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "app": []
          }
        ]
      },
      "put": {
        "tags": [
          "common",
          "app-member",
          "update"
        ],
        "description": "Update the properties of an app member.",
        "operationId": "updateAppMemberProperties",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "properties": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "The member’s custom properties."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated app member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/app-members/{appMemberId}/role": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "appMemberId",
          "in": "path",
          "description": "The id of the app member on which to perform an operation",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/AppMember/properties/id"
          }
        }
      ],
      "put": {
        "tags": [
          "common",
          "app",
          "member"
        ],
        "description": "Patch an app member.",
        "operationId": "updateAppMemberRole",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "role": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated app member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": []
          }
        ]
      }
    },
    "/api/apps/{appId}/app-members/{appMemberId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "appMemberId",
          "in": "path",
          "description": "The id of the app member on which to perform an operation",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/AppMember/properties/id"
          }
        }
      ],
      "delete": {
        "tags": [
          "common",
          "app-member"
        ],
        "description": "Delete an app member.",
        "operationId": "deleteAppMember",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "responses": {
          "204": {
            "description": "The app member was deleted successfully."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/actions/{path}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "in": "path",
          "name": "path",
          "description": "The path to the action to execute.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "app",
          "action"
        ],
        "description": "Proxy a GET request action",
        "operationId": "proxyGet",
        "responses": {
          "default": {
            "description": "The proxied response"
          }
        },
        "security": [
          {
            "app": [
              "email",
              "profile"
            ]
          },
          {}
        ],
        "parameters": [
          {
            "in": "query",
            "name": "data",
            "description": "The data that was passed to the action",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "delete": {
        "tags": [
          "app",
          "action"
        ],
        "description": "Proxy a DELETE request action",
        "operationId": "proxyDelete",
        "responses": {
          "default": {
            "description": "The proxied response"
          }
        },
        "security": [
          {
            "app": [
              "email",
              "profile"
            ]
          },
          {}
        ],
        "parameters": [
          {
            "in": "query",
            "name": "data",
            "description": "The data that was passed to the action",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "app",
          "action"
        ],
        "description": "Proxy a PATCH request action",
        "operationId": "proxyPatch",
        "responses": {
          "default": {
            "description": "The proxied response"
          }
        },
        "security": [
          {
            "app": [
              "email",
              "profile"
            ]
          },
          {}
        ],
        "requestBody": {
          "description": "The data that was passed to the action",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "description": "A `multipart/form-data` representation of a resource.",
                "additionalProperties": true,
                "properties": {
                  "resource": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Resource"
                    }
                  },
                  "assets": {
                    "type": "array",
                    "description": "A list of assets that should be linked to the resource.",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            },
            "*/*": {}
          }
        }
      },
      "post": {
        "tags": [
          "app",
          "action"
        ],
        "description": "Proxy a POST request action",
        "operationId": "proxyPost",
        "responses": {
          "default": {
            "description": "The proxied response"
          }
        },
        "security": [
          {
            "app": [
              "email",
              "profile"
            ]
          },
          {}
        ],
        "requestBody": {
          "description": "The data that was passed to the action",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "description": "A `multipart/form-data` representation of a resource.",
                "additionalProperties": true,
                "properties": {
                  "resource": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Resource"
                    }
                  },
                  "assets": {
                    "type": "array",
                    "description": "A list of assets that should be linked to the resource.",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            },
            "*/*": {}
          }
        }
      },
      "put": {
        "tags": [
          "app",
          "action"
        ],
        "description": "Proxy a PUT request action",
        "operationId": "proxyPut",
        "responses": {
          "default": {
            "description": "The proxied response"
          }
        },
        "security": [
          {
            "app": [
              "email",
              "profile"
            ]
          },
          {}
        ],
        "requestBody": {
          "description": "The data that was passed to the action",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "description": "A `multipart/form-data` representation of a resource.",
                "additionalProperties": true,
                "properties": {
                  "resource": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Resource"
                    }
                  },
                  "assets": {
                    "type": "array",
                    "description": "A list of assets that should be linked to the resource.",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            },
            "*/*": {}
          }
        }
      }
    },
    "/api/apps/{appId}/clonable-assets": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Check if an app has clonable assets.",
        "operationId": "checkAppClonableAssets",
        "responses": {
          "200": {
            "description": "Whether the app has clonable assets.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/clonable-resources": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Check if an app has clonable resources.",
        "operationId": "checkAppClonableResources",
        "responses": {
          "200": {
            "description": "Whether the app has clonable resources.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "boolean"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/assets/\\$count": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Get the number of assets in the app.",
        "operationId": "countAppAssets",
        "responses": {
          "200": {
            "description": "The number of assets in the app.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "number"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:read"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/assets/{assetId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/assetId"
        },
        {
          "$ref": "#/components/parameters/width"
        },
        {
          "$ref": "#/components/parameters/height"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Get a single asset",
        "operationId": "getAppAssetById",
        "responses": {
          "200": {
            "description": "The asset that matches the given id."
          }
        }
      },
      "head": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Get the headers for a single asset",
        "operationId": "getAppAssetHeadersById",
        "responses": {
          "200": {
            "description": "The headers of the asset that matches the given id."
          }
        }
      },
      "delete": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Remove an existing asset",
        "operationId": "deleteAppAsset",
        "responses": {
          "204": {
            "description": "The asset was successfully deleted."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/assets": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Get all of the app’s assets.",
        "operationId": "queryAppAssets",
        "parameters": [
          {
            "$ref": "#/components/parameters/$skip"
          },
          {
            "$ref": "#/components/parameters/$top"
          },
          {
            "$ref": "#/components/parameters/seed"
          }
        ],
        "responses": {
          "200": {
            "description": "The assets associated with the app.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      },
      "post": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Upload a new asset.",
        "operationId": "createAppAsset",
        "parameters": [
          {
            "$ref": "#/components/parameters/seed"
          }
        ],
        "requestBody": {
          "description": "The asset to upload.",
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "description": "The request body for creating an asset.",
                "additionalProperties": false,
                "required": [
                  "file"
                ],
                "properties": {
                  "file": {
                    "type": "string",
                    "format": "binary",
                    "writeOnly": true,
                    "description": "The binary data of the asset. This may include a filename."
                  },
                  "name": {
                    "type": "string",
                    "pattern": "^([0-9a-z](?:(?!.*--)[-0-9a-z]*[0-9a-z])?)$",
                    "description": "The given name of the asset. Assets may be referenced by their name or ID in the API."
                  },
                  "clonable": {
                    "type": "boolean",
                    "description": "Whether the asset should be transferable when cloning the app they are in."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The asset that was created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "assets:write"
            ]
          },
          {}
        ]
      },
      "delete": {
        "tags": [
          "common",
          "app",
          "asset"
        ],
        "description": "Delete multiple app assets.",
        "operationId": "deleteAppAssets",
        "parameters": [
          {
            "$ref": "#/components/parameters/seed"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "description": "An array of asset IDs to remove.",
                "items": {
                  "$ref": "#/components/schemas/Asset/properties/id"
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The app assets have been deleted successfully."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "assets:write"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/broadcast": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Broadcast a push notification to every subscriber of the app.",
        "operationId": "sendAppNotifications",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "The data to include in the notification",
                "required": [
                  "body"
                ],
                "properties": {
                  "title": {
                    "description": "The title of the notification. This defaults to the name of the app if not otherwise specified.",
                    "type": "string"
                  },
                  "body": {
                    "description": "The content of the notification",
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The notification has been successfully broadcasted."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/demo-groups": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "demo-group"
        ],
        "description": "Get a list of app groups.",
        "operationId": "getAppDemoGroups",
        "responses": {
          "200": {
            "description": "The list of all groups.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "description": "An app demo group",
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "number"
                      },
                      "name": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/demo-members": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/roles"
        },
        {
          "$ref": "#/components/parameters/$filter"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "demo-member"
        ],
        "description": "Fetch all demo members of an app.",
        "operationId": "queryAppDemoMembers",
        "responses": {
          "200": {
            "description": "The list of app demo members.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppMemberInfo"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": []
          },
          {}
        ]
      },
      "post": {
        "tags": [
          "main",
          "seed-app-members",
          "demo-member",
          "app"
        ],
        "description": "Seed demo app members from the cli.",
        "operationId": "seedDemoAppMembers",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "additionalProperties": false,
                "items": {
                  "type": "object",
                  "required": [
                    "name",
                    "role"
                  ],
                  "properties": {
                    "name": {
                      "type": "string"
                    },
                    "role": {
                      "type": "string"
                    },
                    "properties": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "string"
                      },
                      "description": "The member’s custom properties."
                    },
                    "timezone": {
                      "enum": [
                        "Africa/Abidjan",
                        "Africa/Accra",
                        "Africa/Addis_Ababa",
                        "Africa/Algiers",
                        "Africa/Asmera",
                        "Africa/Bamako",
                        "Africa/Bangui",
                        "Africa/Banjul",
                        "Africa/Bissau",
                        "Africa/Blantyre",
                        "Africa/Brazzaville",
                        "Africa/Bujumbura",
                        "Africa/Cairo",
                        "Africa/Casablanca",
                        "Africa/Ceuta",
                        "Africa/Conakry",
                        "Africa/Dakar",
                        "Africa/Dar_es_Salaam",
                        "Africa/Djibouti",
                        "Africa/Douala",
                        "Africa/El_Aaiun",
                        "Africa/Freetown",
                        "Africa/Gaborone",
                        "Africa/Harare",
                        "Africa/Johannesburg",
                        "Africa/Juba",
                        "Africa/Kampala",
                        "Africa/Khartoum",
                        "Africa/Kigali",
                        "Africa/Kinshasa",
                        "Africa/Lagos",
                        "Africa/Libreville",
                        "Africa/Lome",
                        "Africa/Luanda",
                        "Africa/Lubumbashi",
                        "Africa/Lusaka",
                        "Africa/Malabo",
                        "Africa/Maputo",
                        "Africa/Maseru",
                        "Africa/Mbabane",
                        "Africa/Mogadishu",
                        "Africa/Monrovia",
                        "Africa/Nairobi",
                        "Africa/Ndjamena",
                        "Africa/Niamey",
                        "Africa/Nouakchott",
                        "Africa/Ouagadougou",
                        "Africa/Porto-Novo",
                        "Africa/Sao_Tome",
                        "Africa/Tripoli",
                        "Africa/Tunis",
                        "Africa/Windhoek",
                        "America/Adak",
                        "America/Anchorage",
                        "America/Anguilla",
                        "America/Antigua",
                        "America/Araguaina",
                        "America/Argentina/La_Rioja",
                        "America/Argentina/Rio_Gallegos",
                        "America/Argentina/Salta",
                        "America/Argentina/San_Juan",
                        "America/Argentina/San_Luis",
                        "America/Argentina/Tucuman",
                        "America/Argentina/Ushuaia",
                        "America/Aruba",
                        "America/Asuncion",
                        "America/Bahia",
                        "America/Bahia_Banderas",
                        "America/Barbados",
                        "America/Belem",
                        "America/Belize",
                        "America/Blanc-Sablon",
                        "America/Boa_Vista",
                        "America/Bogota",
                        "America/Boise",
                        "America/Buenos_Aires",
                        "America/Cambridge_Bay",
                        "America/Campo_Grande",
                        "America/Cancun",
                        "America/Caracas",
                        "America/Catamarca",
                        "America/Cayenne",
                        "America/Cayman",
                        "America/Chicago",
                        "America/Chihuahua",
                        "America/Ciudad_Juarez",
                        "America/Coral_Harbour",
                        "America/Cordoba",
                        "America/Costa_Rica",
                        "America/Coyhaique",
                        "America/Creston",
                        "America/Cuiaba",
                        "America/Curacao",
                        "America/Danmarkshavn",
                        "America/Dawson",
                        "America/Dawson_Creek",
                        "America/Denver",
                        "America/Detroit",
                        "America/Dominica",
                        "America/Edmonton",
                        "America/Eirunepe",
                        "America/El_Salvador",
                        "America/Fort_Nelson",
                        "America/Fortaleza",
                        "America/Glace_Bay",
                        "America/Godthab",
                        "America/Goose_Bay",
                        "America/Grand_Turk",
                        "America/Grenada",
                        "America/Guadeloupe",
                        "America/Guatemala",
                        "America/Guayaquil",
                        "America/Guyana",
                        "America/Halifax",
                        "America/Havana",
                        "America/Hermosillo",
                        "America/Indiana/Knox",
                        "America/Indiana/Marengo",
                        "America/Indiana/Petersburg",
                        "America/Indiana/Tell_City",
                        "America/Indiana/Vevay",
                        "America/Indiana/Vincennes",
                        "America/Indiana/Winamac",
                        "America/Indianapolis",
                        "America/Inuvik",
                        "America/Iqaluit",
                        "America/Jamaica",
                        "America/Jujuy",
                        "America/Juneau",
                        "America/Kentucky/Monticello",
                        "America/Kralendijk",
                        "America/La_Paz",
                        "America/Lima",
                        "America/Los_Angeles",
                        "America/Louisville",
                        "America/Lower_Princes",
                        "America/Maceio",
                        "America/Managua",
                        "America/Manaus",
                        "America/Marigot",
                        "America/Martinique",
                        "America/Matamoros",
                        "America/Mazatlan",
                        "America/Mendoza",
                        "America/Menominee",
                        "America/Merida",
                        "America/Metlakatla",
                        "America/Mexico_City",
                        "America/Miquelon",
                        "America/Moncton",
                        "America/Monterrey",
                        "America/Montevideo",
                        "America/Montserrat",
                        "America/Nassau",
                        "America/New_York",
                        "America/Nome",
                        "America/Noronha",
                        "America/North_Dakota/Beulah",
                        "America/North_Dakota/Center",
                        "America/North_Dakota/New_Salem",
                        "America/Ojinaga",
                        "America/Panama",
                        "America/Paramaribo",
                        "America/Phoenix",
                        "America/Port-au-Prince",
                        "America/Port_of_Spain",
                        "America/Porto_Velho",
                        "America/Puerto_Rico",
                        "America/Punta_Arenas",
                        "America/Rankin_Inlet",
                        "America/Recife",
                        "America/Regina",
                        "America/Resolute",
                        "America/Rio_Branco",
                        "America/Santarem",
                        "America/Santiago",
                        "America/Santo_Domingo",
                        "America/Sao_Paulo",
                        "America/Scoresbysund",
                        "America/Sitka",
                        "America/St_Barthelemy",
                        "America/St_Johns",
                        "America/St_Kitts",
                        "America/St_Lucia",
                        "America/St_Thomas",
                        "America/St_Vincent",
                        "America/Swift_Current",
                        "America/Tegucigalpa",
                        "America/Thule",
                        "America/Tijuana",
                        "America/Toronto",
                        "America/Tortola",
                        "America/Vancouver",
                        "America/Whitehorse",
                        "America/Winnipeg",
                        "America/Yakutat",
                        "Antarctica/Casey",
                        "Antarctica/Davis",
                        "Antarctica/DumontDUrville",
                        "Antarctica/Macquarie",
                        "Antarctica/Mawson",
                        "Antarctica/McMurdo",
                        "Antarctica/Palmer",
                        "Antarctica/Rothera",
                        "Antarctica/Syowa",
                        "Antarctica/Troll",
                        "Antarctica/Vostok",
                        "Arctic/Longyearbyen",
                        "Asia/Aden",
                        "Asia/Almaty",
                        "Asia/Amman",
                        "Asia/Anadyr",
                        "Asia/Aqtau",
                        "Asia/Aqtobe",
                        "Asia/Ashgabat",
                        "Asia/Atyrau",
                        "Asia/Baghdad",
                        "Asia/Bahrain",
                        "Asia/Baku",
                        "Asia/Bangkok",
                        "Asia/Barnaul",
                        "Asia/Beirut",
                        "Asia/Bishkek",
                        "Asia/Brunei",
                        "Asia/Calcutta",
                        "Asia/Chita",
                        "Asia/Colombo",
                        "Asia/Damascus",
                        "Asia/Dhaka",
                        "Asia/Dili",
                        "Asia/Dubai",
                        "Asia/Dushanbe",
                        "Asia/Famagusta",
                        "Asia/Gaza",
                        "Asia/Hebron",
                        "Asia/Hong_Kong",
                        "Asia/Hovd",
                        "Asia/Irkutsk",
                        "Asia/Jakarta",
                        "Asia/Jayapura",
                        "Asia/Jerusalem",
                        "Asia/Kabul",
                        "Asia/Kamchatka",
                        "Asia/Karachi",
                        "Asia/Katmandu",
                        "Asia/Khandyga",
                        "Asia/Krasnoyarsk",
                        "Asia/Kuala_Lumpur",
                        "Asia/Kuching",
                        "Asia/Kuwait",
                        "Asia/Macau",
                        "Asia/Magadan",
                        "Asia/Makassar",
                        "Asia/Manila",
                        "Asia/Muscat",
                        "Asia/Nicosia",
                        "Asia/Novokuznetsk",
                        "Asia/Novosibirsk",
                        "Asia/Omsk",
                        "Asia/Oral",
                        "Asia/Phnom_Penh",
                        "Asia/Pontianak",
                        "Asia/Pyongyang",
                        "Asia/Qatar",
                        "Asia/Qostanay",
                        "Asia/Qyzylorda",
                        "Asia/Rangoon",
                        "Asia/Riyadh",
                        "Asia/Saigon",
                        "Asia/Sakhalin",
                        "Asia/Samarkand",
                        "Asia/Seoul",
                        "Asia/Shanghai",
                        "Asia/Singapore",
                        "Asia/Srednekolymsk",
                        "Asia/Taipei",
                        "Asia/Tashkent",
                        "Asia/Tbilisi",
                        "Asia/Tehran",
                        "Asia/Thimphu",
                        "Asia/Tokyo",
                        "Asia/Tomsk",
                        "Asia/Ulaanbaatar",
                        "Asia/Urumqi",
                        "Asia/Ust-Nera",
                        "Asia/Vientiane",
                        "Asia/Vladivostok",
                        "Asia/Yakutsk",
                        "Asia/Yekaterinburg",
                        "Asia/Yerevan",
                        "Atlantic/Azores",
                        "Atlantic/Bermuda",
                        "Atlantic/Canary",
                        "Atlantic/Cape_Verde",
                        "Atlantic/Faeroe",
                        "Atlantic/Madeira",
                        "Atlantic/Reykjavik",
                        "Atlantic/South_Georgia",
                        "Atlantic/St_Helena",
                        "Atlantic/Stanley",
                        "Australia/Adelaide",
                        "Australia/Brisbane",
                        "Australia/Broken_Hill",
                        "Australia/Darwin",
                        "Australia/Eucla",
                        "Australia/Hobart",
                        "Australia/Lindeman",
                        "Australia/Lord_Howe",
                        "Australia/Melbourne",
                        "Australia/Perth",
                        "Australia/Sydney",
                        "Europe/Amsterdam",
                        "Europe/Andorra",
                        "Europe/Astrakhan",
                        "Europe/Athens",
                        "Europe/Belgrade",
                        "Europe/Berlin",
                        "Europe/Bratislava",
                        "Europe/Brussels",
                        "Europe/Bucharest",
                        "Europe/Budapest",
                        "Europe/Busingen",
                        "Europe/Chisinau",
                        "Europe/Copenhagen",
                        "Europe/Dublin",
                        "Europe/Gibraltar",
                        "Europe/Guernsey",
                        "Europe/Helsinki",
                        "Europe/Isle_of_Man",
                        "Europe/Istanbul",
                        "Europe/Jersey",
                        "Europe/Kaliningrad",
                        "Europe/Kiev",
                        "Europe/Kirov",
                        "Europe/Lisbon",
                        "Europe/Ljubljana",
                        "Europe/London",
                        "Europe/Luxembourg",
                        "Europe/Madrid",
                        "Europe/Malta",
                        "Europe/Mariehamn",
                        "Europe/Minsk",
                        "Europe/Monaco",
                        "Europe/Moscow",
                        "Europe/Oslo",
                        "Europe/Paris",
                        "Europe/Podgorica",
                        "Europe/Prague",
                        "Europe/Riga",
                        "Europe/Rome",
                        "Europe/Samara",
                        "Europe/San_Marino",
                        "Europe/Sarajevo",
                        "Europe/Saratov",
                        "Europe/Simferopol",
                        "Europe/Skopje",
                        "Europe/Sofia",
                        "Europe/Stockholm",
                        "Europe/Tallinn",
                        "Europe/Tirane",
                        "Europe/Ulyanovsk",
                        "Europe/Vaduz",
                        "Europe/Vatican",
                        "Europe/Vienna",
                        "Europe/Vilnius",
                        "Europe/Volgograd",
                        "Europe/Warsaw",
                        "Europe/Zagreb",
                        "Europe/Zurich",
                        "Indian/Antananarivo",
                        "Indian/Chagos",
                        "Indian/Christmas",
                        "Indian/Cocos",
                        "Indian/Comoro",
                        "Indian/Kerguelen",
                        "Indian/Mahe",
                        "Indian/Maldives",
                        "Indian/Mauritius",
                        "Indian/Mayotte",
                        "Indian/Reunion",
                        "Pacific/Apia",
                        "Pacific/Auckland",
                        "Pacific/Bougainville",
                        "Pacific/Chatham",
                        "Pacific/Easter",
                        "Pacific/Efate",
                        "Pacific/Enderbury",
                        "Pacific/Fakaofo",
                        "Pacific/Fiji",
                        "Pacific/Funafuti",
                        "Pacific/Galapagos",
                        "Pacific/Gambier",
                        "Pacific/Guadalcanal",
                        "Pacific/Guam",
                        "Pacific/Honolulu",
                        "Pacific/Kiritimati",
                        "Pacific/Kosrae",
                        "Pacific/Kwajalein",
                        "Pacific/Majuro",
                        "Pacific/Marquesas",
                        "Pacific/Midway",
                        "Pacific/Nauru",
                        "Pacific/Niue",
                        "Pacific/Norfolk",
                        "Pacific/Noumea",
                        "Pacific/Pago_Pago",
                        "Pacific/Palau",
                        "Pacific/Pitcairn",
                        "Pacific/Ponape",
                        "Pacific/Port_Moresby",
                        "Pacific/Rarotonga",
                        "Pacific/Saipan",
                        "Pacific/Tahiti",
                        "Pacific/Tarawa",
                        "Pacific/Tongatapu",
                        "Pacific/Truk",
                        "Pacific/Wake",
                        "Pacific/Wallis"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The list of created app members",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppMemberInfo"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      },
      "delete": {
        "description": "Delete all seed app members for an app",
        "tags": [
          "main",
          "app",
          "demo-member",
          "delete"
        ],
        "operationId": "deleteSeedAppMembers",
        "responses": {
          "204": {
            "description": "The seed app members have been deleted successfully"
          }
        },
        "security": [
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/email": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Get the app’s email settings.",
        "operationId": "getAppEmailSettings",
        "responses": {
          "200": {
            "description": "The current app email settings",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailName": {
                      "type": "string",
                      "description": "The name used for emails."
                    },
                    "emailHost": {
                      "type": "string",
                      "description": "The hostname of the SMTP server."
                    },
                    "emailPassword": {
                      "type": "boolean",
                      "description": "Whether a password is set."
                    },
                    "emailUser": {
                      "type": "string",
                      "description": "The username used to authenticate against the SMTP server."
                    },
                    "emailPort": {
                      "type": "string",
                      "description": "The port used for the SMTP server."
                    },
                    "emailSecure": {
                      "type": "boolean",
                      "description": "Whether TLS is being used."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/undelivered-emails": {
      "post": {
        "tags": [
          "main",
          "emails"
        ],
        "description": "Webhook for delivering response on undelivered emails.",
        "parameters": [
          {
            "name": "secret",
            "schema": {
              "type": "string"
            },
            "description": "Secret used to authenticate incoming Postal webhooks.",
            "in": "query"
          }
        ],
        "operationId": "undeliveredEmails",
        "responses": {
          "200": {
            "description": "Response sent to Postal, should be 200 OK if we receive the webhook, regardless of our internals."
          }
        }
      }
    },
    "/api/apps/{appId}/payment": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app"
        ],
        "operationId": "getAppPaymentSettings",
        "description": "Get app payment settings configuration",
        "responses": {
          "200": {
            "description": "The app payment configuration",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "stripeApiSecretKey": {
                      "type": "boolean",
                      "description": "Whether stripe api key is set."
                    },
                    "stripeWebhookSecret": {
                      "type": "boolean",
                      "description": "Whether stripe secret is set."
                    },
                    "successUrl": {
                      "type": "string",
                      "description": "The url users are redirected to after successfully completing app related Stripe checkout session."
                    },
                    "cancelUrl": {
                      "type": "string",
                      "description": "The url users are redirected to after unsuccessfully completing app related Stripe checkout session."
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "description": "App that is creating the checkout.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "security": [
          {
            "studio": []
          }
        ]
      },
      "patch": {
        "tags": [
          "main",
          "app"
        ],
        "operationId": "updateAppPaymentSettings",
        "description": "Update app payment settings configuration",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "stripeApiSecretKey": {
                    "type": "string",
                    "description": "The private API key used for accessing Stripe account connected to the app."
                  },
                  "stripeWebhookSecret": {
                    "type": "string",
                    "description": "The private secret used for authenticating app related Stripe webhooks."
                  },
                  "successUrl": {
                    "type": "string",
                    "description": "The url users are redirected to after successfully completing app related Stripe checkout session."
                  },
                  "cancelUrl": {
                    "type": "string",
                    "description": "The url users are redirected to after unsuccessfully completing app related Stripe checkout session."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The app payment configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppPaymentSettings"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/accept-payment": {
      "post": {
        "tags": [
          "main",
          "app",
          "payments"
        ],
        "description": "Accept a payment for in app transaction.",
        "operationId": "acceptAppPayment",
        "requestBody": {
          "description": "Information about the payment sent by Stripe forwarded to an app webhook.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "object": {
                    "type": "string"
                  },
                  "api_version": {
                    "type": "string"
                  },
                  "created": {
                    "type": "number"
                  },
                  "data": {
                    "type": "object",
                    "properties": {
                      "object": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "object": {
                            "type": "string"
                          },
                          "account_country": {
                            "type": "string"
                          },
                          "account_name": {
                            "type": "string"
                          },
                          "account_tax_ids": {
                            "type": "string"
                          },
                          "amount_due": {
                            "type": "number"
                          },
                          "amount_paid": {
                            "type": "number"
                          },
                          "amount_remaining": {
                            "type": "number"
                          },
                          "amount_shipping": {
                            "type": "number"
                          },
                          "application": {
                            "type": "string"
                          },
                          "application_fee_amount": {
                            "type": "number"
                          },
                          "attempt_count": {
                            "type": "number"
                          },
                          "attempted": {
                            "type": "boolean"
                          },
                          "auto_advance": {
                            "type": "boolean"
                          },
                          "automatic_tax": {
                            "type": "object"
                          },
                          "automatically_finalizes_at": {
                            "type": "number"
                          },
                          "billing_reason": {
                            "type": "string"
                          },
                          "charge": {
                            "type": "string"
                          },
                          "collection_method": {
                            "type": "string"
                          },
                          "created": {
                            "type": "number"
                          },
                          "currency": {
                            "type": "string"
                          },
                          "custom_fields": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "customer": {
                            "type": "string"
                          },
                          "customer_address": {
                            "type": "object"
                          },
                          "customer_email": {
                            "type": "string"
                          },
                          "customer_name": {
                            "type": "string"
                          },
                          "customer_phone": {
                            "type": "string"
                          },
                          "customer_shipping": {
                            "type": "object"
                          },
                          "customer_tax_exempt": {
                            "type": "string"
                          },
                          "customer_tax_ids": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "default_payment_method": {
                            "type": "string"
                          },
                          "default_source": {
                            "type": "string"
                          },
                          "default_tax_rates": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "description": {
                            "type": "string"
                          },
                          "discount": {
                            "type": "object"
                          },
                          "discounts": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "due_date": {
                            "type": "number"
                          },
                          "effective_at": {
                            "type": "number"
                          },
                          "ending_balance": {
                            "type": "number"
                          },
                          "footer": {
                            "type": "string"
                          },
                          "from_invoice": {
                            "type": "object"
                          },
                          "hosted_invoice_url": {
                            "type": "string"
                          },
                          "invoice_pdf": {
                            "type": "string"
                          },
                          "issuer": {
                            "type": "object"
                          },
                          "last_finalization_error": {
                            "type": "object"
                          },
                          "latest_revision": {
                            "type": "string"
                          },
                          "lines": {
                            "type": "object"
                          },
                          "livemode": {
                            "type": "boolean"
                          },
                          "metadata": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "number"
                              }
                            }
                          },
                          "next_payment_attempt": {
                            "type": "number"
                          },
                          "number": {
                            "type": "string"
                          },
                          "on_behalf_of": {
                            "type": "string"
                          },
                          "paid": {
                            "type": "boolean"
                          },
                          "paid_out_of_band": {
                            "type": "boolean"
                          },
                          "payment_intent": {
                            "type": "string"
                          },
                          "payment_settings": {
                            "type": "object"
                          },
                          "period_end": {
                            "type": "number"
                          },
                          "period_start": {
                            "type": "number"
                          },
                          "post_payment_credit_notes_amount": {
                            "type": "number"
                          },
                          "pre_payment_credit_notes_amount": {
                            "type": "number"
                          },
                          "quote": {
                            "type": "string"
                          },
                          "receipt_number": {
                            "type": "string"
                          },
                          "rendering": {
                            "type": "object"
                          },
                          "shipping_cost": {
                            "type": "object"
                          },
                          "shipping_details": {
                            "type": "object"
                          },
                          "starting_balance": {
                            "type": "number"
                          },
                          "statement_descriptor": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "status_transitions": {
                            "type": "object"
                          },
                          "subscription": {
                            "type": "string"
                          },
                          "subscription_details": {
                            "type": "object"
                          },
                          "subtotal": {
                            "type": "number"
                          },
                          "subtotal_excluding_tax": {
                            "type": "number"
                          },
                          "tax": {
                            "type": "number"
                          },
                          "test_clock": {
                            "type": "string"
                          },
                          "total": {
                            "type": "number"
                          },
                          "total_discount_amounts": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "total_excluding_tax": {
                            "type": "number"
                          },
                          "total_pretax_credit_amounts": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "total_tax_amounts": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "transfer_data": {
                            "type": "object"
                          },
                          "webhooks_delivered_at": {
                            "type": "number"
                          }
                        }
                      }
                    }
                  },
                  "livemode": {
                    "type": "boolean"
                  },
                  "pending_webhooks": {
                    "type": "number"
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "idempotency_key": {
                        "type": "string"
                      }
                    }
                  },
                  "type": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Response sent to Stripe, should be 200 OK if we receive the webhook, regardless of our internals."
          }
        }
      }
    },
    "/api/apps/{appId}/export": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Export an app as a zip file",
        "operationId": "exportApp",
        "parameters": [
          {
            "name": "resources",
            "schema": {
              "type": "boolean"
            },
            "description": "Whether to include resources for an app.",
            "in": "query"
          },
          {
            "name": "assets",
            "schema": {
              "type": "boolean"
            },
            "description": "Whether to include assets in the export file",
            "in": "query"
          },
          {
            "name": "screenshots",
            "schema": {
              "type": "boolean"
            },
            "description": "Whether to include screenshots in the export file",
            "in": "query"
          },
          {
            "name": "readmes",
            "schema": {
              "type": "boolean"
            },
            "description": "Whether to include readmes in the export file",
            "in": "query"
          }
        ],
        "responses": {
          "200": {
            "description": "App exported successfully."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:export"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/groups": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "group"
        ],
        "description": "Get a list of app groups.",
        "operationId": "getAppGroups",
        "responses": {
          "200": {
            "description": "The list of all groups.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "description": "An app group",
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "number"
                      },
                      "name": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "groups:read"
            ]
          },
          {}
        ]
      },
      "post": {
        "tags": [
          "common",
          "app",
          "group"
        ],
        "description": "Create a new group.",
        "operationId": "createAppGroup",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "description": "The group to create.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "annotations": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The created group",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "number"
                    },
                    "name": {
                      "type": "string"
                    },
                    "role": {
                      "type": "string",
                      "description": "The role of the user who created the group",
                      "enum": [
                        "member"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "app": [
              "groups:write"
            ]
          },
          {
            "studio": []
          },
          {
            "cli": [
              "groups:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/icon": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Get the current app icon.",
        "operationId": "getAppIcon",
        "responses": {
          "200": {
            "description": "The icon of the app that matches the given id.",
            "content": {
              "image/png": {},
              "image/jpeg": {},
              "image/tiff": {},
              "image/webp": {}
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Delete the current app icon.",
        "operationId": "deleteAppIcon",
        "responses": {
          "204": {
            "description": "The icon has been successfully removed"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/create-checkout": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "payments"
        ],
        "description": "Create checkout for in-app transaction.",
        "operationId": "createAppCheckout",
        "responses": {
          "200": {
            "description": "Whether the invoice has been succesfully created and sent to Stripe."
          }
        },
        "parameters": [
          {
            "in": "path",
            "name": "appId",
            "description": "App that is creating the checkout.",
            "schema": {
              "type": "number"
            }
          },
          {
            "in": "query",
            "name": "price",
            "description": "Product that is being charged.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "locale",
            "description": "Locale that the app is currently shown in, to be used for Stripe checkout.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "Customer email address"
                  }
                },
                "required": [
                  "email"
                ]
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/invites/resend": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app"
        ],
        "description": "Request to resend an invitation.",
        "operationId": "resendAppInvite",
        "requestBody": {
          "description": "The email of the person to resend the invitation to.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The invite has been sent."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/invites": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "app",
          "invite"
        ],
        "description": "Get a list of invited app members.",
        "operationId": "getAppInvites",
        "responses": {
          "200": {
            "description": "The list of all invites.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "format": "email"
                      },
                      "role": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "post": {
        "tags": [
          "app",
          "invite"
        ],
        "description": "Invite a new app member to an app.",
        "operationId": "createAppInvites",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "description": "The invite to create.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "email",
                    "role"
                  ],
                  "properties": {
                    "email": {
                      "type": "string",
                      "format": "email",
                      "description": "The email address of the user to invite."
                    },
                    "role": {
                      "type": "string",
                      "description": "The role to invite the user as."
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The invited member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "app:write"
            ]
          }
        ]
      },
      "delete": {
        "tags": [
          "app",
          "invite"
        ],
        "description": "Revoke an app member invitation.",
        "operationId": "deleteAppInvite",
        "requestBody": {
          "description": "The email address to revoke the invite of.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The invitation has been successfully revoked."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/lock": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Update the locked property an app.",
        "operationId": "setAppLock",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "locked"
                ],
                "properties": {
                  "locked": {
                    "$ref": "#/components/schemas/App/properties/locked",
                    "description": "Whether the app should be locked."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "Lock status successfully changed",
            "content": {
              "application/zip": {}
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/maskable-icon": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "delete": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Delete the current app’s maskable icon.",
        "operationId": "deleteAppMaskableIcon",
        "responses": {
          "204": {
            "description": "The icon has been successfully removed"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/members/current/groups": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "app",
          "member",
          "current-member"
        ],
        "description": "Get a list of groups that the app member is a member of.",
        "operationId": "getCurrentAppMemberGroups",
        "responses": {
          "200": {
            "description": "The list of groups of the app member.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "number"
                      },
                      "name": {
                        "type": "string"
                      },
                      "role": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "app": []
          }
        ]
      }
    },
    "/api/apps/{appId}/members/current/link": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "member",
          "current-member"
        ],
        "description": "Link the app member to an unlinked authorization.",
        "operationId": "linkCurrentAppMember",
        "security": [
          {
            "app": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "externalId": {
                    "type": "string",
                    "description": "The external id of the of the external user.\n\nThe `externalId` maps to the following ids of the external login methods.\n- Appsemble OAuth2 login: `UserId`\n- App OAuth2 login: `sub`\n- App SAML login: `nameId`\n"
                  },
                  "secret": {
                    "type": "string",
                    "description": "The secret that was used to get the external id."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "",
            "content": {}
          }
        }
      }
    },
    "/api/apps/{appId}/members/current": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "app",
          "member",
          "current-member"
        ],
        "description": "\n      Get the app member information formatted as OpenID user info.\n\n      See <https://connect2id.com/products/server/docs/api/userinfo>\n    ",
        "operationId": "getCurrentAppMember",
        "security": [
          {
            "app": [
              "openid"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "OpenID compatible app member information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "sub": {
                      "type": "string",
                      "description": "The subject (end-user) identifier. "
                    },
                    "name": {
                      "type": "string",
                      "description": "The full name of the end-user"
                    },
                    "picture": {
                      "type": "string",
                      "format": "url",
                      "description": "The URL of the profile page for the end-user."
                    },
                    "profile": {
                      "type": "string",
                      "format": "url",
                      "description": "The URL to the app member profile."
                    },
                    "email": {
                      "type": "string",
                      "format": "email",
                      "description": "The end-user’s preferred email address."
                    },
                    "email_verified": {
                      "type": "boolean",
                      "description": "True if the end-user’s email address has been verified, else false."
                    },
                    "properties": {
                      "type": "object",
                      "description": "Custom app member properties."
                    },
                    "phoneNumber": {
                      "type": "string",
                      "description": "Phone number"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "patch": {
        "description": "Update the data of the currently logged in app member",
        "tags": [
          "app",
          "member"
        ],
        "operationId": "patchCurrentAppMember",
        "security": [
          {
            "studio": []
          },
          {
            "app": []
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "picture": {
                    "type": "string",
                    "format": "binary",
                    "description": "The member’s profile picture."
                  },
                  "properties": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "The member’s custom properties."
                  },
                  "locale": {
                    "type": "string",
                    "description": "The preferred locale of the user."
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Phone number"
                  }
                }
              },
              "encoding": {
                "picture": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The patched app member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMember"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/members": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/roles"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId"
        },
        {
          "$ref": "#/components/parameters/$filter"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "member"
        ],
        "description": "Fetch all members of an app.",
        "operationId": "queryAppMembers",
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "openid"
            ]
          },
          {}
        ],
        "responses": {
          "200": {
            "description": "The list of app members.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppMemberInfo"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/messages/{language}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/language"
        },
        {
          "in": "query",
          "name": "merge",
          "description": "Whether the language’s messages should be merged with its base language.",
          "schema": {
            "type": "string"
          }
        },
        {
          "in": "query",
          "name": "override",
          "description": "Whether the app’s language overrides should be included and merged.",
          "schema": {
            "type": "string",
            "default": "true"
          }
        }
      ],
      "delete": {
        "tags": [
          "main",
          "apps",
          "language"
        ],
        "description": "Delete the app’s messages for this language.",
        "operationId": "deleteAppMessages",
        "responses": {
          "204": {
            "description": "The messages have successfully been deleted."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "get": {
        "tags": [
          "common",
          "apps",
          "language"
        ],
        "description": "Get the app’s messages for this language.",
        "operationId": "getAppMessages",
        "responses": {
          "200": {
            "description": "The app messages for the selected language.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMessages"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/messages": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "merge",
          "in": "query",
          "schema": {
            "type": "boolean"
          }
        },
        {
          "name": "includeMessages",
          "in": "query",
          "schema": {
            "type": "boolean"
          }
        }
      ],
      "get": {
        "tags": [
          "common",
          "apps",
          "language"
        ],
        "description": "Get a list of all languages with messages.",
        "operationId": "getAppLanguages",
        "responses": {
          "200": {
            "description": "The list of supported languages",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "$ref": "#/components/schemas/AppMessages"
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "main",
          "apps",
          "language"
        ],
        "description": "Upload messages for the given language.",
        "operationId": "createAppMessages",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/AppMessages"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/AppMessages"
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The translation was created.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/AppMessages"
                    },
                    {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/AppMessages"
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/quotas/email": {
      "get": {
        "tags": [
          "main",
          "app",
          "quota",
          "email"
        ],
        "operationId": "getAppEmailQuota",
        "parameters": [
          {
            "$ref": "#/components/parameters/appId"
          }
        ],
        "security": [
          {
            "studio": []
          },
          {}
        ],
        "responses": {
          "200": {
            "description": "Email quota for an app",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "used": {
                      "type": "number",
                      "description": "Number of emails sent today"
                    },
                    "limit": {
                      "type": "number",
                      "description": "Maximum number of emails that can be sent today"
                    },
                    "reset": {
                      "type": "string",
                      "format": "date-time",
                      "description": "Date and time when the quota resets"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/ratings": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "rating"
        ],
        "description": "Fetch all ratings of an app.",
        "operationId": "getAppRatings",
        "responses": {
          "200": {
            "description": "The list of apps ratings.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Rating"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "main",
          "app",
          "rating"
        ],
        "description": "Submit an app rating.",
        "operationId": "createAppRating",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "rating"
                ],
                "properties": {
                  "rating": {
                    "$ref": "#/components/schemas/Rating/properties/rating"
                  },
                  "description": {
                    "$ref": "#/components/schemas/Rating/properties/description"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The submitted app rating.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset/properties/id"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/readmes/{readmeId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/readmeId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "readme"
        ],
        "description": "Get a readme of an app.",
        "operationId": "getAppReadme",
        "responses": {
          "200": {
            "description": "The app readme"
          }
        }
      }
    },
    "/api/apps/{appId}/reseed": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app"
        ],
        "operationId": "reseedDemoApp",
        "responses": {
          "200": {
            "description": "The app has successfully been reseeded."
          }
        },
        "security": [
          {
            "studio": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/\\$count": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Get a count of all resources of this app.",
        "operationId": "countAppResources",
        "parameters": [
          {
            "$ref": "#/components/parameters/$filter"
          },
          {
            "$ref": "#/components/parameters/$own"
          }
        ],
        "responses": {
          "200": {
            "description": "The count of all this app’s resources of this type.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "number"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:read"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/{resourceId}/subscriptions": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/resourceId"
        },
        {
          "$ref": "#/components/parameters/endpoint"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "resource",
          "subscription"
        ],
        "description": "Get the subscription status of a resource.",
        "operationId": "getAppResourceSubscription",
        "responses": {
          "200": {
            "description": "The subscription status of the resource that matches the given id.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "number"
                    },
                    "update": {
                      "type": "boolean"
                    },
                    "delete": {
                      "type": "boolean"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/{resourceId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/resourceId"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/view"
          },
          {
            "name": "$own",
            "schema": {
              "type": "boolean"
            },
            "description": "If the resources created by the authenticated app member should be included",
            "in": "query"
          }
        ],
        "description": "Get a single app resource.",
        "operationId": "getAppResourceById",
        "responses": {
          "200": {
            "description": "The resource that matches the given id.",
            "$ref": "#/components/responses/resource"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:read"
            ]
          },
          {}
        ]
      },
      "put": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Update an existing app resource.",
        "operationId": "updateAppResource",
        "requestBody": {
          "required": true,
          "$ref": "#/components/requestBodies/resource"
        },
        "responses": {
          "200": {
            "description": "The updated resource.",
            "$ref": "#/components/responses/resource"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      },
      "patch": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Patch an existing app resource.",
        "operationId": "patchAppResource",
        "requestBody": {
          "required": true,
          "$ref": "#/components/requestBodies/resource"
        },
        "responses": {
          "200": {
            "description": "The patched resource.",
            "$ref": "#/components/responses/resource"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      },
      "delete": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Delete an existing app resource.",
        "operationId": "deleteAppResource",
        "responses": {
          "204": {
            "description": "The app resource has been deleted successfully.",
            "$ref": "#/components/responses/resource"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/{resourceId}/group": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/resourceId"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId",
          "description": "ID of the group resource belongs to this"
        }
      ],
      "put": {
        "tags": [
          "app",
          "resource",
          "positioning",
          "custom-sort"
        ],
        "description": "Move a resource from one group to another or from no group to other.",
        "operationId": "updateAppResourceGroup",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "",
                "required": [
                  "groupId"
                ],
                "properties": {
                  "groupId": {
                    "description": "ID of the group the resource should be moved to"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated group ID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "number",
                  "description": "The updated group ID"
                }
              }
            }
          }
        },
        "security": [
          {
            "app": [
              "resources:manage"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/subscriptions": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/endpoint"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "resource",
          "subscription"
        ],
        "description": "Get the current subscription status of this resource.",
        "operationId": "getAppResourceTypeSubscription",
        "responses": {
          "200": {
            "description": "The subscription status for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResourceSubscription"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "openid"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Get all resources of this app.",
        "operationId": "queryAppResources",
        "parameters": [
          {
            "$ref": "#/components/parameters/view"
          },
          {
            "$ref": "#/components/parameters/$filter"
          },
          {
            "$ref": "#/components/parameters/$orderby"
          },
          {
            "$ref": "#/components/parameters/$select"
          },
          {
            "$ref": "#/components/parameters/$skip"
          },
          {
            "$ref": "#/components/parameters/$top"
          },
          {
            "$ref": "#/components/parameters/$own"
          },
          {
            "$ref": "#/components/parameters/delimiter"
          }
        ],
        "responses": {
          "200": {
            "description": "The list of all this app’s resources of this type.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Resource"
                  }
                }
              },
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:read"
            ]
          },
          {}
        ]
      },
      "post": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Create a new resource for this app.",
        "operationId": "createAppResource",
        "requestBody": {
          "required": true,
          "description": "The resource to create",
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Resource"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Resource"
                    }
                  }
                ]
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "resource"
                ],
                "description": "A `multipart/form-data` representation of a resource.",
                "additionalProperties": false,
                "properties": {
                  "resource": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Resource"
                    }
                  },
                  "assets": {
                    "type": "array",
                    "description": "A list of assets that should be linked to the resource.",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            },
            "text/csv": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The resource that was created.",
            "$ref": "#/components/responses/resource"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      },
      "put": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Update existing app resources.",
        "operationId": "updateAppResources",
        "requestBody": {
          "required": true,
          "description": "The resources to update",
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Resource"
                }
              }
            },
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "resource"
                ],
                "description": "A `multipart/form-data` representation of a resource.",
                "additionalProperties": false,
                "properties": {
                  "resource": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Resource"
                    }
                  },
                  "assets": {
                    "type": "array",
                    "description": "A list of assets that should be linked to the resources.",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              }
            },
            "text/csv": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated resources.",
            "$ref": "#/components/responses/resource"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      },
      "delete": {
        "tags": [
          "common",
          "app",
          "resource"
        ],
        "description": "Delete multiple app resources.",
        "operationId": "deleteAppResources",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "description": "An array of resource IDs to remove.",
                "items": {
                  "$ref": "#/components/schemas/Resource/properties/id"
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The app resources have been deleted successfully."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          },
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/{resourceId}/versions": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/resourceId"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "resource",
          "version"
        ],
        "description": "Get the known history of a resource",
        "operationId": "getAppResourceVersions",
        "responses": {
          "200": {
            "description": "The resource that matches the given id.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/responses/resource"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "resources:manage"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/resources/{resourceType}/{resourceId}/positions": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/resourceType"
        },
        {
          "$ref": "#/components/parameters/resourceId"
        },
        {
          "$ref": "#/components/parameters/selectedGroupId"
        },
        {
          "$ref": "#/components/parameters/$filter"
        }
      ],
      "put": {
        "tags": [
          "app",
          "resource",
          "positioning",
          "custom-sort"
        ],
        "description": "Update the current position of the resource in the order.",
        "operationId": "updateAppResourcePosition",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "",
                "required": [
                  "prevResourcePosition",
                  "nextResourcePosition"
                ],
                "properties": {
                  "prevResourcePosition": {
                    "oneOf": [
                      {
                        "type": "number",
                        "minimum": 0
                      },
                      {
                        "enum": [
                          null
                        ]
                      }
                    ]
                  },
                  "nextResourcePosition": {
                    "oneOf": [
                      {
                        "type": "number",
                        "minimum": 0
                      },
                      {
                        "enum": [
                          null
                        ]
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The subscription status of the resource that matches the given id.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "number",
                  "description": "The updated position"
                }
              }
            }
          }
        },
        "security": [
          {
            "app": [
              "resources:manage"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/resources": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "delete": {
        "tags": [
          "main",
          "app",
          "resource"
        ],
        "description": "Delete all app seed resources.",
        "operationId": "deleteAppSeedResources",
        "responses": {
          "204": {
            "description": "The app resources have been deleted successfully."
          }
        },
        "security": [
          {
            "cli": [
              "resources:write"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/saml/{appSamlSecretId}/acs": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appSamlSecretId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "saml"
        ],
        "operationId": "assertAppSamlConsumerService",
        "security": [
          {
            "studio": []
          },
          {}
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "type": "object",
                "properties": {
                  "RelayState": {
                    "type": "string"
                  },
                  "SAMLResponse": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "302": {
            "description": "A list of the SAML secrets for the app.",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/saml/{appSamlSecretId}/authn": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appSamlSecretId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "saml"
        ],
        "operationId": "createAppSamlAuthnRequest",
        "security": [
          {
            "studio": []
          },
          {}
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "redirectUri": {
                    "type": "string"
                  },
                  "scope": {
                    "type": "string"
                  },
                  "state": {
                    "type": "string"
                  },
                  "timezone": {
                    "enum": [
                      "Africa/Abidjan",
                      "Africa/Accra",
                      "Africa/Addis_Ababa",
                      "Africa/Algiers",
                      "Africa/Asmera",
                      "Africa/Bamako",
                      "Africa/Bangui",
                      "Africa/Banjul",
                      "Africa/Bissau",
                      "Africa/Blantyre",
                      "Africa/Brazzaville",
                      "Africa/Bujumbura",
                      "Africa/Cairo",
                      "Africa/Casablanca",
                      "Africa/Ceuta",
                      "Africa/Conakry",
                      "Africa/Dakar",
                      "Africa/Dar_es_Salaam",
                      "Africa/Djibouti",
                      "Africa/Douala",
                      "Africa/El_Aaiun",
                      "Africa/Freetown",
                      "Africa/Gaborone",
                      "Africa/Harare",
                      "Africa/Johannesburg",
                      "Africa/Juba",
                      "Africa/Kampala",
                      "Africa/Khartoum",
                      "Africa/Kigali",
                      "Africa/Kinshasa",
                      "Africa/Lagos",
                      "Africa/Libreville",
                      "Africa/Lome",
                      "Africa/Luanda",
                      "Africa/Lubumbashi",
                      "Africa/Lusaka",
                      "Africa/Malabo",
                      "Africa/Maputo",
                      "Africa/Maseru",
                      "Africa/Mbabane",
                      "Africa/Mogadishu",
                      "Africa/Monrovia",
                      "Africa/Nairobi",
                      "Africa/Ndjamena",
                      "Africa/Niamey",
                      "Africa/Nouakchott",
                      "Africa/Ouagadougou",
                      "Africa/Porto-Novo",
                      "Africa/Sao_Tome",
                      "Africa/Tripoli",
                      "Africa/Tunis",
                      "Africa/Windhoek",
                      "America/Adak",
                      "America/Anchorage",
                      "America/Anguilla",
                      "America/Antigua",
                      "America/Araguaina",
                      "America/Argentina/La_Rioja",
                      "America/Argentina/Rio_Gallegos",
                      "America/Argentina/Salta",
                      "America/Argentina/San_Juan",
                      "America/Argentina/San_Luis",
                      "America/Argentina/Tucuman",
                      "America/Argentina/Ushuaia",
                      "America/Aruba",
                      "America/Asuncion",
                      "America/Bahia",
                      "America/Bahia_Banderas",
                      "America/Barbados",
                      "America/Belem",
                      "America/Belize",
                      "America/Blanc-Sablon",
                      "America/Boa_Vista",
                      "America/Bogota",
                      "America/Boise",
                      "America/Buenos_Aires",
                      "America/Cambridge_Bay",
                      "America/Campo_Grande",
                      "America/Cancun",
                      "America/Caracas",
                      "America/Catamarca",
                      "America/Cayenne",
                      "America/Cayman",
                      "America/Chicago",
                      "America/Chihuahua",
                      "America/Ciudad_Juarez",
                      "America/Coral_Harbour",
                      "America/Cordoba",
                      "America/Costa_Rica",
                      "America/Coyhaique",
                      "America/Creston",
                      "America/Cuiaba",
                      "America/Curacao",
                      "America/Danmarkshavn",
                      "America/Dawson",
                      "America/Dawson_Creek",
                      "America/Denver",
                      "America/Detroit",
                      "America/Dominica",
                      "America/Edmonton",
                      "America/Eirunepe",
                      "America/El_Salvador",
                      "America/Fort_Nelson",
                      "America/Fortaleza",
                      "America/Glace_Bay",
                      "America/Godthab",
                      "America/Goose_Bay",
                      "America/Grand_Turk",
                      "America/Grenada",
                      "America/Guadeloupe",
                      "America/Guatemala",
                      "America/Guayaquil",
                      "America/Guyana",
                      "America/Halifax",
                      "America/Havana",
                      "America/Hermosillo",
                      "America/Indiana/Knox",
                      "America/Indiana/Marengo",
                      "America/Indiana/Petersburg",
                      "America/Indiana/Tell_City",
                      "America/Indiana/Vevay",
                      "America/Indiana/Vincennes",
                      "America/Indiana/Winamac",
                      "America/Indianapolis",
                      "America/Inuvik",
                      "America/Iqaluit",
                      "America/Jamaica",
                      "America/Jujuy",
                      "America/Juneau",
                      "America/Kentucky/Monticello",
                      "America/Kralendijk",
                      "America/La_Paz",
                      "America/Lima",
                      "America/Los_Angeles",
                      "America/Louisville",
                      "America/Lower_Princes",
                      "America/Maceio",
                      "America/Managua",
                      "America/Manaus",
                      "America/Marigot",
                      "America/Martinique",
                      "America/Matamoros",
                      "America/Mazatlan",
                      "America/Mendoza",
                      "America/Menominee",
                      "America/Merida",
                      "America/Metlakatla",
                      "America/Mexico_City",
                      "America/Miquelon",
                      "America/Moncton",
                      "America/Monterrey",
                      "America/Montevideo",
                      "America/Montserrat",
                      "America/Nassau",
                      "America/New_York",
                      "America/Nome",
                      "America/Noronha",
                      "America/North_Dakota/Beulah",
                      "America/North_Dakota/Center",
                      "America/North_Dakota/New_Salem",
                      "America/Ojinaga",
                      "America/Panama",
                      "America/Paramaribo",
                      "America/Phoenix",
                      "America/Port-au-Prince",
                      "America/Port_of_Spain",
                      "America/Porto_Velho",
                      "America/Puerto_Rico",
                      "America/Punta_Arenas",
                      "America/Rankin_Inlet",
                      "America/Recife",
                      "America/Regina",
                      "America/Resolute",
                      "America/Rio_Branco",
                      "America/Santarem",
                      "America/Santiago",
                      "America/Santo_Domingo",
                      "America/Sao_Paulo",
                      "America/Scoresbysund",
                      "America/Sitka",
                      "America/St_Barthelemy",
                      "America/St_Johns",
                      "America/St_Kitts",
                      "America/St_Lucia",
                      "America/St_Thomas",
                      "America/St_Vincent",
                      "America/Swift_Current",
                      "America/Tegucigalpa",
                      "America/Thule",
                      "America/Tijuana",
                      "America/Toronto",
                      "America/Tortola",
                      "America/Vancouver",
                      "America/Whitehorse",
                      "America/Winnipeg",
                      "America/Yakutat",
                      "Antarctica/Casey",
                      "Antarctica/Davis",
                      "Antarctica/DumontDUrville",
                      "Antarctica/Macquarie",
                      "Antarctica/Mawson",
                      "Antarctica/McMurdo",
                      "Antarctica/Palmer",
                      "Antarctica/Rothera",
                      "Antarctica/Syowa",
                      "Antarctica/Troll",
                      "Antarctica/Vostok",
                      "Arctic/Longyearbyen",
                      "Asia/Aden",
                      "Asia/Almaty",
                      "Asia/Amman",
                      "Asia/Anadyr",
                      "Asia/Aqtau",
                      "Asia/Aqtobe",
                      "Asia/Ashgabat",
                      "Asia/Atyrau",
                      "Asia/Baghdad",
                      "Asia/Bahrain",
                      "Asia/Baku",
                      "Asia/Bangkok",
                      "Asia/Barnaul",
                      "Asia/Beirut",
                      "Asia/Bishkek",
                      "Asia/Brunei",
                      "Asia/Calcutta",
                      "Asia/Chita",
                      "Asia/Colombo",
                      "Asia/Damascus",
                      "Asia/Dhaka",
                      "Asia/Dili",
                      "Asia/Dubai",
                      "Asia/Dushanbe",
                      "Asia/Famagusta",
                      "Asia/Gaza",
                      "Asia/Hebron",
                      "Asia/Hong_Kong",
                      "Asia/Hovd",
                      "Asia/Irkutsk",
                      "Asia/Jakarta",
                      "Asia/Jayapura",
                      "Asia/Jerusalem",
                      "Asia/Kabul",
                      "Asia/Kamchatka",
                      "Asia/Karachi",
                      "Asia/Katmandu",
                      "Asia/Khandyga",
                      "Asia/Krasnoyarsk",
                      "Asia/Kuala_Lumpur",
                      "Asia/Kuching",
                      "Asia/Kuwait",
                      "Asia/Macau",
                      "Asia/Magadan",
                      "Asia/Makassar",
                      "Asia/Manila",
                      "Asia/Muscat",
                      "Asia/Nicosia",
                      "Asia/Novokuznetsk",
                      "Asia/Novosibirsk",
                      "Asia/Omsk",
                      "Asia/Oral",
                      "Asia/Phnom_Penh",
                      "Asia/Pontianak",
                      "Asia/Pyongyang",
                      "Asia/Qatar",
                      "Asia/Qostanay",
                      "Asia/Qyzylorda",
                      "Asia/Rangoon",
                      "Asia/Riyadh",
                      "Asia/Saigon",
                      "Asia/Sakhalin",
                      "Asia/Samarkand",
                      "Asia/Seoul",
                      "Asia/Shanghai",
                      "Asia/Singapore",
                      "Asia/Srednekolymsk",
                      "Asia/Taipei",
                      "Asia/Tashkent",
                      "Asia/Tbilisi",
                      "Asia/Tehran",
                      "Asia/Thimphu",
                      "Asia/Tokyo",
                      "Asia/Tomsk",
                      "Asia/Ulaanbaatar",
                      "Asia/Urumqi",
                      "Asia/Ust-Nera",
                      "Asia/Vientiane",
                      "Asia/Vladivostok",
                      "Asia/Yakutsk",
                      "Asia/Yekaterinburg",
                      "Asia/Yerevan",
                      "Atlantic/Azores",
                      "Atlantic/Bermuda",
                      "Atlantic/Canary",
                      "Atlantic/Cape_Verde",
                      "Atlantic/Faeroe",
                      "Atlantic/Madeira",
                      "Atlantic/Reykjavik",
                      "Atlantic/South_Georgia",
                      "Atlantic/St_Helena",
                      "Atlantic/Stanley",
                      "Australia/Adelaide",
                      "Australia/Brisbane",
                      "Australia/Broken_Hill",
                      "Australia/Darwin",
                      "Australia/Eucla",
                      "Australia/Hobart",
                      "Australia/Lindeman",
                      "Australia/Lord_Howe",
                      "Australia/Melbourne",
                      "Australia/Perth",
                      "Australia/Sydney",
                      "Europe/Amsterdam",
                      "Europe/Andorra",
                      "Europe/Astrakhan",
                      "Europe/Athens",
                      "Europe/Belgrade",
                      "Europe/Berlin",
                      "Europe/Bratislava",
                      "Europe/Brussels",
                      "Europe/Bucharest",
                      "Europe/Budapest",
                      "Europe/Busingen",
                      "Europe/Chisinau",
                      "Europe/Copenhagen",
                      "Europe/Dublin",
                      "Europe/Gibraltar",
                      "Europe/Guernsey",
                      "Europe/Helsinki",
                      "Europe/Isle_of_Man",
                      "Europe/Istanbul",
                      "Europe/Jersey",
                      "Europe/Kaliningrad",
                      "Europe/Kiev",
                      "Europe/Kirov",
                      "Europe/Lisbon",
                      "Europe/Ljubljana",
                      "Europe/London",
                      "Europe/Luxembourg",
                      "Europe/Madrid",
                      "Europe/Malta",
                      "Europe/Mariehamn",
                      "Europe/Minsk",
                      "Europe/Monaco",
                      "Europe/Moscow",
                      "Europe/Oslo",
                      "Europe/Paris",
                      "Europe/Podgorica",
                      "Europe/Prague",
                      "Europe/Riga",
                      "Europe/Rome",
                      "Europe/Samara",
                      "Europe/San_Marino",
                      "Europe/Sarajevo",
                      "Europe/Saratov",
                      "Europe/Simferopol",
                      "Europe/Skopje",
                      "Europe/Sofia",
                      "Europe/Stockholm",
                      "Europe/Tallinn",
                      "Europe/Tirane",
                      "Europe/Ulyanovsk",
                      "Europe/Vaduz",
                      "Europe/Vatican",
                      "Europe/Vienna",
                      "Europe/Vilnius",
                      "Europe/Volgograd",
                      "Europe/Warsaw",
                      "Europe/Zagreb",
                      "Europe/Zurich",
                      "Indian/Antananarivo",
                      "Indian/Chagos",
                      "Indian/Christmas",
                      "Indian/Cocos",
                      "Indian/Comoro",
                      "Indian/Kerguelen",
                      "Indian/Mahe",
                      "Indian/Maldives",
                      "Indian/Mauritius",
                      "Indian/Mayotte",
                      "Indian/Reunion",
                      "Pacific/Apia",
                      "Pacific/Auckland",
                      "Pacific/Bougainville",
                      "Pacific/Chatham",
                      "Pacific/Easter",
                      "Pacific/Efate",
                      "Pacific/Enderbury",
                      "Pacific/Fakaofo",
                      "Pacific/Fiji",
                      "Pacific/Funafuti",
                      "Pacific/Galapagos",
                      "Pacific/Gambier",
                      "Pacific/Guadalcanal",
                      "Pacific/Guam",
                      "Pacific/Honolulu",
                      "Pacific/Kiritimati",
                      "Pacific/Kosrae",
                      "Pacific/Kwajalein",
                      "Pacific/Majuro",
                      "Pacific/Marquesas",
                      "Pacific/Midway",
                      "Pacific/Nauru",
                      "Pacific/Niue",
                      "Pacific/Norfolk",
                      "Pacific/Noumea",
                      "Pacific/Pago_Pago",
                      "Pacific/Palau",
                      "Pacific/Pitcairn",
                      "Pacific/Ponape",
                      "Pacific/Port_Moresby",
                      "Pacific/Rarotonga",
                      "Pacific/Saipan",
                      "Pacific/Tahiti",
                      "Pacific/Tarawa",
                      "Pacific/Tongatapu",
                      "Pacific/Truk",
                      "Pacific/Wake",
                      "Pacific/Wallis"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "A list of the SAML secrets for the app.",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/saml/{appSamlSecretId}/metadata.xml": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appSamlSecretId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "saml"
        ],
        "operationId": "getAppSamlEntityId",
        "responses": {
          "200": {
            "description": "Get the SAML entity ID metadata",
            "content": {
              "application/xml": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/scim/resource-types/{resourceTypeId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "resourceTypeId",
          "in": "path",
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimResourceType",
        "responses": {
          "200": {
            "description": "SCIM user",
            "content": {
              "application/scim+json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/scim/resource-types": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimResourceTypes",
        "responses": {
          "200": {
            "description": "SCIM user",
            "content": {
              "application/scim+json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/scim/schemas/{schemaId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "schemaId",
          "in": "path",
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimSchema",
        "responses": {
          "200": {
            "description": "The SCIM Schema",
            "content": {
              "application/scim+json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUser"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/scim/schemas": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimSchemas",
        "responses": {
          "200": {
            "description": "The SCIM Schema",
            "content": {
              "application/scim+json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUser"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/scim/service-provider-config": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimServiceProviderConfig",
        "responses": {
          "200": {
            "description": "SCIM user",
            "content": {
              "application/scim+json": {
                "schema": {}
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/scim/users/{userId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "userId",
          "in": "path",
          "description": "The ID of the member to perform the operation on",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/User/properties/id"
          }
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimUser",
        "responses": {
          "200": {
            "description": "SCIM user",
            "content": {
              "application/scim+json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUser"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "deleteAppScimUser",
        "responses": {
          "204": {
            "description": "SCIM user"
          }
        }
      },
      "put": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "updateAppScimUser",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "application/scim+json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "SCIM user"
          }
        }
      },
      "patch": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "patchAppScimUser",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "application/scim+json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "SCIM user"
          }
        }
      }
    },
    "/api/apps/{appId}/scim/users": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "createAppScimUser",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "application/scim+json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Integrated SCIM user schema",
            "content": {
              "application/scim+json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUser"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "main",
          "app",
          "scim"
        ],
        "security": [
          {
            "scim": []
          }
        ],
        "operationId": "getAppScimUsers",
        "parameters": [
          {
            "name": "count",
            "in": "query",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "startIndex",
            "in": "query",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "SCIM user",
            "content": {
              "application/scim+json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimUser"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/screenshots/{screenshotId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/screenshotId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "screenshot"
        ],
        "description": "Get a screenshot of an app.",
        "operationId": "getAppScreenshot",
        "responses": {
          "200": {
            "description": "The app screenshot"
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "screenshot"
        ],
        "description": "Delete an existing screenshot.",
        "operationId": "deleteAppScreenshot",
        "responses": {
          "200": {
            "description": "The screenshot has been successfully deleted."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/screenshots": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "screenshot"
        ],
        "description": "Add one or multiple screenshots of an app.",
        "operationId": "createAppScreenshot",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "screenshots": {
                    "type": "array",
                    "description": "Screenshots to showcase in the store",
                    "minItems": 1,
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "language": {
                    "type": "string",
                    "description": "The language for which the screenshots will be uploaded"
                  }
                }
              },
              "encoding": {
                "screenshots": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The screenshots have been successfully created.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "integer",
                    "description": "The ID of the newly created screenshot."
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/secrets/oauth2/{appOAuth2SecretId}/verify": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appOAuth2SecretId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "verifyAppOAuth2SecretCode",
        "security": [
          {
            "studio": []
          },
          {}
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "code",
                  "scope",
                  "redirectUri",
                  "timezone"
                ],
                "properties": {
                  "code": {
                    "type": "string"
                  },
                  "scope": {
                    "type": "string"
                  },
                  "redirectUri": {
                    "type": "string"
                  },
                  "timezone": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "\n            Get a partial app OAuth2 secret\n\n            Only public facing values are output on this endpoint.\n          ",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "code": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/oauth2/{appOAuth2SecretId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appOAuth2SecretId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "getAppOAuth2Secret",
        "responses": {
          "200": {
            "description": "\n            Get a partial app OAuth2 secret\n\n            Only public facing values are output on this endpoint.\n          ",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppOAuth2Secret"
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "updateAppOAuth2Secret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppOAuth2Secret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The updated OAuth2 secret.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppOAuth2Secret"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "deleteAppOAuth2Secret",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted OAuth2 secret."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/oauth2": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "createAppOAuth2Secret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppOAuth2Secret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "201": {
            "description": "A list of the OAuth2 secrets for the app.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppOAuth2Secret"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "getAppOAuth2Secrets",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "A list of the OAuth2 secrets for the app.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppOAuth2Secret"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "oauth2"
        ],
        "operationId": "deleteAppOAuth2Secrets",
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app OAuth2 secrets."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/saml/{appSamlSecretId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appSamlSecretId"
        }
      ],
      "put": {
        "tags": [
          "main",
          "app",
          "secret",
          "saml"
        ],
        "operationId": "updateAppSamlSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The updated SAML secret.",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "saml"
        ],
        "operationId": "deleteAppSamlSecret",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted SAML secret."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/saml": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "secret",
          "saml"
        ],
        "operationId": "createAppSamlSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "201": {
            "description": "A list of the SAML secrets for the app.",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "saml"
        ],
        "operationId": "getAppSamlSecrets",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "A list of the SAML secrets for the app.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "saml"
        ],
        "operationId": "deleteAppSamlSecrets",
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app saml secrets."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/scim": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "scim"
        ],
        "operationId": "getAppScimSecret",
        "description": "Get app SCIM secret configuration",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The app SCIM configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimSecret"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "main",
          "app",
          "secret",
          "scim"
        ],
        "operationId": "updateAppScimSecret",
        "description": "Update app SCIM secret configuration",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScimSecret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "The app SCIM configuration",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ScimSecret"
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/service/{serviceSecretId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/serviceSecretId"
        }
      ],
      "put": {
        "tags": [
          "main",
          "app",
          "secret",
          "service"
        ],
        "operationId": "updateAppServiceSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppServiceSecret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The updated app service secret.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppServiceSecret"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "service"
        ],
        "operationId": "deleteAppServiceSecret",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app service secret."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/service": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "secret",
          "service"
        ],
        "operationId": "createAppServiceSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppServiceSecret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "201": {
            "description": "The created app service secret.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppServiceSecret"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "service"
        ],
        "operationId": "getAppServiceSecrets",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The list of app service secrets.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppServiceSecret"
                  }
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "service"
        ],
        "operationId": "deleteAppServiceSecrets",
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app service secrets."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/ssl": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "ssl"
        ],
        "description": "Get the SSL certificate of an app",
        "operationId": "getAppSslSecret",
        "responses": {
          "200": {
            "description": "The SSL secret of the app.",
            "$ref": "#/components/schemas/SSLSecret"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "put": {
        "tags": [
          "main",
          "app",
          "secret",
          "ssl"
        ],
        "description": "Update the app’s SSL secret",
        "operationId": "updateAppSslSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SSLSecret"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated SSL secret.",
            "$ref": "#/components/schemas/SSLSecret"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/secrets/webhook/{webhookSecretId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/webhookSecretId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "webhook"
        ],
        "operationId": "getAppWebhookSecret",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The requested webhook secret.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "secret": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "main",
          "app",
          "secret",
          "webhook"
        ],
        "operationId": "updateAppWebhookSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppWebhookSecret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The updated app webhook secret.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppWebhookSecret"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "secret",
          "webhook"
        ],
        "operationId": "deleteAppWebhookSecret",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app webhook secret."
          }
        }
      }
    },
    "/api/apps/{appId}/secrets/webhook": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "secret",
          "webhook"
        ],
        "operationId": "createAppWebhookSecret",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppWebhookSecret"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "201": {
            "description": "The created app webhook secret.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppWebhookSecret"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "main",
          "app",
          "secret",
          "webhook"
        ],
        "operationId": "getAppWebhookSecrets",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The list of app webhook secrets.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppWebhookSecret"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/snapshots/{snapshotId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "snapshotId",
          "in": "path",
          "description": "The ID of the snapshot",
          "required": true,
          "schema": {
            "type": "number",
            "description": "The ID of the snapshot."
          }
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "snapshot"
        ],
        "description": "Get a single snapshot made of the app.",
        "operationId": "getAppSnapshot",
        "responses": {
          "200": {
            "description": "The snapshot",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "description": "The ID of the snapshot."
                    },
                    "yaml": {
                      "type": "string",
                      "description": "The app definition."
                    },
                    "$created": {
                      "type": "string",
                      "format": "date-time",
                      "description": "The creation date of the snapshot."
                    },
                    "$author": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/components/schemas/User/properties/id"
                        },
                        "name": {
                          "$ref": "#/components/schemas/User/properties/name"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/snapshots": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "snapshot"
        ],
        "description": "Get a list of snapshots made of the app.",
        "operationId": "getAppSnapshots",
        "responses": {
          "200": {
            "description": "The available snapshots",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "number",
                        "description": "The ID of the snapshot."
                      },
                      "$created": {
                        "type": "string",
                        "format": "date-time",
                        "description": "The creation date of the snapshot."
                      },
                      "$author": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "$ref": "#/components/schemas/User/properties/id"
                          },
                          "name": {
                            "$ref": "#/components/schemas/User/properties/name"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/style/block/@{organizationId}/{blockId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app"
        ],
        "description": "Get the app style for a block.",
        "operationId": "getAppBlockStyle",
        "responses": {
          "200": {
            "description": "The stylesheet associated with this block for this app.",
            "content": {
              "text/css": {}
            }
          }
        }
      },
      "post": {
        "tags": [
          "main",
          "app",
          "block"
        ],
        "description": "Upload a block stylesheet for this app.",
        "operationId": "setAppBlockStyle",
        "requestBody": {
          "description": "The new app block stylesheet.",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "style"
                ],
                "properties": {
                  "style": {
                    "type": "string"
                  },
                  "force": {
                    "type": "boolean",
                    "writeOnly": true,
                    "description": "If this is true, the app lock is ignored."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The block style has been updated successfully."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/style/core": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app"
        ],
        "description": "Get the core style for this app.",
        "operationId": "getAppCoreStyle",
        "responses": {
          "200": {
            "description": "The core stylesheet associated with this app.",
            "content": {
              "text/css": {}
            }
          }
        }
      }
    },
    "/api/apps/{appId}/style/shared": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app"
        ],
        "description": "Get the shared style for this app.",
        "operationId": "getAppSharedStyle",
        "responses": {
          "200": {
            "description": "The shared stylesheet associated with this app.",
            "content": {
              "text/css": {}
            }
          }
        }
      }
    },
    "/api/apps/{appId}/subscriptions": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app",
          "subscription"
        ],
        "parameters": [
          {
            "$ref": "#/components/parameters/endpoint"
          }
        ],
        "description": "Fetch all subscription settings of an app.",
        "operationId": "getAppSubscription",
        "responses": {
          "200": {
            "description": "The subscription settings.",
            "$ref": "#/components/responses/subscriptions"
          }
        }
      },
      "post": {
        "tags": [
          "main",
          "app",
          "subscription"
        ],
        "description": "Subscribe to an app’s push notifications",
        "operationId": "createAppSubscription",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "description": "A serialized PushSubscription object",
                "required": [
                  "endpoint",
                  "keys"
                ],
                "properties": {
                  "endpoint": {
                    "type": "string"
                  },
                  "keys": {
                    "type": "object",
                    "required": [
                      "p256dh",
                      "auth"
                    ],
                    "properties": {
                      "p256dh": {
                        "type": "string"
                      },
                      "auth": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The subscription has successfully been registered."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "openid"
            ]
          },
          {}
        ]
      },
      "patch": {
        "tags": [
          "main",
          "app",
          "subscription"
        ],
        "description": "Subscribe to an app’s push notifications. If value isn’t set it will toggle between subscribing and unsubscribing.",
        "operationId": "updateAppSubscription",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "endpoint",
                  "resource",
                  "action"
                ],
                "properties": {
                  "endpoint": {
                    "type": "string",
                    "format": "uri"
                  },
                  "resource": {
                    "type": "string"
                  },
                  "action": {
                    "type": "string",
                    "enum": [
                      "create",
                      "update",
                      "delete"
                    ]
                  },
                  "value": {
                    "type": "boolean"
                  },
                  "resourceId": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The subscription has successfully been updated."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "openid"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/variables/{appVariableId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/appVariableId"
        }
      ],
      "put": {
        "tags": [
          "main",
          "app",
          "variable"
        ],
        "operationId": "updateAppVariable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppVariable"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "The updated app variable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppVariable"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "variable"
        ],
        "operationId": "deleteAppVariable",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app variable."
          }
        }
      }
    },
    "/api/apps/{appId}/variables": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "variable"
        ],
        "operationId": "getAppVariables",
        "responses": {
          "200": {
            "description": "The list of app variables.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppVariable"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "main",
          "app",
          "variable"
        ],
        "operationId": "createAppVariable",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AppVariable"
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "201": {
            "description": "The created app variable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppVariable"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "app",
          "variable"
        ],
        "operationId": "deleteAppVariables",
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ],
        "responses": {
          "204": {
            "description": "The deleted app variables."
          }
        }
      }
    },
    "/api/apps/{appId}/webhooks/{webhookName}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/webhookName"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app",
          "webhook"
        ],
        "description": "Call a webhook defined in the app",
        "operationId": "callAppWebhook",
        "responses": {
          "200": {
            "description": "The webhook was called successfully."
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        },
        "security": [
          {
            "webhook": []
          },
          {
            "app": [
              "email",
              "profile"
            ]
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "app"
        ],
        "parameters": [
          {
            "name": "language",
            "schema": {
              "type": "string"
            },
            "description": "The language to include the translations of, if available",
            "in": "query"
          }
        ],
        "description": "Get a single app",
        "operationId": "getAppById",
        "responses": {
          "200": {
            "description": "The app that matches the given id.",
            "$ref": "#/components/responses/app"
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      },
      "patch": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Update parts of an existing app",
        "operationId": "patchApp",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "$ref": "#/components/schemas/App/properties/domain"
                  },
                  "path": {
                    "$ref": "#/components/schemas/App/properties/path"
                  },
                  "visibility": {
                    "$ref": "#/components/schemas/App/properties/visibility"
                  },
                  "template": {
                    "$ref": "#/components/schemas/App/properties/template"
                  },
                  "demoMode": {
                    "$ref": "#/components/schemas/App/properties/demoMode"
                  },
                  "force": {
                    "type": "boolean",
                    "description": "Whether the locked property should be ignored."
                  },
                  "yaml": {
                    "type": "string",
                    "description": "The original YAML definition used to define the app."
                  },
                  "icon": {
                    "type": "string",
                    "format": "binary",
                    "description": "The app icon."
                  },
                  "maskableIcon": {
                    "type": "string",
                    "format": "binary",
                    "description": "The app icon."
                  },
                  "iconBackground": {
                    "type": "string",
                    "pattern": "^#[\\dA-Fa-f]{6}$"
                  },
                  "coreStyle": {
                    "type": "string",
                    "description": "The custom style to apply to the core app."
                  },
                  "sharedStyle": {
                    "type": "string",
                    "description": "The custom style to apply to all parts of app."
                  },
                  "supportedLanguages": {
                    "$ref": "#/components/schemas/App/properties/supportedLanguages"
                  },
                  "screenshots": {
                    "type": "array",
                    "description": "Screenshots to showcase in the store",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "readmes": {
                    "type": "array",
                    "description": "Readmes to showcase in the store",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "controllerCode": {
                    "type": "string",
                    "description": "Custom app logic as a JavaScript string"
                  },
                  "controllerImplementations": {
                    "type": "string",
                    "description": "Appsemble SDK interfaces implementations"
                  },
                  "showAppsembleLogin": {
                    "type": "boolean",
                    "description": "Whether the Appsemble login method should be shown."
                  },
                  "showAppsembleOAuth2Login": {
                    "type": "boolean",
                    "description": "Whether the Appsemble OAuth2 login method should be shown."
                  },
                  "totp": {
                    "$ref": "#/components/schemas/App/properties/totp"
                  },
                  "enableSelfRegistration": {
                    "type": "boolean",
                    "description": "Whether new users should be able to register themselves."
                  },
                  "displayAppMemberName": {
                    "$ref": "#/components/schemas/App/properties/displayAppMemberName"
                  },
                  "displayInstallationPrompt": {
                    "$ref": "#/components/schemas/App/properties/displayInstallationPrompt"
                  },
                  "emailName": {
                    "type": "string",
                    "description": "The name used for emails."
                  },
                  "emailHost": {
                    "type": "string",
                    "description": "The hostname of the SMTP server."
                  },
                  "emailPassword": {
                    "type": "string",
                    "description": "The password to use for SMTP authentication. This gets encrypted when stored."
                  },
                  "emailUser": {
                    "type": "string",
                    "description": "The username used to authenticate against the SMTP server."
                  },
                  "emailPort": {
                    "type": "string",
                    "description": "The port used for the SMTP server."
                  },
                  "emailSecure": {
                    "type": "boolean",
                    "description": "Whether TLS is being used."
                  },
                  "stripeApiSecretKey": {
                    "type": "string",
                    "description": "The API key to use for Stripe authentication. This gets encrypted when stored."
                  },
                  "stripeWebhookSecret": {
                    "type": "string",
                    "description": "The secret to use for verifying incoming webhooks. This gets encrypted when stored."
                  },
                  "successUrl": {
                    "type": "string",
                    "description": "The URL to which the user will be redirected after a successful payment."
                  },
                  "cancelUrl": {
                    "type": "string",
                    "description": "The URL to which the user will be redirected after an unsuccessful payment."
                  },
                  "containers": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/ContainerDefinition"
                    }
                  }
                }
              },
              "encoding": {
                "coreStyle": {
                  "contentType": "text/css"
                },
                "sharedStyle": {
                  "contentType": "text/css"
                },
                "icon": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated app.",
            "$ref": "#/components/responses/app"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      },
      "delete": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Delete an existing app",
        "operationId": "deleteApp",
        "responses": {
          "204": {
            "description": "The app was successfully deleted."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:delete"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/auth/email/login": {
      "post": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Login using the Appsemble studio.",
        "operationId": "loginAppMemberWithEmail",
        "responses": {
          "200": {
            "description": "Logged in successfully."
          }
        },
        "security": [
          {
            "basic": []
          }
        ]
      }
    },
    "/api/apps/{appId}/auth/email/register": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Register a new app account using an email address and a password.",
        "operationId": "registerAppMemberWithEmail",
        "requestBody": {
          "description": "The user account to register.",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "password",
                  "timezone"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "password": {
                    "type": "string",
                    "minLength": 8
                  },
                  "picture": {
                    "type": "string",
                    "format": "binary",
                    "description": "The account’s profile picture."
                  },
                  "properties": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    },
                    "description": "The member’s custom properties."
                  },
                  "timezone": {
                    "enum": [
                      "Africa/Abidjan",
                      "Africa/Accra",
                      "Africa/Addis_Ababa",
                      "Africa/Algiers",
                      "Africa/Asmera",
                      "Africa/Bamako",
                      "Africa/Bangui",
                      "Africa/Banjul",
                      "Africa/Bissau",
                      "Africa/Blantyre",
                      "Africa/Brazzaville",
                      "Africa/Bujumbura",
                      "Africa/Cairo",
                      "Africa/Casablanca",
                      "Africa/Ceuta",
                      "Africa/Conakry",
                      "Africa/Dakar",
                      "Africa/Dar_es_Salaam",
                      "Africa/Djibouti",
                      "Africa/Douala",
                      "Africa/El_Aaiun",
                      "Africa/Freetown",
                      "Africa/Gaborone",
                      "Africa/Harare",
                      "Africa/Johannesburg",
                      "Africa/Juba",
                      "Africa/Kampala",
                      "Africa/Khartoum",
                      "Africa/Kigali",
                      "Africa/Kinshasa",
                      "Africa/Lagos",
                      "Africa/Libreville",
                      "Africa/Lome",
                      "Africa/Luanda",
                      "Africa/Lubumbashi",
                      "Africa/Lusaka",
                      "Africa/Malabo",
                      "Africa/Maputo",
                      "Africa/Maseru",
                      "Africa/Mbabane",
                      "Africa/Mogadishu",
                      "Africa/Monrovia",
                      "Africa/Nairobi",
                      "Africa/Ndjamena",
                      "Africa/Niamey",
                      "Africa/Nouakchott",
                      "Africa/Ouagadougou",
                      "Africa/Porto-Novo",
                      "Africa/Sao_Tome",
                      "Africa/Tripoli",
                      "Africa/Tunis",
                      "Africa/Windhoek",
                      "America/Adak",
                      "America/Anchorage",
                      "America/Anguilla",
                      "America/Antigua",
                      "America/Araguaina",
                      "America/Argentina/La_Rioja",
                      "America/Argentina/Rio_Gallegos",
                      "America/Argentina/Salta",
                      "America/Argentina/San_Juan",
                      "America/Argentina/San_Luis",
                      "America/Argentina/Tucuman",
                      "America/Argentina/Ushuaia",
                      "America/Aruba",
                      "America/Asuncion",
                      "America/Bahia",
                      "America/Bahia_Banderas",
                      "America/Barbados",
                      "America/Belem",
                      "America/Belize",
                      "America/Blanc-Sablon",
                      "America/Boa_Vista",
                      "America/Bogota",
                      "America/Boise",
                      "America/Buenos_Aires",
                      "America/Cambridge_Bay",
                      "America/Campo_Grande",
                      "America/Cancun",
                      "America/Caracas",
                      "America/Catamarca",
                      "America/Cayenne",
                      "America/Cayman",
                      "America/Chicago",
                      "America/Chihuahua",
                      "America/Ciudad_Juarez",
                      "America/Coral_Harbour",
                      "America/Cordoba",
                      "America/Costa_Rica",
                      "America/Coyhaique",
                      "America/Creston",
                      "America/Cuiaba",
                      "America/Curacao",
                      "America/Danmarkshavn",
                      "America/Dawson",
                      "America/Dawson_Creek",
                      "America/Denver",
                      "America/Detroit",
                      "America/Dominica",
                      "America/Edmonton",
                      "America/Eirunepe",
                      "America/El_Salvador",
                      "America/Fort_Nelson",
                      "America/Fortaleza",
                      "America/Glace_Bay",
                      "America/Godthab",
                      "America/Goose_Bay",
                      "America/Grand_Turk",
                      "America/Grenada",
                      "America/Guadeloupe",
                      "America/Guatemala",
                      "America/Guayaquil",
                      "America/Guyana",
                      "America/Halifax",
                      "America/Havana",
                      "America/Hermosillo",
                      "America/Indiana/Knox",
                      "America/Indiana/Marengo",
                      "America/Indiana/Petersburg",
                      "America/Indiana/Tell_City",
                      "America/Indiana/Vevay",
                      "America/Indiana/Vincennes",
                      "America/Indiana/Winamac",
                      "America/Indianapolis",
                      "America/Inuvik",
                      "America/Iqaluit",
                      "America/Jamaica",
                      "America/Jujuy",
                      "America/Juneau",
                      "America/Kentucky/Monticello",
                      "America/Kralendijk",
                      "America/La_Paz",
                      "America/Lima",
                      "America/Los_Angeles",
                      "America/Louisville",
                      "America/Lower_Princes",
                      "America/Maceio",
                      "America/Managua",
                      "America/Manaus",
                      "America/Marigot",
                      "America/Martinique",
                      "America/Matamoros",
                      "America/Mazatlan",
                      "America/Mendoza",
                      "America/Menominee",
                      "America/Merida",
                      "America/Metlakatla",
                      "America/Mexico_City",
                      "America/Miquelon",
                      "America/Moncton",
                      "America/Monterrey",
                      "America/Montevideo",
                      "America/Montserrat",
                      "America/Nassau",
                      "America/New_York",
                      "America/Nome",
                      "America/Noronha",
                      "America/North_Dakota/Beulah",
                      "America/North_Dakota/Center",
                      "America/North_Dakota/New_Salem",
                      "America/Ojinaga",
                      "America/Panama",
                      "America/Paramaribo",
                      "America/Phoenix",
                      "America/Port-au-Prince",
                      "America/Port_of_Spain",
                      "America/Porto_Velho",
                      "America/Puerto_Rico",
                      "America/Punta_Arenas",
                      "America/Rankin_Inlet",
                      "America/Recife",
                      "America/Regina",
                      "America/Resolute",
                      "America/Rio_Branco",
                      "America/Santarem",
                      "America/Santiago",
                      "America/Santo_Domingo",
                      "America/Sao_Paulo",
                      "America/Scoresbysund",
                      "America/Sitka",
                      "America/St_Barthelemy",
                      "America/St_Johns",
                      "America/St_Kitts",
                      "America/St_Lucia",
                      "America/St_Thomas",
                      "America/St_Vincent",
                      "America/Swift_Current",
                      "America/Tegucigalpa",
                      "America/Thule",
                      "America/Tijuana",
                      "America/Toronto",
                      "America/Tortola",
                      "America/Vancouver",
                      "America/Whitehorse",
                      "America/Winnipeg",
                      "America/Yakutat",
                      "Antarctica/Casey",
                      "Antarctica/Davis",
                      "Antarctica/DumontDUrville",
                      "Antarctica/Macquarie",
                      "Antarctica/Mawson",
                      "Antarctica/McMurdo",
                      "Antarctica/Palmer",
                      "Antarctica/Rothera",
                      "Antarctica/Syowa",
                      "Antarctica/Troll",
                      "Antarctica/Vostok",
                      "Arctic/Longyearbyen",
                      "Asia/Aden",
                      "Asia/Almaty",
                      "Asia/Amman",
                      "Asia/Anadyr",
                      "Asia/Aqtau",
                      "Asia/Aqtobe",
                      "Asia/Ashgabat",
                      "Asia/Atyrau",
                      "Asia/Baghdad",
                      "Asia/Bahrain",
                      "Asia/Baku",
                      "Asia/Bangkok",
                      "Asia/Barnaul",
                      "Asia/Beirut",
                      "Asia/Bishkek",
                      "Asia/Brunei",
                      "Asia/Calcutta",
                      "Asia/Chita",
                      "Asia/Colombo",
                      "Asia/Damascus",
                      "Asia/Dhaka",
                      "Asia/Dili",
                      "Asia/Dubai",
                      "Asia/Dushanbe",
                      "Asia/Famagusta",
                      "Asia/Gaza",
                      "Asia/Hebron",
                      "Asia/Hong_Kong",
                      "Asia/Hovd",
                      "Asia/Irkutsk",
                      "Asia/Jakarta",
                      "Asia/Jayapura",
                      "Asia/Jerusalem",
                      "Asia/Kabul",
                      "Asia/Kamchatka",
                      "Asia/Karachi",
                      "Asia/Katmandu",
                      "Asia/Khandyga",
                      "Asia/Krasnoyarsk",
                      "Asia/Kuala_Lumpur",
                      "Asia/Kuching",
                      "Asia/Kuwait",
                      "Asia/Macau",
                      "Asia/Magadan",
                      "Asia/Makassar",
                      "Asia/Manila",
                      "Asia/Muscat",
                      "Asia/Nicosia",
                      "Asia/Novokuznetsk",
                      "Asia/Novosibirsk",
                      "Asia/Omsk",
                      "Asia/Oral",
                      "Asia/Phnom_Penh",
                      "Asia/Pontianak",
                      "Asia/Pyongyang",
                      "Asia/Qatar",
                      "Asia/Qostanay",
                      "Asia/Qyzylorda",
                      "Asia/Rangoon",
                      "Asia/Riyadh",
                      "Asia/Saigon",
                      "Asia/Sakhalin",
                      "Asia/Samarkand",
                      "Asia/Seoul",
                      "Asia/Shanghai",
                      "Asia/Singapore",
                      "Asia/Srednekolymsk",
                      "Asia/Taipei",
                      "Asia/Tashkent",
                      "Asia/Tbilisi",
                      "Asia/Tehran",
                      "Asia/Thimphu",
                      "Asia/Tokyo",
                      "Asia/Tomsk",
                      "Asia/Ulaanbaatar",
                      "Asia/Urumqi",
                      "Asia/Ust-Nera",
                      "Asia/Vientiane",
                      "Asia/Vladivostok",
                      "Asia/Yakutsk",
                      "Asia/Yekaterinburg",
                      "Asia/Yerevan",
                      "Atlantic/Azores",
                      "Atlantic/Bermuda",
                      "Atlantic/Canary",
                      "Atlantic/Cape_Verde",
                      "Atlantic/Faeroe",
                      "Atlantic/Madeira",
                      "Atlantic/Reykjavik",
                      "Atlantic/South_Georgia",
                      "Atlantic/St_Helena",
                      "Atlantic/Stanley",
                      "Australia/Adelaide",
                      "Australia/Brisbane",
                      "Australia/Broken_Hill",
                      "Australia/Darwin",
                      "Australia/Eucla",
                      "Australia/Hobart",
                      "Australia/Lindeman",
                      "Australia/Lord_Howe",
                      "Australia/Melbourne",
                      "Australia/Perth",
                      "Australia/Sydney",
                      "Europe/Amsterdam",
                      "Europe/Andorra",
                      "Europe/Astrakhan",
                      "Europe/Athens",
                      "Europe/Belgrade",
                      "Europe/Berlin",
                      "Europe/Bratislava",
                      "Europe/Brussels",
                      "Europe/Bucharest",
                      "Europe/Budapest",
                      "Europe/Busingen",
                      "Europe/Chisinau",
                      "Europe/Copenhagen",
                      "Europe/Dublin",
                      "Europe/Gibraltar",
                      "Europe/Guernsey",
                      "Europe/Helsinki",
                      "Europe/Isle_of_Man",
                      "Europe/Istanbul",
                      "Europe/Jersey",
                      "Europe/Kaliningrad",
                      "Europe/Kiev",
                      "Europe/Kirov",
                      "Europe/Lisbon",
                      "Europe/Ljubljana",
                      "Europe/London",
                      "Europe/Luxembourg",
                      "Europe/Madrid",
                      "Europe/Malta",
                      "Europe/Mariehamn",
                      "Europe/Minsk",
                      "Europe/Monaco",
                      "Europe/Moscow",
                      "Europe/Oslo",
                      "Europe/Paris",
                      "Europe/Podgorica",
                      "Europe/Prague",
                      "Europe/Riga",
                      "Europe/Rome",
                      "Europe/Samara",
                      "Europe/San_Marino",
                      "Europe/Sarajevo",
                      "Europe/Saratov",
                      "Europe/Simferopol",
                      "Europe/Skopje",
                      "Europe/Sofia",
                      "Europe/Stockholm",
                      "Europe/Tallinn",
                      "Europe/Tirane",
                      "Europe/Ulyanovsk",
                      "Europe/Vaduz",
                      "Europe/Vatican",
                      "Europe/Vienna",
                      "Europe/Vilnius",
                      "Europe/Volgograd",
                      "Europe/Warsaw",
                      "Europe/Zagreb",
                      "Europe/Zurich",
                      "Indian/Antananarivo",
                      "Indian/Chagos",
                      "Indian/Christmas",
                      "Indian/Cocos",
                      "Indian/Comoro",
                      "Indian/Kerguelen",
                      "Indian/Mahe",
                      "Indian/Maldives",
                      "Indian/Mauritius",
                      "Indian/Mayotte",
                      "Indian/Reunion",
                      "Pacific/Apia",
                      "Pacific/Auckland",
                      "Pacific/Bougainville",
                      "Pacific/Chatham",
                      "Pacific/Easter",
                      "Pacific/Efate",
                      "Pacific/Enderbury",
                      "Pacific/Fakaofo",
                      "Pacific/Fiji",
                      "Pacific/Funafuti",
                      "Pacific/Galapagos",
                      "Pacific/Gambier",
                      "Pacific/Guadalcanal",
                      "Pacific/Guam",
                      "Pacific/Honolulu",
                      "Pacific/Kiritimati",
                      "Pacific/Kosrae",
                      "Pacific/Kwajalein",
                      "Pacific/Majuro",
                      "Pacific/Marquesas",
                      "Pacific/Midway",
                      "Pacific/Nauru",
                      "Pacific/Niue",
                      "Pacific/Norfolk",
                      "Pacific/Noumea",
                      "Pacific/Pago_Pago",
                      "Pacific/Palau",
                      "Pacific/Pitcairn",
                      "Pacific/Ponape",
                      "Pacific/Port_Moresby",
                      "Pacific/Rarotonga",
                      "Pacific/Saipan",
                      "Pacific/Tahiti",
                      "Pacific/Tarawa",
                      "Pacific/Tongatapu",
                      "Pacific/Truk",
                      "Pacific/Wake",
                      "Pacific/Wallis"
                    ]
                  },
                  "phoneNumber": {
                    "type": "string",
                    "description": "Phone number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The account that was created."
          }
        }
      }
    },
    "/api/apps/{appId}/auth/email/password": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "patch": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Patch password of the app member",
        "operationId": "patchAppMemberPassword",
        "responses": {
          "200": {
            "description": "Successfully updated password"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "newPassword",
                  "currentPassword"
                ],
                "properties": {
                  "newPassword": {
                    "type": "string",
                    "minLength": 8
                  },
                  "currentPassword": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "app": []
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/auth/email/resend-verification": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Resend the verification code for a registered email.",
        "operationId": "resendAppMemberEmailVerification",
        "responses": {
          "204": {
            "description": "The verification email was sent if an account was found in the database."
          }
        },
        "security": [
          {
            "app": [
              "email"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/auth/email/request-password-reset": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Request a reset token for resetting passwords.",
        "operationId": "requestAppMemberPasswordReset",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The request has been received and an email was sent if it exists."
          }
        }
      }
    },
    "/api/apps/{appId}/auth/email/new-email": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "member",
          "email",
          "auth"
        ],
        "operationId": "requestAppMemberEmailUpdate",
        "description": "Update the email address of an app member",
        "responses": {
          "200": {
            "description": "The updated app member"
          }
        },
        "requestBody": {
          "description": "",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "app": [
              "email"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/auth/email/reset-password": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Reset a password using a password reset token.",
        "operationId": "resetAppMemberPassword",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "password",
                  "token"
                ],
                "properties": {
                  "password": {
                    "type": "string",
                    "minLength": 8
                  },
                  "token": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The password has been reset."
          }
        }
      }
    },
    "/api/apps/{appId}/auth/email/verify": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "email"
        ],
        "description": "Verify the email address of a registered user.",
        "operationId": "verifyAppMemberEmail",
        "requestBody": {
          "description": "The user account to register.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The account was successfully verified."
          }
        }
      }
    },
    "/api/apps/{appId}/auth/email/unverified": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "delete": {
        "parameters": [
          {
            "name": "email",
            "in": "query",
            "description": "Emails to be removed",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "delete",
          "app",
          "email",
          "auth"
        ],
        "description": "",
        "operationId": "deleteCurrentAppMemberUnverifiedEmail",
        "security": [
          {
            "app": [
              "email"
            ]
          }
        ],
        "responses": {
          "204": {
            "description": "Successfully removed email"
          }
        }
      }
    },
    "/api/apps/{appId}/auth/totp/setup": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "totp"
        ],
        "description": "Initialize TOTP setup for the current app member. Returns a secret and otpauth URL for QR code generation. When TOTP is required for the app, unauthenticated setup is allowed by providing a memberId.",
        "operationId": "setupAppMemberTotp",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "memberId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "The app member ID. Only used for unauthenticated setup when TOTP is required."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "TOTP secret and QR code URL generated successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "secret": {
                      "type": "string",
                      "description": "The TOTP secret key."
                    },
                    "otpauthUrl": {
                      "type": "string",
                      "description": "The otpauth URL for generating a QR code."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "TOTP is already enabled for this member or TOTP is disabled for this app."
          },
          "401": {
            "description": "User is not authenticated."
          },
          "403": {
            "description": "Unauthenticated TOTP setup is only allowed when TOTP is required."
          }
        },
        "security": [
          {
            "app": []
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/auth/totp/verify-setup": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "totp"
        ],
        "description": "Verify a TOTP token to complete the TOTP setup process and enable two-factor authentication. When TOTP is required for the app, unauthenticated verification is allowed by providing a memberId.",
        "operationId": "verifyAppMemberTotpSetup",
        "requestBody": {
          "description": "The TOTP token to verify.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string",
                    "minLength": 6,
                    "maxLength": 6,
                    "pattern": "^[0-9]{6}$",
                    "description": "The 6-digit TOTP token from the authenticator app."
                  },
                  "memberId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "The app member ID. Only used for unauthenticated verification when TOTP is required."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "TOTP has been successfully enabled."
          },
          "400": {
            "description": "Invalid TOTP token or TOTP setup not initiated."
          },
          "401": {
            "description": "User is not authenticated."
          },
          "403": {
            "description": "Unauthenticated TOTP verification is only allowed when TOTP is required."
          }
        },
        "security": [
          {
            "app": []
          },
          {}
        ]
      }
    },
    "/api/apps/{appId}/auth/totp/verify": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "totp"
        ],
        "description": "Verify a TOTP token during login to complete the two-factor authentication process.",
        "operationId": "verifyAppMemberTotp",
        "requestBody": {
          "description": "The member ID and TOTP token to verify.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "memberId",
                  "token"
                ],
                "properties": {
                  "memberId": {
                    "type": "string",
                    "format": "uuid",
                    "description": "The ID of the app member attempting to login."
                  },
                  "token": {
                    "type": "string",
                    "minLength": 6,
                    "maxLength": 6,
                    "pattern": "^[0-9]{6}$",
                    "description": "The 6-digit TOTP token from the authenticator app."
                  },
                  "scope": {
                    "type": "string",
                    "description": "The OAuth2 scope to include in the token."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "TOTP verified successfully. Returns JWT tokens.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "access_token": {
                      "type": "string",
                      "description": "The access token."
                    },
                    "expires_in": {
                      "type": "number",
                      "description": "Token expiration time in seconds."
                    },
                    "refresh_token": {
                      "type": "string",
                      "description": "The refresh token."
                    },
                    "token_type": {
                      "type": "string",
                      "description": "The token type (bearer)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "TOTP is not enabled for this member."
          },
          "401": {
            "description": "Invalid TOTP token."
          },
          "404": {
            "description": "App member not found."
          }
        }
      }
    },
    "/api/apps/{appId}/auth/totp/disable": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "post": {
        "tags": [
          "app",
          "auth",
          "totp"
        ],
        "description": "Disable TOTP two-factor authentication for the current app member.",
        "operationId": "disableAppMemberTotp",
        "requestBody": {
          "description": "The TOTP token to verify before disabling.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string",
                    "minLength": 6,
                    "maxLength": 6,
                    "pattern": "^[0-9]{6}$",
                    "description": "The 6-digit TOTP token from the authenticator app."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "TOTP has been successfully disabled."
          },
          "400": {
            "description": "Invalid TOTP token or TOTP is not enabled."
          },
          "401": {
            "description": "User is not authenticated."
          }
        },
        "security": [
          {
            "app": []
          }
        ]
      }
    },
    "/api/apps": {
      "post": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Create a new app",
        "operationId": "createApp",
        "parameters": [
          {
            "in": "query",
            "name": "dryRun",
            "description": "Validate whether an app could be created without actually creating one. Must be set to ‘true’.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "OrganizationId",
                  "yaml"
                ],
                "properties": {
                  "domain": {
                    "$ref": "#/components/schemas/App/properties/domain"
                  },
                  "path": {
                    "$ref": "#/components/schemas/App/properties/path"
                  },
                  "visibility": {
                    "$ref": "#/components/schemas/App/properties/visibility"
                  },
                  "template": {
                    "$ref": "#/components/schemas/App/properties/template"
                  },
                  "demoMode": {
                    "$ref": "#/components/schemas/App/properties/demoMode"
                  },
                  "totp": {
                    "$ref": "#/components/schemas/App/properties/totp"
                  },
                  "yaml": {
                    "type": "string",
                    "description": "The original YAML definition used to define the app."
                  },
                  "OrganizationId": {
                    "$ref": "#/components/schemas/Organization/properties/id"
                  },
                  "icon": {
                    "type": "string",
                    "format": "binary",
                    "description": "The app icon."
                  },
                  "maskableIcon": {
                    "type": "string",
                    "format": "binary",
                    "description": "The app icon."
                  },
                  "iconBackground": {
                    "type": "string",
                    "pattern": "^#[\\dA-Fa-f]{6}$",
                    "description": "The background color to use for the maskable icon."
                  },
                  "coreStyle": {
                    "type": "string",
                    "description": "The custom style to apply to the core app."
                  },
                  "sharedStyle": {
                    "type": "string",
                    "description": "The custom style to apply to all parts of app."
                  },
                  "supportedLanguages": {
                    "$ref": "#/components/schemas/App/properties/supportedLanguages"
                  },
                  "screenshots": {
                    "type": "array",
                    "description": "Screenshots to showcase in the store",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "readmes": {
                    "type": "array",
                    "description": "Readmes to showcase in the store",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  },
                  "controllerCode": {
                    "type": "string",
                    "description": "Custom app logic as a JavaScript string"
                  },
                  "controllerImplementations": {
                    "type": "string",
                    "description": "Appsemble SDK interfaces implementations"
                  }
                }
              },
              "encoding": {
                "coreStyle": {
                  "contentType": "text/css"
                },
                "sharedStyle": {
                  "contentType": "text/css"
                },
                "icon": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                },
                "screenshots": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The app that was created.",
            "$ref": "#/components/responses/app"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      },
      "get": {
        "tags": [
          "main",
          "app"
        ],
        "parameters": [
          {
            "name": "language",
            "schema": {
              "type": "string"
            },
            "description": "The language to include the translations of, if available",
            "in": "query"
          }
        ],
        "description": "Get all publically available apps.",
        "operationId": "queryApps",
        "responses": {
          "200": {
            "description": "The list of all public apps.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/App"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/app-templates": {
      "get": {
        "tags": [
          "main",
          "app",
          "template"
        ],
        "description": "Fetch a list of all available templates.",
        "operationId": "getAppTemplates",
        "responses": {
          "200": {
            "description": "The list of all available templates.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "template": {
                        "type": "string",
                        "description": "The name of the template."
                      },
                      "description": {
                        "type": "string",
                        "description": "The description of the template."
                      },
                      "resources": {
                        "type": "boolean",
                        "description": "Whether this template supports pre-made resources"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "post": {
        "tags": [
          "main",
          "app",
          "template"
        ],
        "description": "Register a new app using a template.",
        "operationId": "createAppFromTemplate",
        "requestBody": {
          "description": "The template to use for app creation.",
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "templateId",
                  "organizationId"
                ],
                "properties": {
                  "templateId": {
                    "type": "number",
                    "description": "The ID of the template."
                  },
                  "name": {
                    "type": "string",
                    "description": "The human readable name of the app.\n\nThis will be displayed for example on the home screen or in the browser tab.\n"
                  },
                  "description": {
                    "type": "string",
                    "description": "A short description describing the app.\n\nThis will be displayed on the app store.\n"
                  },
                  "organizationId": {
                    "type": "string",
                    "description": "The unique identifier for the organization."
                  },
                  "resources": {
                    "type": "boolean",
                    "description": "Include example resources."
                  },
                  "assets": {
                    "type": "boolean",
                    "description": "Include example assets."
                  },
                  "variables": {
                    "type": "boolean",
                    "description": "Include example variables."
                  },
                  "secrets": {
                    "type": "boolean",
                    "description": "Include example secrets."
                  },
                  "visibility": {
                    "$ref": "#/components/schemas/App/properties/visibility"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/app"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/auth/email/login": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Login using the Appsemble studio.",
        "operationId": "loginUserWithEmail",
        "responses": {
          "200": {
            "description": "Logged in successfully."
          }
        },
        "security": [
          {
            "basic": []
          }
        ]
      }
    },
    "/api/auth/email/register": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Register a new studio account using an email address and a password.",
        "operationId": "registerUserWithEmail",
        "requestBody": {
          "description": "The user account to register.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email",
                  "password"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  },
                  "password": {
                    "type": "string",
                    "minLength": 8
                  },
                  "timezone": {
                    "enum": [
                      "Africa/Abidjan",
                      "Africa/Accra",
                      "Africa/Addis_Ababa",
                      "Africa/Algiers",
                      "Africa/Asmera",
                      "Africa/Bamako",
                      "Africa/Bangui",
                      "Africa/Banjul",
                      "Africa/Bissau",
                      "Africa/Blantyre",
                      "Africa/Brazzaville",
                      "Africa/Bujumbura",
                      "Africa/Cairo",
                      "Africa/Casablanca",
                      "Africa/Ceuta",
                      "Africa/Conakry",
                      "Africa/Dakar",
                      "Africa/Dar_es_Salaam",
                      "Africa/Djibouti",
                      "Africa/Douala",
                      "Africa/El_Aaiun",
                      "Africa/Freetown",
                      "Africa/Gaborone",
                      "Africa/Harare",
                      "Africa/Johannesburg",
                      "Africa/Juba",
                      "Africa/Kampala",
                      "Africa/Khartoum",
                      "Africa/Kigali",
                      "Africa/Kinshasa",
                      "Africa/Lagos",
                      "Africa/Libreville",
                      "Africa/Lome",
                      "Africa/Luanda",
                      "Africa/Lubumbashi",
                      "Africa/Lusaka",
                      "Africa/Malabo",
                      "Africa/Maputo",
                      "Africa/Maseru",
                      "Africa/Mbabane",
                      "Africa/Mogadishu",
                      "Africa/Monrovia",
                      "Africa/Nairobi",
                      "Africa/Ndjamena",
                      "Africa/Niamey",
                      "Africa/Nouakchott",
                      "Africa/Ouagadougou",
                      "Africa/Porto-Novo",
                      "Africa/Sao_Tome",
                      "Africa/Tripoli",
                      "Africa/Tunis",
                      "Africa/Windhoek",
                      "America/Adak",
                      "America/Anchorage",
                      "America/Anguilla",
                      "America/Antigua",
                      "America/Araguaina",
                      "America/Argentina/La_Rioja",
                      "America/Argentina/Rio_Gallegos",
                      "America/Argentina/Salta",
                      "America/Argentina/San_Juan",
                      "America/Argentina/San_Luis",
                      "America/Argentina/Tucuman",
                      "America/Argentina/Ushuaia",
                      "America/Aruba",
                      "America/Asuncion",
                      "America/Bahia",
                      "America/Bahia_Banderas",
                      "America/Barbados",
                      "America/Belem",
                      "America/Belize",
                      "America/Blanc-Sablon",
                      "America/Boa_Vista",
                      "America/Bogota",
                      "America/Boise",
                      "America/Buenos_Aires",
                      "America/Cambridge_Bay",
                      "America/Campo_Grande",
                      "America/Cancun",
                      "America/Caracas",
                      "America/Catamarca",
                      "America/Cayenne",
                      "America/Cayman",
                      "America/Chicago",
                      "America/Chihuahua",
                      "America/Ciudad_Juarez",
                      "America/Coral_Harbour",
                      "America/Cordoba",
                      "America/Costa_Rica",
                      "America/Coyhaique",
                      "America/Creston",
                      "America/Cuiaba",
                      "America/Curacao",
                      "America/Danmarkshavn",
                      "America/Dawson",
                      "America/Dawson_Creek",
                      "America/Denver",
                      "America/Detroit",
                      "America/Dominica",
                      "America/Edmonton",
                      "America/Eirunepe",
                      "America/El_Salvador",
                      "America/Fort_Nelson",
                      "America/Fortaleza",
                      "America/Glace_Bay",
                      "America/Godthab",
                      "America/Goose_Bay",
                      "America/Grand_Turk",
                      "America/Grenada",
                      "America/Guadeloupe",
                      "America/Guatemala",
                      "America/Guayaquil",
                      "America/Guyana",
                      "America/Halifax",
                      "America/Havana",
                      "America/Hermosillo",
                      "America/Indiana/Knox",
                      "America/Indiana/Marengo",
                      "America/Indiana/Petersburg",
                      "America/Indiana/Tell_City",
                      "America/Indiana/Vevay",
                      "America/Indiana/Vincennes",
                      "America/Indiana/Winamac",
                      "America/Indianapolis",
                      "America/Inuvik",
                      "America/Iqaluit",
                      "America/Jamaica",
                      "America/Jujuy",
                      "America/Juneau",
                      "America/Kentucky/Monticello",
                      "America/Kralendijk",
                      "America/La_Paz",
                      "America/Lima",
                      "America/Los_Angeles",
                      "America/Louisville",
                      "America/Lower_Princes",
                      "America/Maceio",
                      "America/Managua",
                      "America/Manaus",
                      "America/Marigot",
                      "America/Martinique",
                      "America/Matamoros",
                      "America/Mazatlan",
                      "America/Mendoza",
                      "America/Menominee",
                      "America/Merida",
                      "America/Metlakatla",
                      "America/Mexico_City",
                      "America/Miquelon",
                      "America/Moncton",
                      "America/Monterrey",
                      "America/Montevideo",
                      "America/Montserrat",
                      "America/Nassau",
                      "America/New_York",
                      "America/Nome",
                      "America/Noronha",
                      "America/North_Dakota/Beulah",
                      "America/North_Dakota/Center",
                      "America/North_Dakota/New_Salem",
                      "America/Ojinaga",
                      "America/Panama",
                      "America/Paramaribo",
                      "America/Phoenix",
                      "America/Port-au-Prince",
                      "America/Port_of_Spain",
                      "America/Porto_Velho",
                      "America/Puerto_Rico",
                      "America/Punta_Arenas",
                      "America/Rankin_Inlet",
                      "America/Recife",
                      "America/Regina",
                      "America/Resolute",
                      "America/Rio_Branco",
                      "America/Santarem",
                      "America/Santiago",
                      "America/Santo_Domingo",
                      "America/Sao_Paulo",
                      "America/Scoresbysund",
                      "America/Sitka",
                      "America/St_Barthelemy",
                      "America/St_Johns",
                      "America/St_Kitts",
                      "America/St_Lucia",
                      "America/St_Thomas",
                      "America/St_Vincent",
                      "America/Swift_Current",
                      "America/Tegucigalpa",
                      "America/Thule",
                      "America/Tijuana",
                      "America/Toronto",
                      "America/Tortola",
                      "America/Vancouver",
                      "America/Whitehorse",
                      "America/Winnipeg",
                      "America/Yakutat",
                      "Antarctica/Casey",
                      "Antarctica/Davis",
                      "Antarctica/DumontDUrville",
                      "Antarctica/Macquarie",
                      "Antarctica/Mawson",
                      "Antarctica/McMurdo",
                      "Antarctica/Palmer",
                      "Antarctica/Rothera",
                      "Antarctica/Syowa",
                      "Antarctica/Troll",
                      "Antarctica/Vostok",
                      "Arctic/Longyearbyen",
                      "Asia/Aden",
                      "Asia/Almaty",
                      "Asia/Amman",
                      "Asia/Anadyr",
                      "Asia/Aqtau",
                      "Asia/Aqtobe",
                      "Asia/Ashgabat",
                      "Asia/Atyrau",
                      "Asia/Baghdad",
                      "Asia/Bahrain",
                      "Asia/Baku",
                      "Asia/Bangkok",
                      "Asia/Barnaul",
                      "Asia/Beirut",
                      "Asia/Bishkek",
                      "Asia/Brunei",
                      "Asia/Calcutta",
                      "Asia/Chita",
                      "Asia/Colombo",
                      "Asia/Damascus",
                      "Asia/Dhaka",
                      "Asia/Dili",
                      "Asia/Dubai",
                      "Asia/Dushanbe",
                      "Asia/Famagusta",
                      "Asia/Gaza",
                      "Asia/Hebron",
                      "Asia/Hong_Kong",
                      "Asia/Hovd",
                      "Asia/Irkutsk",
                      "Asia/Jakarta",
                      "Asia/Jayapura",
                      "Asia/Jerusalem",
                      "Asia/Kabul",
                      "Asia/Kamchatka",
                      "Asia/Karachi",
                      "Asia/Katmandu",
                      "Asia/Khandyga",
                      "Asia/Krasnoyarsk",
                      "Asia/Kuala_Lumpur",
                      "Asia/Kuching",
                      "Asia/Kuwait",
                      "Asia/Macau",
                      "Asia/Magadan",
                      "Asia/Makassar",
                      "Asia/Manila",
                      "Asia/Muscat",
                      "Asia/Nicosia",
                      "Asia/Novokuznetsk",
                      "Asia/Novosibirsk",
                      "Asia/Omsk",
                      "Asia/Oral",
                      "Asia/Phnom_Penh",
                      "Asia/Pontianak",
                      "Asia/Pyongyang",
                      "Asia/Qatar",
                      "Asia/Qostanay",
                      "Asia/Qyzylorda",
                      "Asia/Rangoon",
                      "Asia/Riyadh",
                      "Asia/Saigon",
                      "Asia/Sakhalin",
                      "Asia/Samarkand",
                      "Asia/Seoul",
                      "Asia/Shanghai",
                      "Asia/Singapore",
                      "Asia/Srednekolymsk",
                      "Asia/Taipei",
                      "Asia/Tashkent",
                      "Asia/Tbilisi",
                      "Asia/Tehran",
                      "Asia/Thimphu",
                      "Asia/Tokyo",
                      "Asia/Tomsk",
                      "Asia/Ulaanbaatar",
                      "Asia/Urumqi",
                      "Asia/Ust-Nera",
                      "Asia/Vientiane",
                      "Asia/Vladivostok",
                      "Asia/Yakutsk",
                      "Asia/Yekaterinburg",
                      "Asia/Yerevan",
                      "Atlantic/Azores",
                      "Atlantic/Bermuda",
                      "Atlantic/Canary",
                      "Atlantic/Cape_Verde",
                      "Atlantic/Faeroe",
                      "Atlantic/Madeira",
                      "Atlantic/Reykjavik",
                      "Atlantic/South_Georgia",
                      "Atlantic/St_Helena",
                      "Atlantic/Stanley",
                      "Australia/Adelaide",
                      "Australia/Brisbane",
                      "Australia/Broken_Hill",
                      "Australia/Darwin",
                      "Australia/Eucla",
                      "Australia/Hobart",
                      "Australia/Lindeman",
                      "Australia/Lord_Howe",
                      "Australia/Melbourne",
                      "Australia/Perth",
                      "Australia/Sydney",
                      "Europe/Amsterdam",
                      "Europe/Andorra",
                      "Europe/Astrakhan",
                      "Europe/Athens",
                      "Europe/Belgrade",
                      "Europe/Berlin",
                      "Europe/Bratislava",
                      "Europe/Brussels",
                      "Europe/Bucharest",
                      "Europe/Budapest",
                      "Europe/Busingen",
                      "Europe/Chisinau",
                      "Europe/Copenhagen",
                      "Europe/Dublin",
                      "Europe/Gibraltar",
                      "Europe/Guernsey",
                      "Europe/Helsinki",
                      "Europe/Isle_of_Man",
                      "Europe/Istanbul",
                      "Europe/Jersey",
                      "Europe/Kaliningrad",
                      "Europe/Kiev",
                      "Europe/Kirov",
                      "Europe/Lisbon",
                      "Europe/Ljubljana",
                      "Europe/London",
                      "Europe/Luxembourg",
                      "Europe/Madrid",
                      "Europe/Malta",
                      "Europe/Mariehamn",
                      "Europe/Minsk",
                      "Europe/Monaco",
                      "Europe/Moscow",
                      "Europe/Oslo",
                      "Europe/Paris",
                      "Europe/Podgorica",
                      "Europe/Prague",
                      "Europe/Riga",
                      "Europe/Rome",
                      "Europe/Samara",
                      "Europe/San_Marino",
                      "Europe/Sarajevo",
                      "Europe/Saratov",
                      "Europe/Simferopol",
                      "Europe/Skopje",
                      "Europe/Sofia",
                      "Europe/Stockholm",
                      "Europe/Tallinn",
                      "Europe/Tirane",
                      "Europe/Ulyanovsk",
                      "Europe/Vaduz",
                      "Europe/Vatican",
                      "Europe/Vienna",
                      "Europe/Vilnius",
                      "Europe/Volgograd",
                      "Europe/Warsaw",
                      "Europe/Zagreb",
                      "Europe/Zurich",
                      "Indian/Antananarivo",
                      "Indian/Chagos",
                      "Indian/Christmas",
                      "Indian/Cocos",
                      "Indian/Comoro",
                      "Indian/Kerguelen",
                      "Indian/Mahe",
                      "Indian/Maldives",
                      "Indian/Mauritius",
                      "Indian/Mayotte",
                      "Indian/Reunion",
                      "Pacific/Apia",
                      "Pacific/Auckland",
                      "Pacific/Bougainville",
                      "Pacific/Chatham",
                      "Pacific/Easter",
                      "Pacific/Efate",
                      "Pacific/Enderbury",
                      "Pacific/Fakaofo",
                      "Pacific/Fiji",
                      "Pacific/Funafuti",
                      "Pacific/Galapagos",
                      "Pacific/Gambier",
                      "Pacific/Guadalcanal",
                      "Pacific/Guam",
                      "Pacific/Honolulu",
                      "Pacific/Kiritimati",
                      "Pacific/Kosrae",
                      "Pacific/Kwajalein",
                      "Pacific/Majuro",
                      "Pacific/Marquesas",
                      "Pacific/Midway",
                      "Pacific/Nauru",
                      "Pacific/Niue",
                      "Pacific/Norfolk",
                      "Pacific/Noumea",
                      "Pacific/Pago_Pago",
                      "Pacific/Palau",
                      "Pacific/Pitcairn",
                      "Pacific/Ponape",
                      "Pacific/Port_Moresby",
                      "Pacific/Rarotonga",
                      "Pacific/Saipan",
                      "Pacific/Tahiti",
                      "Pacific/Tarawa",
                      "Pacific/Tongatapu",
                      "Pacific/Truk",
                      "Pacific/Wake",
                      "Pacific/Wallis"
                    ]
                  },
                  "subscribed": {
                    "type": "boolean",
                    "default": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The account that was created."
          }
        }
      }
    },
    "/api/auth/email/reset-password": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Reset a password using a password reset token.",
        "operationId": "resetUserPassword",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "password",
                  "token"
                ],
                "properties": {
                  "password": {
                    "type": "string",
                    "minLength": 8
                  },
                  "token": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The password has been reset."
          }
        }
      }
    },
    "/api/auth/email/patch-password": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Update password",
        "operationId": "patchPassword",
        "responses": {
          "200": {
            "description": "Password changed."
          }
        },
        "security": [
          {
            "studio": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "newPassword",
                  "currentPassword"
                ],
                "properties": {
                  "newPassword": {
                    "type": "string",
                    "minLength": 8
                  },
                  "currentPassword": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/auth/email/resend-verification": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Resend the verification code for a registered email.",
        "operationId": "resendUserEmailVerification",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The verification email was sent if an account was found in the database."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/auth/email/request-password-reset": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Request a reset token for resetting passwords.",
        "operationId": "requestUserPasswordReset",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The request has been received and an email was sent if it exists."
          }
        }
      }
    },
    "/api/auth/email/verify": {
      "post": {
        "tags": [
          "main",
          "auth",
          "email"
        ],
        "description": "Verify the email address of a registered user.",
        "operationId": "verifyUserEmail",
        "requestBody": {
          "description": "The user account to register.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "token"
                ],
                "properties": {
                  "token": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The account was successfully verified."
          }
        }
      }
    },
    "/api/auth/oauth2/authorizations/connect": {
      "post": {
        "description": "Create an account using an OAuth2 authorization.",
        "tags": [
          "main",
          "auth",
          "oauth2",
          "authorization"
        ],
        "operationId": "connectOAuth2Authorization",
        "requestBody": {
          "description": "The OAuth2 client credentials",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "code",
                  "authorizationUrl",
                  "timezone"
                ],
                "properties": {
                  "code": {
                    "type": "string"
                  },
                  "authorizationUrl": {
                    "type": "string"
                  },
                  "timezone": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "An access token response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/auth/oauth2/authorizations/register": {
      "post": {
        "tags": [
          "main",
          "auth",
          "oauth2",
          "authorization"
        ],
        "operationId": "registerOAuth2Authorization",
        "description": "asd",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "authorizationUrl",
                  "code"
                ],
                "properties": {
                  "authorizationUrl": {
                    "type": "string"
                  },
                  "code": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": ""
          }
        }
      }
    },
    "/api/auth/refresh-token": {
      "post": {
        "tags": [
          "main",
          "auth"
        ],
        "description": "Refresh an access token using the Appsemble studio",
        "operationId": "refreshToken",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "refresh_token"
                ],
                "properties": {
                  "refresh_token": {
                    "type": "string",
                    "description": "The refresh token to use for refreshing the session."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The token has been refreshed successfully."
          }
        }
      }
    },
    "/api/blocks/@{organizationId}/{blockId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "block"
        ],
        "description": "Get a single block",
        "operationId": "getBlock",
        "responses": {
          "200": {
            "description": "The latest version of the block that matches the given id.",
            "$ref": "#/components/responses/blockVersion"
          }
        }
      }
    },
    "/api/blocks/@{organizationId}/{blockId}/versions": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "block",
          "version"
        ],
        "description": "Retrieves all available versions of a block.",
        "operationId": "getBlockVersions",
        "responses": {
          "200": {
            "description": "A list of versions of a block.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BlockVersion"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/blocks/@{organizationId}/{blockId}/versions/list": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "block",
          "version"
        ],
        "description": "Retrieve a string list of all versions of a block.",
        "operationId": "getBlockVersionsList",
        "responses": {
          "200": {
            "description": "String list of all versions of a block.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/blocks/@{organizationId}/{blockId}/versions/{blockVersion}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        },
        {
          "$ref": "#/components/parameters/blockVersion"
        }
      ],
      "get": {
        "tags": [
          "common",
          "block",
          "version"
        ],
        "description": "Retrieve a single block version.",
        "operationId": "getBlockVersion",
        "responses": {
          "200": {
            "$ref": "#/components/responses/blockVersion"
          }
        }
      },
      "delete": {
        "tags": [
          "main",
          "block",
          "version"
        ],
        "description": "Delete a single block version.",
        "operationId": "deleteBlockVersion",
        "responses": {
          "204": {
            "description": "Block version has successfully been deleted"
          }
        },
        "security": [
          {
            "cli": [
              "blocks:delete"
            ]
          }
        ]
      }
    },
    "/api/blocks/@{organizationId}/{blockId}/versions/{blockVersion}/icon": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        },
        {
          "$ref": "#/components/parameters/blockVersion"
        }
      ],
      "get": {
        "tags": [
          "common",
          "block",
          "version"
        ],
        "description": "Get the icon of a block version.",
        "operationId": "getBlockVersionIcon",
        "responses": {
          "200": {
            "description": "The icon that represents the block."
          }
        }
      }
    },
    "/api/blocks/@{organizationId}/{blockId}/versions/{blockVersion}/messages/{language}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        },
        {
          "$ref": "#/components/parameters/blockVersion"
        },
        {
          "in": "path",
          "name": "language",
          "schema": {
            "type": "string"
          },
          "description": "The language to get messages for.",
          "required": true
        }
      ],
      "get": {
        "tags": [
          "common",
          "block",
          "version",
          "translation"
        ],
        "description": "Get internationalized messages for a block.",
        "operationId": "getBlockVersionMessages",
        "responses": {
          "200": {
            "description": "A key/value mapping of block messages.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "A key/value mapping of block messages.",
                  "additionalProperties": {
                    "type": "string",
                    "description": "A translated block message."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/blocks/@{organizationId}/{blockId}/versions/{blockVersion}/asset": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "$ref": "#/components/parameters/blockId"
        },
        {
          "$ref": "#/components/parameters/blockVersion"
        },
        {
          "name": "filename",
          "in": "query",
          "description": "The file name of the block asset to download",
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "common",
          "block",
          "version",
          "asset"
        ],
        "description": "Download a single block asset",
        "operationId": "getBlockVersionAsset",
        "responses": {
          "200": {
            "description": "The asset that has been requested."
          }
        }
      }
    },
    "/api/blocks": {
      "post": {
        "tags": [
          "main",
          "block"
        ],
        "description": "Publish a block.",
        "operationId": "createBlock",
        "requestBody": {
          "description": "The new block version to publish.",
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BlockVersion"
              }
            }
          }
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/blockVersion"
          }
        },
        "security": [
          {
            "cli": [
              "blocks:write"
            ]
          }
        ]
      },
      "get": {
        "tags": [
          "common",
          "block"
        ],
        "description": "Get all block’s latest definitions.",
        "operationId": "queryBlocks",
        "responses": {
          "200": {
            "description": "The list of all latest block versions.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BlockVersion"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/containers/{appId}/logs/{container}": {
      "get": {
        "tags": [
          "container"
        ],
        "description": "Retrieve the logs related to a companion container",
        "operationId": "getContainerLogs",
        "parameters": [
          {
            "name": "appId",
            "schema": {
              "type": "number"
            },
            "description": "Id of the app which defines the companion container",
            "in": "path"
          },
          {
            "name": "container",
            "schema": {
              "type": "string"
            },
            "description": "Name of the companion container to fetch the logs for",
            "in": "path"
          }
        ],
        "responses": {
          "200": {
            "description": "Logs of the container running in a specific app",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {}
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/health": {
      "get": {
        "tags": [
          "main"
        ],
        "description": "Check whether or not the API is healthy",
        "operationId": "checkHealth",
        "responses": {
          "200": {
            "description": "An indication the server is healthy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          }
        }
      }
    },
    "/api/payments/send-invoice": {
      "post": {
        "tags": [
          "main",
          "payments"
        ],
        "description": "Send an invoice.",
        "operationId": "sendInvoice",
        "responses": {
          "200": {
            "description": "Whether the invoice has been succesfully created and sent to Stripe."
          }
        },
        "parameters": [
          {
            "in": "query",
            "name": "organizationId",
            "description": "Organization that we want to invoice.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "subscriptionType",
            "description": "Subscription plan that we want to invoice for.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "period",
            "description": "Renewal period for which we want to invoice.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "couponCode",
            "description": "Coupon code that will be applied to the subscription.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/payments/accept-payment": {
      "post": {
        "tags": [
          "main",
          "payments"
        ],
        "description": "Accept a payment.",
        "operationId": "acceptPayment",
        "requestBody": {
          "description": "Information about the payment sent by Stripe.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "object": {
                    "type": "string"
                  },
                  "api_version": {
                    "type": "string"
                  },
                  "created": {
                    "type": "number"
                  },
                  "data": {
                    "type": "object",
                    "properties": {
                      "object": {
                        "type": "object",
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "object": {
                            "type": "string"
                          },
                          "account_country": {
                            "type": "string"
                          },
                          "account_name": {
                            "type": "string"
                          },
                          "account_tax_ids": {
                            "type": "string"
                          },
                          "amount_due": {
                            "type": "number"
                          },
                          "amount_paid": {
                            "type": "number"
                          },
                          "amount_remaining": {
                            "type": "number"
                          },
                          "amount_shipping": {
                            "type": "number"
                          },
                          "application": {
                            "type": "string"
                          },
                          "application_fee_amount": {
                            "type": "number"
                          },
                          "attempt_count": {
                            "type": "number"
                          },
                          "attempted": {
                            "type": "boolean"
                          },
                          "auto_advance": {
                            "type": "boolean"
                          },
                          "automatic_tax": {
                            "type": "object"
                          },
                          "automatically_finalizes_at": {
                            "type": "number"
                          },
                          "billing_reason": {
                            "type": "string"
                          },
                          "charge": {
                            "type": "string"
                          },
                          "collection_method": {
                            "type": "string"
                          },
                          "created": {
                            "type": "number"
                          },
                          "currency": {
                            "type": "string"
                          },
                          "custom_fields": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "customer": {
                            "type": "string"
                          },
                          "customer_address": {
                            "type": "object"
                          },
                          "customer_email": {
                            "type": "string"
                          },
                          "customer_name": {
                            "type": "string"
                          },
                          "customer_phone": {
                            "type": "string"
                          },
                          "customer_shipping": {
                            "type": "object"
                          },
                          "customer_tax_exempt": {
                            "type": "string"
                          },
                          "customer_tax_ids": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "default_payment_method": {
                            "type": "string"
                          },
                          "default_source": {
                            "type": "string"
                          },
                          "default_tax_rates": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "description": {
                            "type": "string"
                          },
                          "discount": {
                            "type": "object"
                          },
                          "discounts": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "due_date": {
                            "type": "number"
                          },
                          "effective_at": {
                            "type": "number"
                          },
                          "ending_balance": {
                            "type": "number"
                          },
                          "footer": {
                            "type": "string"
                          },
                          "from_invoice": {
                            "type": "object"
                          },
                          "hosted_invoice_url": {
                            "type": "string"
                          },
                          "invoice_pdf": {
                            "type": "string"
                          },
                          "issuer": {
                            "type": "object"
                          },
                          "last_finalization_error": {
                            "type": "object"
                          },
                          "latest_revision": {
                            "type": "string"
                          },
                          "lines": {
                            "type": "object"
                          },
                          "livemode": {
                            "type": "boolean"
                          },
                          "metadata": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "number"
                              }
                            }
                          },
                          "next_payment_attempt": {
                            "type": "number"
                          },
                          "number": {
                            "type": "string"
                          },
                          "on_behalf_of": {
                            "type": "string"
                          },
                          "paid": {
                            "type": "boolean"
                          },
                          "paid_out_of_band": {
                            "type": "boolean"
                          },
                          "payment_intent": {
                            "type": "string"
                          },
                          "payment_settings": {
                            "type": "object"
                          },
                          "period_end": {
                            "type": "number"
                          },
                          "period_start": {
                            "type": "number"
                          },
                          "post_payment_credit_notes_amount": {
                            "type": "number"
                          },
                          "pre_payment_credit_notes_amount": {
                            "type": "number"
                          },
                          "quote": {
                            "type": "string"
                          },
                          "receipt_number": {
                            "type": "string"
                          },
                          "rendering": {
                            "type": "object"
                          },
                          "shipping_cost": {
                            "type": "object"
                          },
                          "shipping_details": {
                            "type": "object"
                          },
                          "starting_balance": {
                            "type": "number"
                          },
                          "statement_descriptor": {
                            "type": "string"
                          },
                          "status": {
                            "type": "string"
                          },
                          "status_transitions": {
                            "type": "object"
                          },
                          "subscription": {
                            "type": "string"
                          },
                          "subscription_details": {
                            "type": "object"
                          },
                          "subtotal": {
                            "type": "number"
                          },
                          "subtotal_excluding_tax": {
                            "type": "number"
                          },
                          "tax": {
                            "type": "number"
                          },
                          "test_clock": {
                            "type": "string"
                          },
                          "total": {
                            "type": "number"
                          },
                          "total_discount_amounts": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "total_excluding_tax": {
                            "type": "number"
                          },
                          "total_pretax_credit_amounts": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "total_tax_amounts": {
                            "type": "array",
                            "items": {
                              "type": "object"
                            }
                          },
                          "transfer_data": {
                            "type": "object"
                          },
                          "webhooks_delivered_at": {
                            "type": "number"
                          }
                        }
                      }
                    }
                  },
                  "livemode": {
                    "type": "boolean"
                  },
                  "pending_webhooks": {
                    "type": "number"
                  },
                  "request": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "idempotency_key": {
                        "type": "string"
                      }
                    }
                  },
                  "type": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Response sent to Stripe, should be 200 OK if we receive the webhook, regardless of our internals."
          }
        }
      }
    },
    "/api/messages/{language}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/language"
        }
      ],
      "get": {
        "tags": [
          "main",
          "translation"
        ],
        "description": "Get the Appsemble messages for this language.",
        "operationId": "getStudioMessages",
        "responses": {
          "200": {
            "description": "The app messages for the selected language.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMessages"
                }
              }
            }
          }
        }
      }
    },
    "/api/messages": {
      "parameters": [
        {
          "name": "context",
          "in": "query",
          "schema": {
            "type": "string",
            "enum": [
              "studio",
              "app"
            ]
          }
        }
      ],
      "get": {
        "tags": [
          "common",
          "translation"
        ],
        "description": "Get a list of all languages with messages.",
        "operationId": "getAppsembleLanguages",
        "responses": {
          "200": {
            "description": "The list of supported languages",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/organization-invites/{token}/respond": {
      "parameters": [
        {
          "name": "token",
          "in": "path",
          "description": "The token of the invite.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "post": {
        "tags": [
          "main",
          "organization",
          "invite"
        ],
        "description": "Respond to a given invitation.",
        "operationId": "respondOrganizationInvite",
        "requestBody": {
          "description": "The response of the invitation.\n\n        If response is true, user will join the organization. If response is false, the user declines the invite and the invite is removed.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "response"
                ],
                "properties": {
                  "response": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The response has been processed."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organization-invites/{token}": {
      "parameters": [
        {
          "name": "token",
          "in": "path",
          "description": "The token of the invite.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "invite"
        ],
        "description": "Fetch information about an invite.",
        "operationId": "getOrganizationInvite",
        "responses": {
          "200": {
            "description": "An invite response",
            "$ref": "#/components/responses/invite"
          }
        }
      }
    },
    "/api/organizations/{organizationId}/app-collections": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "app-collection"
        ],
        "description": "Get a list of app collections for an organization",
        "operationId": "queryOrganizationAppCollections",
        "parameters": [
          {
            "name": "organizationId",
            "in": "path",
            "description": "The id of the organization",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Organization/properties/id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of app collections",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppCollection"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      },
      "post": {
        "tags": [
          "main",
          "organization",
          "app-collection"
        ],
        "description": "Create an app collection",
        "operationId": "createOrganizationAppCollection",
        "requestBody": {
          "description": "The app collection to create",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/AppCollectionDefinition"
                  },
                  {
                    "required": [
                      "name",
                      "expertName",
                      "expertProfileImage",
                      "headerImage"
                    ]
                  }
                ]
              },
              "encoding": {
                "expertProfileImage": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                },
                "headerImage": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The created app collection",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppCollection"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/apps/import": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "post": {
        "tags": [
          "main",
          "app"
        ],
        "description": "Import an app from a zip file",
        "operationId": "importApp",
        "requestBody": {
          "content": {
            "application/zip": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "App imported successfully",
            "$ref": "#/components/responses/app"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "apps:write"
            ]
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/apps": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "app"
        ],
        "parameters": [
          {
            "name": "language",
            "schema": {
              "type": "string"
            },
            "description": "The language to include the translations of, if available",
            "in": "query"
          }
        ],
        "description": "Get a list of an organization’s apps. Private apps are excluded unless the user is in the organization.",
        "operationId": "getOrganizationApps",
        "responses": {
          "200": {
            "description": "The list of this organization’s apps.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/App"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/organizations/{organizationId}/blocks": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "block"
        ],
        "description": "Get a list of an organization’s blocks.",
        "operationId": "getOrganizationBlocks",
        "responses": {
          "200": {
            "description": "The list of this organization’s blocks.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/BlockVersion"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/organizations/{organizationId}/icon": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "organization"
        ],
        "description": "Get the organization icon.",
        "operationId": "getOrganizationIcon",
        "responses": {
          "200": {
            "description": "The icon that represents the organization."
          }
        }
      }
    },
    "/api/organizations/{organizationId}/invites/resend": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "post": {
        "tags": [
          "organization"
        ],
        "description": "Request to resend an invitation.",
        "operationId": "resendOrganizationInvite",
        "requestBody": {
          "description": "The email of the person to resend the invitation to.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The invite has been sent."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/invites": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "invite"
        ],
        "description": "Get a list of invited organization members.",
        "operationId": "getOrganizationInvites",
        "responses": {
          "200": {
            "description": "The list of all invites.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "format": "email"
                      },
                      "role": {
                        "type": "string",
                        "enum": [
                          "Member",
                          "AppTranslator",
                          "AppContentsExplorer",
                          "AppContentsManager",
                          "AppMemberManager",
                          "AppGroupManager",
                          "AppGroupMembersManager",
                          "AppManager",
                          "AppCollectionManager",
                          "BlockManager",
                          "Maintainer",
                          "Owner"
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "post": {
        "tags": [
          "main",
          "organization",
          "invite"
        ],
        "description": "Invite a new member to the organization that matches the given id.",
        "operationId": "createOrganizationInvites",
        "requestBody": {
          "description": "The member to invite.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "email",
                    "role"
                  ],
                  "properties": {
                    "email": {
                      "type": "string",
                      "format": "email"
                    },
                    "role": {
                      "type": "string",
                      "enum": [
                        "Member",
                        "AppTranslator",
                        "AppContentsExplorer",
                        "AppContentsManager",
                        "AppMemberManager",
                        "AppGroupManager",
                        "AppGroupMembersManager",
                        "AppManager",
                        "AppCollectionManager",
                        "BlockManager",
                        "Maintainer",
                        "Owner"
                      ]
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The newly invited member.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "delete": {
        "tags": [
          "main",
          "organization",
          "invite"
        ],
        "description": "Revoke a member invitation.",
        "operationId": "deleteOrganizationInvite",
        "requestBody": {
          "description": "The email address to revoke the invite of.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The invitation has been successfully revoked."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/members/{organizationMemberId}/role": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "name": "organizationMemberId",
          "in": "path",
          "description": "The ID of the member",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/User/properties/id"
          }
        }
      ],
      "put": {
        "tags": [
          "main",
          "organization",
          "member"
        ],
        "description": "Set the role of the member within the organization.",
        "operationId": "updateOrganizationMemberRole",
        "requestBody": {
          "description": "The role to set.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "role"
                ],
                "properties": {
                  "role": {
                    "type": "string",
                    "enum": [
                      "Member",
                      "AppTranslator",
                      "AppContentsExplorer",
                      "AppContentsManager",
                      "AppMemberManager",
                      "AppGroupManager",
                      "AppGroupMembersManager",
                      "AppManager",
                      "AppCollectionManager",
                      "BlockManager",
                      "Maintainer",
                      "Owner"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The member’s role has been successfully updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrganizationMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/members/{organizationMemberId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        },
        {
          "name": "organizationMemberId",
          "in": "path",
          "description": "The ID of the member to remove",
          "required": true,
          "$ref": "#/components/schemas/User/properties/id",
          "schema": {
            "$ref": "#/components/schemas/User/properties/id"
          }
        }
      ],
      "delete": {
        "tags": [
          "main",
          "organization",
          "member"
        ],
        "description": "Remove a member from the organization that matches the given id, or leave the organization if the member id matches the user’s member id",
        "operationId": "removeOrganizationMember",
        "responses": {
          "204": {
            "description": "The member has been successfully removed."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/members": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "member"
        ],
        "description": "Get a list of organization members.",
        "operationId": "getOrganizationMembers",
        "responses": {
          "200": {
            "description": "The list of all members.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OrganizationMember"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/subscription": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization",
          "organization-subscription"
        ],
        "description": "Get the organization subscription.",
        "operationId": "getOrganizationOrganizationSubscription",
        "responses": {
          "200": {
            "$ref": "#/components/responses/organizationSubscription"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}/subscription/price": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization-subscription"
        ],
        "description": "Fetch the price of a subscription.",
        "operationId": "getOrganizationSubscriptionPrice",
        "parameters": [
          {
            "in": "query",
            "name": "subscriptionPlan",
            "description": "Subscription plan for which we need to calculate the price.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "period",
            "description": "Renewal period for which we need to calculate the price.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "couponCode",
            "description": "Coupon code that will be applied to the subscription.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/organizationSubscriptionPrice"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/organizations/{organizationId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationId"
        }
      ],
      "get": {
        "tags": [
          "main",
          "organization"
        ],
        "description": "Get a single organization.",
        "operationId": "getOrganization",
        "responses": {
          "200": {
            "$ref": "#/components/responses/organization"
          }
        }
      },
      "patch": {
        "tags": [
          "main",
          "organization"
        ],
        "description": "Update an organization",
        "operationId": "patchOrganization",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "$ref": "#/components/schemas/Organization/properties/name"
                  },
                  "description": {
                    "$ref": "#/components/schemas/Organization/properties/description"
                  },
                  "email": {
                    "$ref": "#/components/schemas/Organization/properties/email"
                  },
                  "website": {
                    "$ref": "#/components/schemas/Organization/properties/website"
                  },
                  "vatIdNumber": {
                    "$ref": "#/components/schemas/Organization/properties/vatIdNumber"
                  },
                  "streetName": {
                    "$ref": "#/components/schemas/Organization/properties/streetName"
                  },
                  "houseNumber": {
                    "$ref": "#/components/schemas/Organization/properties/houseNumber"
                  },
                  "city": {
                    "$ref": "#/components/schemas/Organization/properties/city"
                  },
                  "zipCode": {
                    "$ref": "#/components/schemas/Organization/properties/zipCode"
                  },
                  "countryCode": {
                    "$ref": "#/components/schemas/Organization/properties/countryCode"
                  },
                  "invoiceReference": {
                    "$ref": "#/components/schemas/Organization/properties/invoiceReference"
                  },
                  "icon": {
                    "type": "string",
                    "format": "binary",
                    "description": "The organization icon."
                  }
                }
              },
              "encoding": {
                "icon": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/organization"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "organizations:write"
            ]
          }
        ]
      },
      "delete": {
        "tags": [
          "main",
          "organization"
        ],
        "description": "Delete an organization.",
        "operationId": "deleteOrganization",
        "responses": {
          "200": {
            "description": "successfully deleted organization"
          }
        },
        "security": [
          {
            "studio": []
          },
          {}
        ]
      }
    },
    "/api/organizations": {
      "get": {
        "tags": [
          "main",
          "organization"
        ],
        "description": "Fetch the list of organizations.",
        "operationId": "getOrganizations",
        "responses": {
          "200": {
            "description": "The list of of organizations",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Organization"
                  }
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "main",
          "organization"
        ],
        "description": "Create a new organization.",
        "operationId": "createOrganization",
        "requestBody": {
          "description": "The organization to create",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/Organization/properties/id"
                  },
                  "name": {
                    "$ref": "#/components/schemas/Organization/properties/name"
                  },
                  "description": {
                    "$ref": "#/components/schemas/Organization/properties/description"
                  },
                  "email": {
                    "$ref": "#/components/schemas/Organization/properties/email"
                  },
                  "website": {
                    "$ref": "#/components/schemas/Organization/properties/website"
                  },
                  "vatIdNumber": {
                    "$ref": "#/components/schemas/Organization/properties/vatIdNumber"
                  },
                  "streetName": {
                    "$ref": "#/components/schemas/Organization/properties/streetName"
                  },
                  "houseNumber": {
                    "$ref": "#/components/schemas/Organization/properties/houseNumber"
                  },
                  "city": {
                    "$ref": "#/components/schemas/Organization/properties/city"
                  },
                  "zipCode": {
                    "$ref": "#/components/schemas/Organization/properties/zipCode"
                  },
                  "countryCode": {
                    "$ref": "#/components/schemas/Organization/properties/countryCode"
                  },
                  "invoiceReference": {
                    "$ref": "#/components/schemas/Organization/properties/invoiceReference"
                  },
                  "icon": {
                    "type": "string",
                    "format": "binary",
                    "description": "The organization icon."
                  }
                }
              },
              "encoding": {
                "icon": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/organization"
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "organizations:write"
            ]
          }
        ]
      }
    },
    "/api/organization-subscriptions/{organizationSubscriptionId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/organizationSubscriptionId"
        }
      ],
      "patch": {
        "tags": [
          "main",
          "organization-subscription"
        ],
        "description": "Patch a subscription",
        "operationId": "patchOrganizationSubscription",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "cancelled": {
                    "$ref": "#/components/schemas/OrganizationSubscription/properties/cancelled"
                  },
                  "cancellationReason": {
                    "$ref": "#/components/schemas/OrganizationSubscription/properties/cancellationReason"
                  },
                  "expirationDate": {
                    "$ref": "#/components/schemas/OrganizationSubscription/properties/expirationDate"
                  },
                  "subscriptionPlan": {
                    "$ref": "#/components/schemas/OrganizationSubscription/properties/subscriptionPlan"
                  },
                  "renewalPeriod": {
                    "$ref": "#/components/schemas/OrganizationSubscription/properties/renewalPeriod"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/organizationSubscription"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/ssl": {
      "get": {
        "tags": [
          "main"
        ],
        "description": "Check the SSL certificate status for the given domain names.",
        "operationId": "getSslStatus",
        "parameters": [
          {
            "in": "query",
            "name": "domains",
            "required": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "hostname"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A mapping of domain name to their SSL status",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": {
                    "enum": [
                      "error",
                      "missing",
                      "pending",
                      "ready",
                      "unknown"
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/apps/{appId}/group-invites/{token}/respond": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "token",
          "in": "path",
          "description": "The token of the invite.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "post": {
        "tags": [
          "group-invite"
        ],
        "description": "Respond to a given invitation.",
        "operationId": "respondGroupInvite",
        "requestBody": {
          "description": "The response of the invitation.\n\n        If response is true, user will join the app. If response is false, the user declines the invite and the invite is removed.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "response"
                ],
                "properties": {
                  "response": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The response has been processed."
          }
        },
        "security": [
          {
            "app": []
          }
        ]
      }
    },
    "/api/apps/{appId}/group-invites/{token}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "token",
          "in": "path",
          "description": "The token of the invite.",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "group-invite"
        ],
        "description": "Fetch information about an invite.",
        "operationId": "getGroupInvite",
        "responses": {
          "200": {
            "description": "An invite response",
            "$ref": "#/components/responses/invite"
          }
        }
      }
    },
    "/api/apps/{appId}/group-members/{groupMemberId}/role": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/groupMemberId"
        }
      ],
      "put": {
        "tags": [
          "common",
          "group-member"
        ],
        "description": "Set the role of a member within a group.",
        "operationId": "updateGroupMemberRole",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "description": "The role to set.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "role"
                ],
                "properties": {
                  "role": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The member’s role has been successfully updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GroupMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": []
          },
          {
            "cli": [
              "groups:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/group-members/{groupMemberId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/groupMemberId"
        }
      ],
      "get": {
        "tags": [
          "common",
          "group-member"
        ],
        "description": "Get a certain group member from a group",
        "operationId": "getGroupMember",
        "responses": {
          "200": {
            "description": "The specified group member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GroupMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": []
          }
        ]
      },
      "delete": {
        "tags": [
          "common",
          "group-member"
        ],
        "description": "Remove a member from a group.",
        "operationId": "deleteGroupMember",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "responses": {
          "204": {
            "description": "The group member has been removed successfully."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": []
          },
          {
            "cli": [
              "groups:write"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/groups/{groupId}/invites/resend": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "$ref": "#/components/parameters/groupId"
        }
      ],
      "post": {
        "tags": [
          "group"
        ],
        "description": "Request to resend an invitation.",
        "operationId": "resendGroupInvite",
        "requestBody": {
          "description": "The email of the person to resend the invitation to.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The invite has been sent."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/groups/{groupId}/invites": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "groupId",
          "in": "path",
          "description": "The ID of the group",
          "required": true,
          "schema": {
            "type": "number",
            "readOnly": true
          }
        }
      ],
      "get": {
        "tags": [
          "group",
          "invite"
        ],
        "description": "Get a list of invited group members.",
        "operationId": "getGroupInvites",
        "responses": {
          "200": {
            "description": "The list of all invites.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "email": {
                        "type": "string",
                        "format": "email"
                      },
                      "role": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "post": {
        "tags": [
          "group",
          "invite"
        ],
        "description": "Invite a new user to a group.",
        "operationId": "createGroupInvites",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "requestBody": {
          "description": "The group invite to create.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "required": [
                    "email",
                    "role"
                  ],
                  "properties": {
                    "email": {
                      "type": "string",
                      "format": "email",
                      "description": "The email address of the user to invite."
                    },
                    "role": {
                      "type": "string",
                      "description": "The role to invite the user as."
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The invited member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppMember"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "groups:write"
            ]
          },
          {
            "cli": [
              "groups:write"
            ]
          }
        ]
      },
      "delete": {
        "tags": [
          "group",
          "invite"
        ],
        "description": "Revoke a group member invitation.",
        "operationId": "deleteGroupInvite",
        "requestBody": {
          "description": "The email address to revoke the invite of.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The invitation has been successfully revoked."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/apps/{appId}/groups/{groupId}/members": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "groupId",
          "in": "path",
          "description": "The ID of the group",
          "required": true,
          "schema": {
            "type": "number",
            "readOnly": true
          }
        }
      ],
      "get": {
        "tags": [
          "common",
          "app",
          "group",
          "members"
        ],
        "description": "Fetch the members of a group and their roles within the group.",
        "operationId": "getGroupMembers",
        "parameters": [
          {
            "$ref": "#/components/parameters/selectedGroupId"
          }
        ],
        "responses": {
          "200": {
            "description": "The list of all members.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/GroupMember"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "app": [
              "groups:read"
            ]
          }
        ]
      },
      "post": {
        "tags": [
          "app",
          "group",
          "members"
        ],
        "description": "Add an app member to a group",
        "operationId": "addAppMemberToGroup",
        "responses": {
          "200": {
            "description": "The created group member",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GroupMember"
                }
              }
            }
          }
        },
        "requestBody": {
          "description": "Add an app member to a group",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "id",
                  "role"
                ],
                "properties": {
                  "id": {
                    "$ref": "#/components/schemas/AppMember/properties/id",
                    "description": "The id of the user to add."
                  },
                  "role": {
                    "type": "string",
                    "description": "The role to invite the user as."
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "app": [
              "groups:read"
            ]
          }
        ]
      }
    },
    "/api/apps/{appId}/groups/{groupId}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        },
        {
          "name": "groupId",
          "in": "path",
          "description": "The ID of the group",
          "required": true,
          "schema": {
            "type": "number",
            "readOnly": true
          }
        }
      ],
      "get": {
        "tags": [
          "common",
          "group"
        ],
        "description": "Fetch an existing group.",
        "operationId": "getGroup",
        "responses": {
          "200": {
            "description": "The requested group",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "number"
                    },
                    "name": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "patch": {
        "tags": [
          "common",
          "group"
        ],
        "description": "Update an existing group.",
        "operationId": "patchGroup",
        "requestBody": {
          "description": "The group to update.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "annotations": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated group",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "number"
                    },
                    "name": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "groups:write"
            ]
          }
        ]
      },
      "delete": {
        "tags": [
          "common",
          "group"
        ],
        "description": "Delete an existing group.",
        "operationId": "deleteGroup",
        "responses": {
          "204": {
            "description": "The group has successfully been deleted."
          }
        },
        "security": [
          {
            "studio": []
          },
          {
            "cli": [
              "groups:write"
            ]
          }
        ]
      }
    },
    "/api/timezones": {
      "get": {
        "tags": [
          "main"
        ],
        "description": "Get a list of timezones supported by the API",
        "operationId": "getTimezones",
        "responses": {
          "200": {
            "description": "A list of timezones supported by the API",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/trainings/completed": {
      "get": {
        "description": "Fetch all completed trainings",
        "operationId": "getCompletedTrainings",
        "responses": {
          "200": {
            "description": "An array of training IDs that the user has completed",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "delete": {
        "description": "Delete all completed trainings from user",
        "operationId": "resetTrainingProgress",
        "responses": {
          "204": {
            "description": "Trainings successfully reset "
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/trainings/completed/{trainingId}": {
      "post": {
        "description": "Sets the status of this training to \"completed\" for this user",
        "operationId": "completeTraining",
        "parameters": [
          {
            "in": "path",
            "name": "trainingId",
            "schema": {
              "type": "string"
            },
            "required": true,
            "description": "The ID of the training to complete"
          }
        ],
        "responses": {
          "201": {
            "description": "Training successfully set to \"completed\""
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/trainings": {
      "get": {
        "description": "Fetch all training ids stored on the server",
        "operationId": "getTrainingIds",
        "responses": {
          "200": {
            "description": "An array of all training Id's",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/users/current/apps/accounts": {
      "get": {
        "description": "Get the accounts that have been linked to an app and the user",
        "tags": [
          "main",
          "user",
          "current-user",
          "app",
          "account"
        ],
        "operationId": "getCurrentUserAppAccounts",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "A list of linked accounts",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AppAccount"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/users/current/apps/{appId}/account": {
      "parameters": [
        {
          "$ref": "#/components/parameters/appId"
        }
      ],
      "get": {
        "description": "Get the account that have been linked to the app and the user",
        "tags": [
          "main",
          "user",
          "current-user",
          "app",
          "account"
        ],
        "operationId": "getCurrentUserAppAccount",
        "security": [
          {
            "studio": []
          }
        ],
        "responses": {
          "200": {
            "description": "A linked account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppAccount"
                }
              }
            }
          }
        }
      },
      "patch": {
        "description": "Get the account that have been linked to the app and the user",
        "tags": [
          "main",
          "user",
          "current-user",
          "app",
          "account"
        ],
        "operationId": "patchCurrentUserAppAccount",
        "security": [
          {
            "studio": []
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "picture": {
                    "type": "string",
                    "format": "binary",
                    "description": "The member’s profile picture."
                  }
                }
              },
              "encoding": {
                "picture": {
                  "contentType": "image/png,image/jpeg,image/tiff,image/webp"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A linked account",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AppAccount"
                }
              }
            }
          }
        }
      }
    },
    "/api/users/current/apps": {
      "get": {
        "tags": [
          "main",
          "user",
          "current-user",
          "app"
        ],
        "parameters": [
          {
            "name": "language",
            "schema": {
              "type": "string"
            },
            "description": "The language to include the translations of, if available",
            "in": "query"
          }
        ],
        "description": "Get all apps from organizations that the user is in.",
        "operationId": "queryCurrentUserApps",
        "responses": {
          "200": {
            "description": "The list of all apps the user is in.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/App"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/auth/oauth2/apps/{appId}/consent/agree": {
      "post": {
        "parameters": [
          {
            "$ref": "#/components/parameters/appId"
          }
        ],
        "description": "Create a new OAuth2 consent.",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2"
        ],
        "operationId": "agreeCurrentUserOAuth2AppConsent",
        "requestBody": {
          "$ref": "#/components/requestBodies/oauth2Consent"
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/oauth2AuthorizationCode"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/auth/oauth2/apps/{appId}/consent/verify": {
      "post": {
        "parameters": [
          {
            "$ref": "#/components/parameters/appId"
          }
        ],
        "description": "Verify if the user has previously agreed to the requested OAuth2 consent.",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2"
        ],
        "operationId": "verifyCurrentUserOAuth2AppConsent",
        "requestBody": {
          "$ref": "#/components/requestBodies/oauth2Consent"
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/oauth2AuthorizationCode"
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/auth/oauth2/authorizations": {
      "get": {
        "description": "Get a list of the current user’s OAuth2 authorizations.",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2",
          "authorization"
        ],
        "operationId": "getCurrentUserOAuth2Authorizations",
        "responses": {
          "200": {
            "description": "An access token response.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "authorizationUrl": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "delete": {
        "description": "Unlink a linked account from the logged in user.",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2",
          "authorization"
        ],
        "operationId": "deleteCurrentUserOAuth2Authorization",
        "parameters": [
          {
            "in": "query",
            "name": "authorizationUrl",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "201": {
            "description": "The account was unlinked successfully."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/auth/oauth2/client-credentials/{clientId}": {
      "parameters": [
        {
          "name": "clientId",
          "in": "path",
          "description": "The client id of the OAuth2 client credentials on which to perform an operation",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "delete": {
        "description": "Revoke the client credentials",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2",
          "client-credentials"
        ],
        "operationId": "deleteCurrentUserOAuth2ClientCredentials",
        "responses": {
          "204": {
            "description": "The client credentials have been revoked successfully."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/auth/oauth2/client-credentials": {
      "post": {
        "description": "Register new OAuth2 client credentials for the authenticated user.",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2",
          "client-credentials"
        ],
        "operationId": "registerCurrentUserOAuth2ClientCredentials",
        "requestBody": {
          "description": "The OAuth2 client credentials",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OAuth2ClientCredentials"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The newly created client credentials",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OAuth2ClientCredentials"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "get": {
        "description": "Get a list of client credentials for the authenticated user",
        "tags": [
          "main",
          "user",
          "current-user",
          "auth",
          "oauth2",
          "client-credentials"
        ],
        "operationId": "listCurrentUserOAuth2ClientCredentials",
        "responses": {
          "200": {
            "description": "A list of client credentials entities.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/OAuth2ClientCredentials"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/emails": {
      "get": {
        "tags": [
          "main",
          "user",
          "current-user",
          "email"
        ],
        "description": "List email addresses registered to logged in user's account.",
        "operationId": "listCurrentUserEmails",
        "responses": {
          "200": {
            "description": "The email address has been added successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/UserEmail"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "post": {
        "tags": [
          "main",
          "user",
          "current-user",
          "email"
        ],
        "description": "Register a new email to logged in user's account.",
        "operationId": "addCurrentUserEmail",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserEmail"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "The email address has been added successfully.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserEmail"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "delete": {
        "tags": [
          "main",
          "user",
          "current-user",
          "email"
        ],
        "description": "Remove an existing email to logged in user's account.",
        "operationId": "removeCurrentUserEmail",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserEmail"
              }
            }
          }
        },
        "responses": {
          "204": {
            "description": "The email address has been removed successfully."
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/organizations": {
      "get": {
        "tags": [
          "main",
          "user",
          "current-user",
          "organization"
        ],
        "description": "Fetch the logged in user's organizations.",
        "operationId": "getCurrentUserOrganizations",
        "responses": {
          "200": {
            "description": "The organizations the logged in user is a member of.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "$ref": "#/components/schemas/Organization/properties/id"
                      },
                      "name": {
                        "$ref": "#/components/schemas/Organization/properties/name"
                      },
                      "role": {
                        "$ref": "#/components/schemas/OrganizationMember/properties/role"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/current/unsubscribe": {
      "post": {
        "tags": [
          "main",
          "user",
          "current-user"
        ],
        "description": "Unsubscribe a user from the newsletter",
        "operationId": "unsubscribeCurrentUser",
        "responses": {
          "201": {
            "description": "Unsubscribed successfully"
          },
          "401": {
            "description": "Invalid or missing admin API secret"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "email"
                ],
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/users/current": {
      "get": {
        "tags": [
          "main",
          "user",
          "current-user"
        ],
        "description": "Fetch the logged in user's profile.",
        "operationId": "getCurrentUser",
        "responses": {
          "200": {
            "description": "The user's profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      },
      "put": {
        "tags": [
          "main",
          "user",
          "current-user"
        ],
        "description": "Update the logged in user's profile.",
        "operationId": "patchCurrentUser",
        "requestBody": {
          "required": true,
          "$ref": "#/components/requestBodies/user"
        },
        "responses": {
          "200": {
            "description": "The user's profile.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/User"
                }
              }
            }
          }
        },
        "security": [
          {
            "studio": []
          }
        ]
      }
    },
    "/api/users/subscribed": {
      "get": {
        "tags": [
          "main",
          "user"
        ],
        "description": "Get a list of active and verified users subscribed to the appsemble newsletter",
        "operationId": "getSubscribedUsers",
        "responses": {
          "200": {
            "description": "List of subscribed users"
          },
          "401": {
            "description": "Invalid or missing admin API secret"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "account",
      "description": "Operations related to app accounts"
    },
    {
      "name": "app-member",
      "description": "Operations related to app members"
    },
    {
      "name": "app",
      "description": "Operations related to apps"
    },
    {
      "name": "action",
      "description": "Operations related to actions"
    },
    {
      "name": "app-collection",
      "description": "Operations related to app collections"
    },
    {
      "name": "app-definition",
      "description": "Operations related to the app definitions"
    },
    {
      "name": "asset",
      "description": "Operations related to assets"
    },
    {
      "name": "auth",
      "description": "Operations related to authentication"
    },
    {
      "name": "authorization",
      "description": "Operations related to authorizations"
    },
    {
      "name": "block",
      "description": "Operations related to blocks"
    },
    {
      "name": "client-credentials",
      "description": "Operations related to client credentials"
    },
    {
      "name": "common",
      "description": "Operations shared between apps and the studio"
    },
    {
      "name": "current-member",
      "description": "Operations related to the currently logged in user"
    },
    {
      "name": "current-user",
      "description": "Operations related to the currently logged in user"
    },
    {
      "name": "demo-group",
      "description": "Operations related to demo groups"
    },
    {
      "name": "demo-member",
      "description": "Operations related to demo members"
    },
    {
      "name": "email",
      "description": "Operations related to emails"
    },
    {
      "name": "invite",
      "description": "Operations related to invites."
    },
    {
      "name": "main",
      "description": "Operations related to the main api"
    },
    {
      "name": "member",
      "description": "Operations related to members"
    },
    {
      "name": "oauth2",
      "description": "Operations related to oauth2"
    },
    {
      "name": "organization",
      "description": "Operations related to organizations"
    },
    {
      "name": "organization-subscription",
      "description": "Operations related to organizationSubscriptions"
    },
    {
      "name": "rating",
      "description": "Operations related to ratings"
    },
    {
      "name": "readme",
      "description": "Operations related to readmes"
    },
    {
      "name": "resource",
      "description": "Operations related to the resources"
    },
    {
      "name": "saml",
      "description": "Operations related to saml"
    },
    {
      "name": "scim",
      "description": "Operations related to scim"
    },
    {
      "name": "screenshot",
      "description": "Operations related to screenshots"
    },
    {
      "name": "secret",
      "description": "Operations related to secrets"
    },
    {
      "name": "service",
      "description": "Operations related to service secrets"
    },
    {
      "name": "snapshot",
      "description": "Operations related to snapshots"
    },
    {
      "name": "ssl",
      "description": "Operations related to ssl"
    },
    {
      "name": "subscription",
      "description": "Operations related to subscriptions"
    },
    {
      "name": "group-member",
      "description": "Operations related to group members"
    },
    {
      "name": "group",
      "description": "Operations related to groups"
    },
    {
      "name": "template",
      "description": "Operations related to templates"
    },
    {
      "name": "training",
      "description": "Operations related to trainings"
    },
    {
      "name": "translation",
      "description": "Operations related to translations"
    },
    {
      "name": "user",
      "description": "Operations related to users."
    },
    {
      "name": "variable",
      "description": "Operations related to app variables."
    },
    {
      "name": "version",
      "description": "Operations related to versions."
    },
    {
      "name": "webhook",
      "description": "Operations related to webhooks."
    }
  ]
}
