[System]
You are a helpful assistant that answers strictly in JSON. Here's the JSON schema you must adhere to:
<schema>
{"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":"^([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-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"}},"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"}},"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"}}},"requestBodies":{"oauth2Consent":{"description":"The OAuth2 client credentials","required":true,"content":{"application/json":{"schema":{"type":"object","required":["redirectUri","scope"],"description":"A representation of a user\u2019s 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":{"ActionDefinition":{"allOf":[{"type":"object","description":"The base properties of an action definition.","additionalProperties":true,"properties":{"remapBefore":{"$ref":"#/components/schemas/RemapperDefinition","description":"This may be used to remap data before it is passed into the action function."},"remapAfter":{"$ref":"#/components/schemas/RemapperDefinition","description":"This may be used to remap data after it is passed into the action function."},"onSuccess":{"$ref":"#/components/schemas/ActionDefinition","description":"Another action that is dispatched when the action has been dispatched successfully."},"onError":{"$ref":"#/components/schemas/ActionDefinition","description":"Another action that is dispatched when the action has failed to dispatch successfully."}}},{"anyOf":[{"$ref":"#/components/schemas/AnalyticsActionDefinition"},{"$ref":"#/components/schemas/ControllerActionDefinition"},{"$ref":"#/components/schemas/ConditionActionDefinition"},{"$ref":"#/components/schemas/CsvParseActionDefinition"},{"$ref":"#/components/schemas/DialogActionDefinition"},{"$ref":"#/components/schemas/DialogErrorActionDefinition"},{"$ref":"#/components/schemas/DialogOkActionDefinition"},{"$ref":"#/components/schemas/DownloadActionDefinition"},{"$ref":"#/components/schemas/EachActionDefinition"},{"$ref":"#/components/schemas/EmailActionDefinition"},{"$ref":"#/components/schemas/EventActionDefinition"},{"$ref":"#/components/schemas/FlowBackActionDefinition"},{"$ref":"#/components/schemas/FlowFinishActionDefinition"},{"$ref":"#/components/schemas/FlowNextActionDefinition"},{"$ref":"#/components/schemas/FlowCancelActionDefinition"},{"$ref":"#/components/schemas/FlowToActionDefinition"},{"$ref":"#/components/schemas/LinkActionDefinition"},{"$ref":"#/components/schemas/LinkBackActionDefinition"},{"$ref":"#/components/schemas/LinkNextActionDefinition"},{"$ref":"#/components/schemas/LogActionDefinition"},{"$ref":"#/components/schemas/MatchActionDefinition"},{"$ref":"#/components/schemas/MessageActionDefinition"},{"$ref":"#/components/schemas/NoopActionDefinition"},{"$ref":"#/components/schemas/NotifyActionDefinition"},{"$ref":"#/components/schemas/RequestActionDefinition"},{"$ref":"#/components/schemas/ResourceCountActionDefinition"},{"$ref":"#/components/schemas/ResourceCreateActionDefinition"},{"$ref":"#/components/schemas/ResourceDeleteActionDefinition"},{"$ref":"#/components/schemas/ResourceDeleteAllActionDefinition"},{"$ref":"#/components/schemas/ResourceDeleteBulkActionDefinition"},{"$ref":"#/components/schemas/ResourceGetActionDefinition"},{"$ref":"#/components/schemas/ResourceHistoryGetActionDefinition"},{"$ref":"#/components/schemas/ResourceQueryActionDefinition"},{"$ref":"#/components/schemas/ResourceSubscriptionStatusActionDefinition"},{"$ref":"#/components/schemas/ResourceSubscriptionSubscribeActionDefinition"},{"$ref":"#/components/schemas/ResourceSubscriptionToggleActionDefinition"},{"$ref":"#/components/schemas/ResourceSubscriptionUnsubscribeActionDefinition"},{"$ref":"#/components/schemas/ResourceUpdateActionDefinition"},{"$ref":"#/components/schemas/ResourceUpdatePositionsActionDefinition"},{"$ref":"#/components/schemas/ResourcePatchActionDefinition"},{"$ref":"#/components/schemas/ShareActionDefinition"},{"$ref":"#/components/schemas/StaticActionDefinition"},{"$ref":"#/components/schemas/StorageAppendActionDefinition"},{"$ref":"#/components/schemas/StorageSubtractActionDefinition"},{"$ref":"#/components/schemas/StorageReadActionDefinition"},{"$ref":"#/components/schemas/StorageWriteActionDefinition"},{"$ref":"#/components/schemas/StorageUpdateActionDefinition"},{"$ref":"#/components/schemas/StorageDeleteActionDefinition"},{"$ref":"#/components/schemas/GroupMemberInviteActionDefinition"},{"$ref":"#/components/schemas/GroupMemberQueryActionDefinition"},{"$ref":"#/components/schemas/GroupMemberDeleteActionDefinition"},{"$ref":"#/components/schemas/GroupMemberRoleUpdateActionDefinition"},{"$ref":"#/components/schemas/GroupQueryActionDefinition"},{"$ref":"#/components/schemas/ThrowActionDefinition"},{"$ref":"#/components/schemas/AppMemberLoginActionDefinition"},{"$ref":"#/components/schemas/AppMemberLogoutActionDefinition"},{"$ref":"#/components/schemas/AppMemberRegisterActionDefinition"},{"$ref":"#/components/schemas/AppMemberInviteActionDefinition"},{"$ref":"#/components/schemas/AppMemberRoleUpdateActionDefinition"},{"$ref":"#/components/schemas/AppMemberCurrentPatchActionDefinition"},{"$ref":"#/components/schemas/AppMemberPropertiesPatchActionDefinition"},{"$ref":"#/components/schemas/AppMemberQueryActionDefinition"},{"$ref":"#/components/schemas/AppMemberDeleteActionDefinition"}]}]},"AnalyticsActionDefinition":{"type":"object","additionalProperties":false,"required":["type","target"],"properties":{"type":{"enum":["analytics"],"description":"This action sends a Google Analytics event.\n\nIt returns the input data.\n"},"target":{"type":"string","description":"The name of the analytics target event to send."},"config":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper whose result will be sent to Google Analytics as additional context"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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":"^([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-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\u2019t 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\u2019t 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"},"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":{"$ref":"#/components/schemas/AppDefinition"},"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-\\d{4,10}-\\d{1,4}|G-[\\dA-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"}}},"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\u2019s 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\u2019s profile image can be found."}}},"headerImage":{"type":"string","description":"The URL at which the app collection\u2019s 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\u2019s expert/curator.","minLength":1,"maxLength":30},"expertDescription":{"type":"string","description":"The description of the app collection\u2019s expert/curator.","maxLength":4000},"expertProfileImage":{"type":"string","format":"binary","description":"The profile image of the app collection\u2019s 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}]}}},"AppDefinition":{"type":"object","required":["name","defaultPage","pages"],"additionalProperties":false,"description":"An app definition describes what an Appsemble app looks like.","properties":{"name":{"type":"string","minLength":1,"maxLength":30,"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","maxLength":80,"description":"A short description describing the app.\n\nThis will be displayed on the app store.\n"},"layout":{"$ref":"#/components/schemas/AppLayoutDefinition","description":"Properties related to the layout of the app."},"notifications":{"enum":["login","opt-in","startup"],"description":"The strategy to use for apps to subscribe to push notifications.\n\nIf specified, push notifications can be sent to subscribed users via the _Notifications_ tab in the\napp details page in Appsemble Studio. Setting this to `opt-in` allows for users to opt into\nreceiving push notifications by pressing the subscribe button in the App settings page. Setting this\nto `startup` will cause Appsemble to immediately request for the permission upon opening the app.\nIf this is set to `login`, the app will request permissions for push notification once the user\nlogs in.\n\n> **Note**: Setting `notifications` to `startup` is not recommended, due to its invasive nature.\n"},"defaultPage":{"type":"string","description":"The name of the page that should be displayed when the app is initially loaded.\n\nThis **must** match the name of a page defined for the app.\n"},"defaultLanguage":{"type":"string","default":"en","minLength":2,"description":"The default language for the app."},"controller":{"$ref":"#/components/schemas/ControllerDefinition"},"members":{"$ref":"#/components/schemas/AppMembersDefinition"},"resources":{"type":"object","description":"Resources define how Appsemble can store data for an app.\n\nThe most basic resource has a `schema` property and defines the minimal security rules.\n","additionalProperties":{"description":"A single resource definition.","$ref":"#/components/schemas/ResourceDefinition"}},"security":{"$ref":"#/components/schemas/SecurityDefinition","description":"Role and guest definitions that may be used by the app."},"pages":{"type":"array","minItems":1,"description":"The pages of the app.","items":{"anyOf":[{"$ref":"#/components/schemas/PageDefinition"},{"$ref":"#/components/schemas/TabsPageDefinition"},{"$ref":"#/components/schemas/FlowPageDefinition"},{"$ref":"#/components/schemas/LoopPageDefinition"},{"$ref":"#/components/schemas/ContainerPageDefinition"}]}},"theme":{"$ref":"#/components/schemas/Theme"},"cron":{"type":"object","minProperties":1,"description":"A list of cron jobs that are associated with this app.","additionalProperties":{"$ref":"#/components/schemas/CronDefinition"}},"webhooks":{"type":"object","minProperties":1,"description":"A list of callable webhooks that are associated with this app.","additionalProperties":{"$ref":"#/components/schemas/WebhookDefinition"}},"anchors":{"type":"array","minItems":1,"description":"Helper property that can be used to store YAML anchors.","items":{}},"containers":{"type":"array","minItems":1,"additionalProperties":false,"description":"Definition of the companion containers to be created.","items":{"$ref":"#/components/schemas/ContainerDefinition"}},"registry":{"type":"string","default":null,"description":"The default registry used to pull images for companion containers."}}},"AppLayoutDefinition":{"type":"object","description":"The layout definition allows you to tweak several layout elements of the app.","additionalProperties":false,"minProperties":1,"properties":{"login":{"enum":["navbar","navigation","hidden"],"default":"navbar","description":"The location of the login button."},"settings":{"enum":["navbar","navigation","hidden"],"default":"navbar","description":"The location of the settings button.\n\nIf set to `navigation`, it will only be visible if `login` is also visible in `navigation`.\n"},"feedback":{"enum":["navbar","navigation","hidden"],"default":"navigation","description":"The location of the feedback button.\n\nIf set to `navigation`, it will only be visible if `login` is also visible in `navigation`.\n"},"install":{"enum":["navbar","navigation","hidden"],"default":"navigation","description":"The location of the install button.\n\nIf set to `navigation`, it will only be visible if `login` is also visible in `navigation`.\n"},"navigation":{"enum":["bottom","left-menu","hidden"],"default":"left-menu","description":"The navigation type to use.\n\nIf this is omitted, a collapsable side navigation menu will be rendered on the left.\n"}}},"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."}}},"AppMemberCurrentPatchActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["app.member.current.patch"],"description":"Allows the app member to patch their own app member account.\n\nDoes nothing if the app member isn\u2019t logged in."},"name":{"$ref":"#/components/schemas/RemapperDefinition","description":"The new full name of the app member."},"properties":{"$ref":"#/components/schemas/RemapperDefinition","description":"The updated custom properties for the app member.\n\nValues will be validated based on `members.properties`, if defined in the app definition."},"picture":{"$ref":"#/components/schemas/RemapperDefinition","description":"The picture for the patched app member"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberDeleteActionDefinition":{"type":"object","additionalProperties":false,"required":["type","sub"],"properties":{"type":{"enum":["app.member.delete"],"description":"Allows the app member to delete another app member.\n\nDoes nothing if the app member isn\u2019t logged in."},"sub":{"$ref":"#/components/schemas/RemapperDefinition","description":"The id of the app member to be deleted."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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/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}}},"AppMemberInviteActionDefinition":{"type":"object","additionalProperties":false,"required":["type","email","role"],"properties":{"type":{"enum":["app.member.invite"],"description":"Allows the app member to invite another app member using an email address and a role.\n\nDoes nothing if the app member is not logged in."},"email":{"$ref":"#/components/schemas/RemapperDefinition","description":"The email to invite."},"role":{"$ref":"#/components/schemas/RemapperDefinition","description":"The role of the invited app member."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberLoginActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["app.member.login"],"description":"Allows the app member to login using an email address and a password.\n\nDoes nothing if the app member is already logged in."},"password":{"$ref":"#/components/schemas/RemapperDefinition","description":"The password to log in with."},"email":{"$ref":"#/components/schemas/RemapperDefinition","description":"The email to log in with."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberLogoutActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["app.member.logout"],"description":"Allow the app members to log out of the application."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberPropertiesPatchActionDefinition":{"type":"object","additionalProperties":false,"required":["type","sub"],"properties":{"type":{"enum":["app.member.properties.patch"],"description":"Allows the app member to patch the properties of another app member account.\n\nDoes nothing if the app member isn\u2019t logged in."},"sub":{"$ref":"#/components/schemas/RemapperDefinition","description":"The new full name name of the app member."},"properties":{"$ref":"#/components/schemas/RemapperDefinition","description":"The updated custom properties for the app member.\n\nValues will be validated based on `members.properties`, if defined in the app definition."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberPropertyDefinition":{"anyOf":[{"type":"object","description":"Definition for an app member custom property.","required":["schema"],"additionalProperties":false,"properties":{"schema":{"anyOf":[{"$ref":"#/components/schemas/JSONSchemaInteger"},{"$ref":"#/components/schemas/JSONSchemaArray"}]},"reference":{"type":"object","additionalProperties":false,"description":"The object for the reference to another resource","properties":{"resource":{"type":"string","description":"The resource referenced by this app member property."}}}}},{"type":"object","description":"Definition for an app member property.","required":["schema"],"additionalProperties":false,"properties":{"schema":{"anyOf":[{"$ref":"#/components/schemas/JSONSchemaInteger"},{"$ref":"#/components/schemas/JSONSchemaArray"},{"$ref":"#/components/schemas/JSONSchemaString"},{"$ref":"#/components/schemas/JSONSchemaNumber"},{"$ref":"#/components/schemas/JSONSchemaEnum"},{"$ref":"#/components/schemas/JSONSchemaBoolean"},{"$ref":"#/components/schemas/JSONSchemaObject"}]}}}]},"AppMemberQueryActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["app.member.query"],"description":"Allows the currently logged in app member to fetch a list of app members by their roles.\n\nDoes nothing if the app member isn\u2019t logged in."},"roles":{"$ref":"#/components/schemas/RemapperDefinition","description":"The roles of the app members that would be fetched."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"Additional filters to fetch members based on properties and other fields"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberRegisterActionDefinition":{"type":"object","additionalProperties":false,"required":["type","email","password"],"properties":{"type":{"enum":["app.member.register"],"description":"Allows the app member to register using an email address and a password.\n\nDoes nothing if the app member is already logged in."},"password":{"$ref":"#/components/schemas/RemapperDefinition","description":"The password to log in with."},"email":{"$ref":"#/components/schemas/RemapperDefinition","description":"The email to log in with."},"name":{"$ref":"#/components/schemas/RemapperDefinition","description":"The full name of the app member."},"picture":{"$ref":"#/components/schemas/RemapperDefinition","description":"The image to use for the profile picture of the app member."},"properties":{"$ref":"#/components/schemas/RemapperDefinition","description":"The custom properties for the app member.\n\nValues will be validated based on `members.properties`, if defined in the app definition."},"login":{"type":"boolean","description":"Whether to login after registering.","default":true},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMemberRoleUpdateActionDefinition":{"type":"object","additionalProperties":false,"required":["type","sub"],"properties":{"type":{"enum":["app.member.role.update"],"description":"Allows the app member to update the role of another app member account.\n\nDoes nothing if the app member isn\u2019t logged in."},"sub":{"$ref":"#/components/schemas/RemapperDefinition","description":"The id of the app member."},"role":{"$ref":"#/components/schemas/RemapperDefinition","description":"The updated role of the app member.\n\nThe role must exist in the roles property of the app's security definition or in the predefined app roles in the system -\n`Member`, `MembersManager`, `GroupMembersManager`, `GroupsManager`, `ResourcesManager` and `Owner`"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"AppMembersDefinition":{"type":"object","description":"Definition for app member properties.","required":[],"additionalProperties":false,"properties":{"properties":{"type":"object","description":"The properties object configuring app members","additionalProperties":{"description":"A single app member property definition.","$ref":"#/components/schemas/AppMemberPropertyDefinition"}}}},"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":"^@([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-z])?)/([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-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"}}}},"ArrayRemapperDefinition":{"type":"array","description":"If a remapper is an array, it represents a chain of remappers.\n\nEach item represents a remapper which is called with the result of the remapper before it.\n\nIf an array is nested, it will be flattened. This allows you to create reusable remappers and\nreference them using YAML anchors.\n","minItems":1,"items":{"anyOf":[{"$ref":"#/components/schemas/ObjectRemapperDefinition"},{"$ref":"#/components/schemas/ArrayRemapperDefinition"}]}},"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":"^([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-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":"^([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-z])?)$","description":"The given name of the asset. Assets may be referenced by their name or ID in the API."}}},"BlockDefinition":{"type":"object","description":"A block that is displayed on a page.","required":["type","version"],"additionalProperties":false,"properties":{"theme":{"$ref":"#/components/schemas/Theme"},"type":{"type":"string","pattern":"^(@([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-z])?)/)?([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-z])?)$","description":"The type of the block.\n\nA block type follows the format `@organization/name`. If the organization is _appsemble_, it may\nbe omitted.\n\nSome examples:\n\n- `form`\n- `@amsterdam/splash`\n"},"version":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+(-[\\d.a-z-]+)?$","description":"The version of the block to use.\n\nSince blocks may change over time, a version must be specified in order to ensure that the block\nwill remain the same until it is manually updated.\n"},"layout":{"description":"An override of the block\u2019s default layout.\n\n`float` sets the block position to float on the page and does not collide with other blocks.\nLayout float can be combined with the `position` property to place the block on the desired location.\n`grow` adds space between blocks so the page is filled.\n`static` on the contrary, does not add extra space between blocks.\n","enum":["float","grow","static"]},"hide":{"$ref":"#/components/schemas/RemapperDefinition","description":"Whether to render the block or not"},"header":{"$ref":"#/components/schemas/RemapperDefinition","description":"An optional header to render above the block."},"roles":{"type":"array","description":"The list of roles that are allowed to view this block.\n\nIf a user does not have the right role, the block is not rendered.\n","items":{"type":"string"}},"position":{"description":"For floating blocks this property defines where the block should float.","default":"bottom right","enum":["top left","top","top right","left","right","bottom left","bottom","bottom right"]},"parameters":{"type":"object","description":"A free form mapping of named parameters.\n\nThe exact meaning of the parameters depends on the block type.\n","additionalProperties":true},"actions":{"type":"object","description":"A mapping of actions that can be fired by the block to action handlers.","additionalProperties":{"$ref":"#/components/schemas/ActionDefinition"}},"events":{"$ref":"#/components/schemas/EventsDefinition"}}},"BlockVersion":{"type":"object","description":"A version of a block definition\n\nBlock versions can\u2019t 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":"^@([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-z])?)/([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-z])?)$"},"description":{"type":"string","description":"The description of the block.","maxLength":160},"longDescription":{"type":"string","description":"The long description 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\u2019t part of the block\u2019s 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\u2019s 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":{"$ref":"#/components/schemas/JSONSchemaRoot","description":"A draft 7 JSON schema to use for block parameter validation.\n\nIf the parameters of a block definition don\u2019t 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"}}}},"ConditionActionDefinition":{"type":"object","additionalProperties":false,"required":["type","if"],"properties":{"type":{"enum":["condition"],"description":"Run another action if a certain contition is met."},"if":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper to determine the condition to check.\n\nIf this yields a truthy value, the `then` action is called. Otherwise the `else` action is\ncalled.\n"},"then":{"description":"This action is called if the `if` remapper yields a truthy value.","$ref":"#/components/schemas/ActionDefinition"},"else":{"description":"This action is called if the `if` remapper yields a falsy value.","$ref":"#/components/schemas/ActionDefinition"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ContainerDefinition":{"type":"object","additionalProperties":false,"description":"An object describing a companion container","required":["name","image","port"],"properties":{"name":{"type":"string","description":"Alias used to reference the container"},"image":{"type":"string","description":"Name of the image used for the container"},"port":{"type":"number","description":"Port used by the image provided"},"resources":{"type":"object","additionalProperties":true,"description":"Maximum amount of resources the container can use. Deafult: 1 CPU and 512Mi memory"},"env":{"type":"array","description":"Environment variables that will be used within the container","items":{"type":"object","additionalProperties":false,"description":"Each item is an environment variable. `useValueFromSecret` property determines whether the value is taken literally or from and existing secret","required":["name","value"],"properties":{"name":{"type":"string","description":"Name of the environment variable"},"useValueFromSecret":{"type":"boolean","description":"If set to true, will retrieve the value from the Kubernetes secret, the value property will refer to the secret key. If false, will take the value literally"},"value":{"type":"string","description":"The value of the environment variable. If `useValueFromSecret` is true, this property will refer to the Kubernetes secret's key"}}}},"metadata":{"type":"object","additionalProperties":true,"description":"Metadata including labels and annotations to be added to the container"}}},"ContainerPageDefinition":{"type":"object","additionalProperties":false,"description":"Groups pages together under a collapsible parent page. Following is an example of\nhow this can be used:\n```yaml\npages:\n  - name: Page 1\n    type: container\n    pages:\n      - name: Contained page 1\n        blocks:\n          - type: action-button\n            version: 0.29.8\n            parameters:\n              icon: git-alt\n            actions:\n              onClick:\n                type: link\n                to: Contained page 2\n      - name: Contained page 2\n        blocks:\n          - type: action-button\n            version: 0.29.8\n            parameters:\n              icon: git-alt\n            actions:\n              onClick:\n                type: link\n                to: Contained page 1\n```\n","required":["type","pages","name"],"properties":{"type":{"enum":["container"]},"pages":{"type":"array","minItems":1,"description":"The pages of the app.","items":{"anyOf":[{"$ref":"#/components/schemas/PageDefinition"},{"$ref":"#/components/schemas/TabsPageDefinition"},{"$ref":"#/components/schemas/FlowPageDefinition"},{"$ref":"#/components/schemas/LoopPageDefinition"},{"$ref":"#/components/schemas/ContainerPageDefinition"}]}},"name":{"type":"string","maxLength":50,"description":"The name of an app.\n\nThis field is always required and must be unique within the app, meaning that it is not possible to\nhave two pages with the same name. The name of the page is displayed at the *app bar* of each page as well as in the side navigational menu.\n\n> **Note**: The URL used to navigate to pages is determined by this property.\n"},"hideName":{"type":"boolean","description":"Whether or not the page name should be displayed in the *app bar*."},"navTitle":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the page when displayed in the navigation menu.\n\n  Context property `name` can be used to access the name of the page.\n  "},"hideNavTitle":{"type":"boolean","description":"Whether or not the page should be displayed in navigational menus.\n\n  By default all pages without parameters are added to navigational menus. Set to `true` to hide the\n  page from menus.\n  ","default":false},"navigation":{"$ref":"#/components/schemas/AppLayoutDefinition/properties/navigation","description":"The type of navigation displayed on the page.\n\nThis overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or\nApp navigation are not set.\n\nSet to `bottom` to use a navigation pane at the bottom of the screen instead of the default side\nmenu. Set to `hidden` to display no navigational menus at all.\n"},"icon":{"type":"string","description":"An optional icon from the fontawesome icon set\n\nThis will be displayed in the navigation menu.\n"},"parameters":{"type":"array","description":"Page parameters can be used for linking to a page that should display a single resource.\n\nThis defined as a list of strings representing the properties to pass through. More often than not\npassing `id` through is sufficient, depending on the block.\n","items":{"type":"string","minLength":1,"maxLength":30}},"roles":{"type":"array","description":"The list of roles that are allowed to view this page.\n\nIf the user doesn\u2019t have any of the roles in the list the page will be unavailable to them. An empty\nlist can be used to specify that users need to log in but do not need a specific role.\n\nUsers trying to visit a page without having the correct roles will be redirected to the first page\nthat they are allowed to view. If there aren\u2019t any accessible pages, the user will be logged out and\ninstructed to contact the app owner to get permissions.\n","items":{"type":"string"}},"theme":{"$ref":"#/components/schemas/Theme"},"badgeCount":{"$ref":"#/components/schemas/RemapperDefinition","description":"A Remapper that resolves to a number to be visibile in the side-menu."}}},"ControllerActionDefinition":{"type":"object","additionalProperties":false,"required":["type","handler"],"properties":{"type":{"enum":["controller"],"description":"Use the controller to handle the action."},"handler":{"type":"string","description":"The name of the function in the controller that will handle the action"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ControllerDefinition":{"type":"object","description":"A controller for application logic.","required":[],"additionalProperties":false,"properties":{"actions":{"type":"object","description":"A mapping of actions that can be fired by the controller to action handlers.","additionalProperties":{"$ref":"#/components/schemas/ActionDefinition"}},"events":{"$ref":"#/components/schemas/EventsDefinition"}}},"CronDefinition":{"type":"object","required":["schedule"],"description":"A cron definition defines tasks that Appsemble will run periodically for the app.","additionalProperties":false,"properties":{"schedule":{"description":"A crontab string to define when the action should be run.\n\nSee [Crontab guru](https://crontab.guru) for details\n","type":"string"},"action":{"description":"The action to run when the cronjob is triggered.","$ref":"#/components/schemas/ActionDefinition"}}},"CsvParseActionDefinition":{"type":"object","additionalProperties":false,"required":["type","file"],"properties":{"type":{"description":"An action to parse the CSV files","enum":["csv.parse"]},"file":{"description":"The CSV file to be parsed","$ref":"#/components/schemas/RemapperDefinition"},"delimiter":{"description":"The delimiter to be used, defaults to comma(\",\")","$ref":"#/components/schemas/RemapperDefinition"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"CustomFontDefinition":{"type":"object","description":"A custom font definition.","additionalProperties":false,"required":["source","family"],"properties":{"source":{"description":"Use a custom font.","enum":["custom"]},"family":{"type":"string","description":"The font family to use in the app.\n\nMake sure the font is available using custom CSS.\n"}}},"DialogActionDefinition":{"type":"object","additionalProperties":false,"required":["type","blocks"],"properties":{"type":{"enum":["dialog"],"description":"This action opens a pop-up dialog that can be used to seamlessly transition to a new set of blocks temporarily.\n\nDialogs can be closed by calling the [`dialog.ok`](#DialogOkActionDefinition) or\n[`dialog.error`](#DialogErrorActionDefinition). Users can still manually close dialogs, which\nshould be supported by the app.\n\nBlocks with the layout type `float` (e.g. `action-button`) do not work in this action.\n"},"title":{"description":"An optional title to set in the dialog header.","$ref":"#/components/schemas/RemapperDefinition"},"closable":{"type":"boolean","default":true,"description":"Whether users are allowed to close the dialog by clicking outside of it or on the close button."},"fullscreen":{"type":"boolean","default":false,"description":"Whether the dialog should be displayed full screen as if it\u2019s a new page, or as a pop-up."},"blocks":{"type":"array","description":"A list of blocks to display in the dialog.","items":{"$ref":"#/components/schemas/BlockDefinition"}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"DialogErrorActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["dialog.error"],"description":"Close an open dialog.\n\nThe dialog action that opened the dialog will be rejected with the data passed to this action.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"DialogOkActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["dialog.ok"],"description":"Close an open dialog.\n\nThe dialog action that opened the dialog will be resolved with the data passed to this action.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"DownloadActionDefinition":{"type":"object","required":["type","filename"],"additionalProperties":false,"properties":{"type":{"enum":["download"],"description":"Download the data as a file."},"filename":{"type":"string","description":"The filename to save the file as. This must include a file extension.","pattern":"\\."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"EachActionDefinition":{"type":"object","additionalProperties":false,"required":["type","do"],"properties":{"type":{"enum":["each"],"description":"Run an action for each entry in an array.\n\nThe actions are run in parallel.\n\nIf the input is not an array, the action will be applied to the input instead."},"serial":{"description":"Runs the action in series instead of parallel","type":"boolean"},"do":{"description":"This action is called for each item in the input array.","$ref":"#/components/schemas/ActionDefinition"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"EmailActionDefinition":{"type":"object","additionalProperties":false,"required":["type","subject","body"],"properties":{"type":{"enum":["email"],"description":"The email action can be used to send emails via the Appsemble server.\n\nIf `to`, `cc`, and `bcc` all end up being empty, no emails will be sent but the action will still continue as normal.\n"},"to":{"$ref":"#/components/schemas/RemapperDefinition","description":"The address the email should be sent to. Can be either in the format of `test@example.com`, or `John Doe <test@example.com>`"},"from":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the sender of the email."},"cc":{"$ref":"#/components/schemas/RemapperDefinition","description":"The list of additional email addresses email should be sent to. Uses the same format as `to`. Every email address in the CC is visible to all recipients."},"bcc":{"$ref":"#/components/schemas/RemapperDefinition","description":"The list of additional email addresses email should be sent to. Uses the same format as `to`. Email addresses in the BCC are hidden from other recipients."},"subject":{"$ref":"#/components/schemas/RemapperDefinition","description":"The subject of the email."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"The body of the email. The content of the body is converted to HTML using the Markdown syntax."},"attachments":{"$ref":"#/components/schemas/RemapperDefinition","description":"The attachments to include in the email.\n\nThe remapper must resolve to an object containing the following properties:\n\n- `target`: The asset ID or link to download contents from to add as an attachment. This is mutually exclusive with `content`.\n- `content`: The raw content to include as the file content. This is mutually exclusive with `target`.\n- `filename`: The filename to include the attachment as.\n- `accept` If the target is a URL, this will be set as the HTTP `Accept` header when downloading the file.\n\nIf the attachment is a string, it will be treated as the target."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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"}}},"EventActionDefinition":{"type":"object","additionalProperties":false,"required":["type","event"],"properties":{"type":{"enum":["event"],"description":"This action allows for other blocks to emit data upon triggering the action.\n\nThis can be used to make blocks interact with each other, such as triggering the `data-loader`\nblock to refresh itself by sending an event action that matches the name of what the block is\nlistening to.\n"},"event":{"type":"string","description":"The name of the event to emit."},"waitFor":{"type":"string","description":"If specified, the action will wait for this event to have been emitted and respond with its data."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"EventsDefinition":{"type":"object","description":"An object describing the names of the events the block can listen and emit to.","additionalProperties":false,"minProperties":1,"properties":{"listen":{"type":"object","description":"This property defines the events this block will listen on.\n\nThe key is the name of the event will listen on. The value is a user defined event name which should\nmatch the name of an emitted event on the same page.\n","minProperties":1,"additionalProperties":{"type":"string"}},"emit":{"type":"object","description":"This property defines the events this block will emit.\n\nThe key is the name of the event will emit. The value is a user defined event name which should\nmatch the name of a event on the same page that\u2019s being listened on.\n","minProperties":1,"additionalProperties":{"type":"string"}}}},"FilterParametersDefinition":{"type":"object","description":"An object describing the comparison that should be applied to the key in an OData filter.","additionalProperties":false,"properties":{"type":{"enum":["Boolean","String","Number","Date","Guid"]},"value":{"$ref":"#/components/schemas/RemapperDefinition"},"comparator":{"enum":["eq","ge","gt","le","lt","ne"]}}},"FlowBackActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["flow.back"],"description":"On [flow pages](#flow-page-definition-sub-pages), return to the previous page if\nit is present. If this is called on the first page, nothing happens.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"FlowCancelActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["flow.cancel"],"description":"On [flow pages](../guides/page-types#flow-page), cancel the ongoing flow and invoke the page's [`onFlowFinish`](#flow-page-actions-definition-on-flow-finish) action."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"FlowFinishActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["flow.finish"],"description":"On [flow pages](../guides/page-types#flow-page), triggers the\n[`onFlowFinish`](#flow-page-actions-definition-on-flow-finish) action on the page.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"FlowNextActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["flow.next"],"description":"On [flow pages](#flow-page-definition-sub-pages), proceed to the next page if it\nis present. Otherwise, the flow is considered to be complete and [`flow.finish`](#flowfinish) will\nbe called instead.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"FlowPageActionsDefinition":{"type":"object","description":"These actions are fired on a flow page.","additionalProperties":false,"properties":{"onFlowCancel":{"$ref":"#/components/schemas/ActionDefinition","description":"This action gets triggered when `flow.cancel` gets called."},"onFlowFinish":{"$ref":"#/components/schemas/ActionDefinition","description":"This action gets triggered when a flow is finished.\n\nA flow is finished when `flow.finish` gets called, or when `flow.next` gets called on the final\nsubpage. This action has a special property in which the cumulative input data from each previous subpage gets sent, instead of the individual block that triggered this action."},"onLoad":{"$ref":"#/components/schemas/ActionDefinition","description":"This action is fired when a page loads, highly helpful in loading data for the page"}}},"FlowPageDefinition":{"type":"object","description":"Shows a set of sub pages in a certain order which the user can navigate through.","required":["type","steps","name"],"additionalProperties":false,"properties":{"type":{"enum":["flow"]},"steps":{"type":"array","minItems":2,"description":"Steps belonging to this page's flow.","items":{"$ref":"#/components/schemas/SubPage"}},"actions":{"$ref":"#/components/schemas/FlowPageActionsDefinition"},"progress":{"description":"The method that should be used to display the status of flow pages.","enum":["corner-dots","hidden"]},"retainFlowData":{"type":"boolean","description":"Whether to retain the flow data when navigating away to another page outside the flow.\n\nBy default the flow page retains it's data after navigating once. Set to false to clear it.\n","default":true},"name":{"type":"string","maxLength":50,"description":"The name of an app.\n\nThis field is always required and must be unique within the app, meaning that it is not possible to\nhave two pages with the same name. The name of the page is displayed at the *app bar* of each page as well as in the side navigational menu.\n\n> **Note**: The URL used to navigate to pages is determined by this property.\n"},"hideName":{"type":"boolean","description":"Whether or not the page name should be displayed in the *app bar*."},"navTitle":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the page when displayed in the navigation menu.\n\n  Context property `name` can be used to access the name of the page.\n  "},"hideNavTitle":{"type":"boolean","description":"Whether or not the page should be displayed in navigational menus.\n\n  By default all pages without parameters are added to navigational menus. Set to `true` to hide the\n  page from menus.\n  ","default":false},"navigation":{"$ref":"#/components/schemas/AppLayoutDefinition/properties/navigation","description":"The type of navigation displayed on the page.\n\nThis overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or\nApp navigation are not set.\n\nSet to `bottom` to use a navigation pane at the bottom of the screen instead of the default side\nmenu. Set to `hidden` to display no navigational menus at all.\n"},"icon":{"type":"string","description":"An optional icon from the fontawesome icon set\n\nThis will be displayed in the navigation menu.\n"},"parameters":{"type":"array","description":"Page parameters can be used for linking to a page that should display a single resource.\n\nThis defined as a list of strings representing the properties to pass through. More often than not\npassing `id` through is sufficient, depending on the block.\n","items":{"type":"string","minLength":1,"maxLength":30}},"roles":{"type":"array","description":"The list of roles that are allowed to view this page.\n\nIf the user doesn\u2019t have any of the roles in the list the page will be unavailable to them. An empty\nlist can be used to specify that users need to log in but do not need a specific role.\n\nUsers trying to visit a page without having the correct roles will be redirected to the first page\nthat they are allowed to view. If there aren\u2019t any accessible pages, the user will be logged out and\ninstructed to contact the app owner to get permissions.\n","items":{"type":"string"}},"theme":{"$ref":"#/components/schemas/Theme"},"badgeCount":{"$ref":"#/components/schemas/RemapperDefinition","description":"A Remapper that resolves to a number to be visibile in the side-menu."}}},"FlowToActionDefinition":{"type":"object","additionalProperties":false,"required":["type","step"],"properties":{"type":{"enum":["flow.to"],"description":"On [flow pages](#flow-page-definition-sub-pages), move to a specific step."},"step":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the step to move to.\n\nThis is a remapper which gets called with the action input and context.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"GoogleFontDefinition":{"type":"object","description":"A Google font definition.","additionalProperties":false,"required":["family"],"properties":{"source":{"description":"Use a font from [Google Fonts](https://fonts.google.com).","enum":["google"]},"family":{"enum":["ABeeZee","ADLaM Display","AR One Sans","Abel","Abhaya Libre","Aboreto","Abril Fatface","Abyssinica SIL","Aclonica","Acme","Actor","Adamina","Advent Pro","Afacad","Agbalumo","Agdasima","Aguafina Script","Akatab","Akaya Kanadaka","Akaya Telivigala","Akronim","Akshar","Aladin","Alata","Alatsi","Albert Sans","Aldrich","Alef","Alegreya","Alegreya SC","Alegreya Sans","Alegreya Sans SC","Aleo","Alex Brush","Alexandria","Alfa Slab One","Alice","Alike","Alike Angular","Alkalami","Alkatra","Allan","Allerta","Allerta Stencil","Allison","Allura","Almarai","Almendra","Almendra Display","Almendra SC","Alumni Sans","Alumni Sans Collegiate One","Alumni Sans Inline One","Alumni Sans Pinstripe","Amarante","Amaranth","Amatic SC","Amethysta","Amiko","Amiri","Amiri Quran","Amita","Anaheim","Andada Pro","Andika","Anek Bangla","Anek Devanagari","Anek Gujarati","Anek Gurmukhi","Anek Kannada","Anek Latin","Anek Malayalam","Anek Odia","Anek Tamil","Anek Telugu","Angkor","Annie Use Your Telescope","Anonymous Pro","Antic","Antic Didone","Antic Slab","Anton","Antonio","Anuphan","Anybody","Aoboshi One","Arapey","Arbutus","Arbutus Slab","Architects Daughter","Archivo","Archivo Black","Archivo Narrow","Are You Serious","Aref Ruqaa","Aref Ruqaa Ink","Arima","Arimo","Arizonia","Armata","Arsenal","Artifika","Arvo","Arya","Asap","Asap Condensed","Asar","Asset","Assistant","Astloch","Asul","Athiti","Atkinson Hyperlegible","Atma","Atomic Age","Aubrey","Audiowide","Autour One","Average","Average Sans","Averia Gruesa Libre","Averia Libre","Averia Sans Libre","Averia Serif Libre","Azeret Mono","B612","B612 Mono","BIZ UDGothic","BIZ UDMincho","BIZ UDPGothic","BIZ UDPMincho","Babylonica","Bacasime Antique","Bad Script","Bagel Fat One","Bahiana","Bahianita","Bai Jamjuree","Bakbak One","Ballet","Baloo 2","Baloo Bhai 2","Baloo Bhaijaan 2","Baloo Bhaina 2","Baloo Chettan 2","Baloo Da 2","Baloo Paaji 2","Baloo Tamma 2","Baloo Tammudu 2","Baloo Thambi 2","Balsamiq Sans","Balthazar","Bangers","Barlow","Barlow Condensed","Barlow Semi Condensed","Barriecito","Barrio","Basic","Baskervville","Battambang","Baumans","Bayon","Be Vietnam Pro","Beau Rivage","Bebas Neue","Belanosima","Belgrano","Bellefair","Belleza","Bellota","Bellota Text","BenchNine","Benne","Bentham","Berkshire Swash","Besley","Beth Ellen","Bevan","BhuTuka Expanded One","Big Shoulders Display","Big Shoulders Inline Display","Big Shoulders Inline Text","Big Shoulders Stencil Display","Big Shoulders Stencil Text","Big Shoulders Text","Bigelow Rules","Bigshot One","Bilbo","Bilbo Swash Caps","BioRhyme","BioRhyme Expanded","Birthstone","Birthstone Bounce","Biryani","Bitter","Black And White Picture","Black Han Sans","Black Ops One","Blaka","Blaka Hollow","Blaka Ink","Blinker","Bodoni Moda","Bokor","Bona Nova","Bonbon","Bonheur Royale","Boogaloo","Borel","Bowlby One","Bowlby One SC","Braah One","Brawler","Bree Serif","Bricolage Grotesque","Bruno Ace","Bruno Ace SC","Brygada 1918","Bubblegum Sans","Bubbler One","Buda","Buenard","Bungee","Bungee Hairline","Bungee Inline","Bungee Outline","Bungee Shade","Bungee Spice","Butcherman","Butterfly Kids","Cabin","Cabin Condensed","Cabin Sketch","Caesar Dressing","Cagliostro","Cairo","Cairo Play","Caladea","Calistoga","Calligraffitti","Cambay","Cambo","Candal","Cantarell","Cantata One","Cantora One","Caprasimo","Capriola","Caramel","Carattere","Cardo","Carlito","Carme","Carrois Gothic","Carrois Gothic SC","Carter One","Castoro","Castoro Titling","Catamaran","Caudex","Caveat","Caveat Brush","Cedarville Cursive","Ceviche One","Chakra Petch","Changa","Changa One","Chango","Charis SIL","Charm","Charmonman","Chathura","Chau Philomene One","Chela One","Chelsea Market","Chenla","Cherish","Cherry Bomb One","Cherry Cream Soda","Cherry Swash","Chewy","Chicle","Chilanka","Chivo","Chivo Mono","Chokokutai","Chonburi","Cinzel","Cinzel Decorative","Clicker Script","Climate Crisis","Coda","Codystar","Coiny","Combo","Comfortaa","Comforter","Comforter Brush","Comic Neue","Coming Soon","Comme","Commissioner","Concert One","Condiment","Content","Contrail One","Convergence","Cookie","Copse","Corben","Corinthia","Cormorant","Cormorant Garamond","Cormorant Infant","Cormorant SC","Cormorant Unicase","Cormorant Upright","Courgette","Courier Prime","Cousine","Coustard","Covered By Your Grace","Crafty Girls","Creepster","Crete Round","Crimson Pro","Crimson Text","Croissant One","Crushed","Cuprum","Cute Font","Cutive","Cutive Mono","DM Mono","DM Sans","DM Serif Display","DM Serif Text","Dai Banna SIL","Damion","Dancing Script","Dangrek","Darker Grotesque","Darumadrop One","David Libre","Dawning of a New Day","Days One","Dekko","Dela Gothic One","Delicious Handrawn","Delius","Delius Swash Caps","Delius Unicase","Della Respira","Denk One","Devonshire","Dhurjati","Didact Gothic","Diphylleia","Diplomata","Diplomata SC","Do Hyeon","Dokdo","Domine","Donegal One","Dongle","Doppio One","Dorsa","Dosis","DotGothic16","Dr Sugiyama","Duru Sans","DynaPuff","Dynalight","EB Garamond","Eagle Lake","East Sea Dokdo","Eater","Economica","Eczar","Edu NSW ACT Foundation","Edu QLD Beginner","Edu SA Beginner","Edu TAS Beginner","Edu VIC WA NT Beginner","El Messiri","Electrolize","Elsie","Elsie Swash Caps","Emblema One","Emilys Candy","Encode Sans","Encode Sans Condensed","Encode Sans Expanded","Encode Sans SC","Encode Sans Semi Condensed","Encode Sans Semi Expanded","Engagement","Englebert","Enriqueta","Ephesis","Epilogue","Erica One","Esteban","Estonia","Euphoria Script","Ewert","Exo","Exo 2","Expletus Sans","Explora","Fahkwang","Familjen Grotesk","Fanwood Text","Farro","Farsan","Fascinate","Fascinate Inline","Faster One","Fasthand","Fauna One","Faustina","Federant","Federo","Felipa","Fenix","Festive","Figtree","Finger Paint","Finlandica","Fira Code","Fira Mono","Fira Sans","Fira Sans Condensed","Fira Sans Extra Condensed","Fjalla One","Fjord One","Flamenco","Flavors","Fleur De Leah","Flow Block","Flow Circular","Flow Rounded","Foldit","Fondamento","Fontdiner Swanky","Forum","Fragment Mono","Francois One","Frank Ruhl Libre","Fraunces","Freckle Face","Fredericka the Great","Fredoka","Freehand","Fresca","Frijole","Fruktur","Fugaz One","Fuggles","Fuzzy Bubbles","GFS Didot","GFS Neohellenic","Gabarito","Gabriela","Gaegu","Gafata","Gajraj One","Galada","Galdeano","Galindo","Gamja Flower","Gantari","Gasoek One","Gayathri","Gelasio","Gemunu Libre","Genos","Gentium Book Plus","Gentium Plus","Geo","Geologica","Georama","Geostar","Geostar Fill","Germania One","Gideon Roman","Gidugu","Gilda Display","Girassol","Give You Glory","Glass Antiqua","Glegoo","Gloock","Gloria Hallelujah","Glory","Gluten","Goblin One","Gochi Hand","Goldman","Golos Text","Gorditas","Gothic A1","Gotu","Goudy Bookletter 1911","Gowun Batang","Gowun Dodum","Graduate","Grand Hotel","Grandiflora One","Grandstander","Grape Nuts","Gravitas One","Great Vibes","Grechen Fuemen","Grenze","Grenze Gotisch","Grey Qo","Griffy","Gruppo","Gudea","Gugi","Gulzar","Gupter","Gurajada","Gwendolyn","Habibi","Hachi Maru Pop","Hahmlet","Halant","Hammersmith One","Hanalei","Hanalei Fill","Handjet","Handlee","Hanken Grotesk","Hanuman","Happy Monkey","Harmattan","Headland One","Hedvig Letters Sans","Hedvig Letters Serif","Heebo","Henny Penny","Hepta Slab","Herr Von Muellerhoff","Hi Melody","Hina Mincho","Hind","Hind Guntur","Hind Madurai","Hind Siliguri","Hind Vadodara","Holtwood One SC","Homemade Apple","Homenaje","Honk","Hubballi","Hurricane","IBM Plex Mono","IBM Plex Sans","IBM Plex Sans Arabic","IBM Plex Sans Condensed","IBM Plex Sans Devanagari","IBM Plex Sans Hebrew","IBM Plex Sans JP","IBM Plex Sans KR","IBM Plex Sans Thai","IBM Plex Sans Thai Looped","IBM Plex Serif","IM Fell DW Pica","IM Fell DW Pica SC","IM Fell Double Pica","IM Fell Double Pica SC","IM Fell English","IM Fell English SC","IM Fell French Canon","IM Fell French Canon SC","IM Fell Great Primer","IM Fell Great Primer SC","Ibarra Real Nova","Iceberg","Iceland","Imbue","Imperial Script","Imprima","Inclusive Sans","Inconsolata","Inder","Indie Flower","Ingrid Darling","Inika","Inknut Antiqua","Inria Sans","Inria Serif","Inspiration","Instrument Sans","Instrument Serif","Inter","Inter Tight","Irish Grover","Island Moments","Istok Web","Italiana","Italianno","Itim","Jacques Francois","Jacques Francois Shadow","Jaldi","JetBrains Mono","Jim Nightshade","Joan","Jockey One","Jolly Lodger","Jomhuria","Jomolhari","Josefin Sans","Josefin Slab","Jost","Joti One","Jua","Judson","Julee","Julius Sans One","Junge","Jura","Just Another Hand","Just Me Again Down Here","K2D","Kablammo","Kadwa","Kaisei Decol","Kaisei HarunoUmi","Kaisei Opti","Kaisei Tokumin","Kalam","Kalnia","Kameron","Kanit","Kantumruy Pro","Karantina","Karla","Karma","Katibeh","Kaushan Script","Kavivanar","Kavoon","Kay Pho Du","Kdam Thmor Pro","Keania One","Kelly Slab","Kenia","Khand","Khmer","Khula","Kings","Kirang Haerang","Kite One","Kiwi Maru","Klee One","Knewave","KoHo","Kodchasan","Koh Santepheap","Kolker Brush","Konkhmer Sleokchher","Kosugi","Kosugi Maru","Kotta One","Koulen","Kranky","Kreon","Kristi","Krona One","Krub","Kufam","Kulim Park","Kumar One","Kumar One Outline","Kumbh Sans","Kurale","La Belle Aurore","Labrada","Lacquer","Laila","Lakki Reddy","Lalezar","Lancelot","Langar","Lateef","Lato","Lavishly Yours","League Gothic","League Script","League Spartan","Leckerli One","Ledger","Lekton","Lemon","Lemonada","Lexend","Lexend Deca","Lexend Exa","Lexend Giga","Lexend Mega","Lexend Peta","Lexend Tera","Lexend Zetta","Libre Barcode 128","Libre Barcode 128 Text","Libre Barcode 39","Libre Barcode 39 Extended","Libre Barcode 39 Extended Text","Libre Barcode 39 Text","Libre Barcode EAN13 Text","Libre Baskerville","Libre Bodoni","Libre Caslon Display","Libre Caslon Text","Libre Franklin","Licorice","Life Savers","Lilita One","Lily Script One","Limelight","Linden Hill","Linefont","Lisu Bosa","Literata","Liu Jian Mao Cao","Livvic","Lobster","Lobster Two","Londrina Outline","Londrina Shadow","Londrina Sketch","Londrina Solid","Long Cang","Lora","Love Light","Love Ya Like A Sister","Loved by the King","Lovers Quarrel","Luckiest Guy","Lugrasimo","Lumanosimo","Lunasima","Lusitana","Lustria","Luxurious Roman","Luxurious Script","M PLUS 1","M PLUS 1 Code","M PLUS 1p","M PLUS 2","M PLUS Code Latin","M PLUS Rounded 1c","Ma Shan Zheng","Macondo","Macondo Swash Caps","Mada","Magra","Maiden Orange","Maitree","Major Mono Display","Mako","Mali","Mallanna","Mandali","Manjari","Manrope","Mansalva","Manuale","Marcellus","Marcellus SC","Marck Script","Margarine","Marhey","Markazi Text","Marko One","Marmelad","Martel","Martel Sans","Martian Mono","Marvel","Mate","Mate SC","Material Icons","Material Icons Outlined","Material Icons Round","Material Icons Sharp","Material Icons Two Tone","Material Symbols Outlined","Material Symbols Rounded","Material Symbols Sharp","Maven Pro","McLaren","Mea Culpa","Meddon","MedievalSharp","Medula One","Meera Inimai","Megrim","Meie Script","Meow Script","Merienda","Merriweather","Merriweather Sans","Metal","Metal Mania","Metamorphous","Metrophobic","Michroma","Milonga","Miltonian","Miltonian Tattoo","Mina","Mingzat","Miniver","Miriam Libre","Mirza","Miss Fajardose","Mitr","Mochiy Pop One","Mochiy Pop P One","Modak","Modern Antiqua","Mogra","Mohave","Moirai One","Molengo","Molle","Monda","Monofett","Monomaniac One","Monoton","Monsieur La Doulaise","Montaga","Montagu Slab","MonteCarlo","Montez","Montserrat","Montserrat Alternates","Montserrat Subrayada","Moo Lah Lah","Mooli","Moon Dance","Moul","Moulpali","Mountains of Christmas","Mouse Memoirs","Mr Bedfort","Mr Dafoe","Mr De Haviland","Mrs Saint Delafield","Mrs Sheppards","Ms Madi","Mukta","Mukta Mahee","Mukta Malar","Mukta Vaani","Mulish","Murecho","MuseoModerno","My Soul","Mynerve","Mystery Quest","NTR","Nabla","Nanum Brush Script","Nanum Gothic","Nanum Gothic Coding","Nanum Myeongjo","Nanum Pen Script","Narnoor","Neonderthaw","Nerko One","Neucha","Neuton","New Rocker","New Tegomin","News Cycle","Newsreader","Niconne","Niramit","Nixie One","Nobile","Nokora","Norican","Nosifer","Notable","Nothing You Could Do","Noticia Text","Noto Color Emoji","Noto Emoji","Noto Kufi Arabic","Noto Music","Noto Naskh Arabic","Noto Nastaliq Urdu","Noto Rashi Hebrew","Noto Sans","Noto Sans Adlam","Noto Sans Adlam Unjoined","Noto Sans Anatolian Hieroglyphs","Noto Sans Arabic","Noto Sans Armenian","Noto Sans Avestan","Noto Sans Balinese","Noto Sans Bamum","Noto Sans Bassa Vah","Noto Sans Batak","Noto Sans Bengali","Noto Sans Bhaiksuki","Noto Sans Brahmi","Noto Sans Buginese","Noto Sans Buhid","Noto Sans Canadian Aboriginal","Noto Sans Carian","Noto Sans Caucasian Albanian","Noto Sans Chakma","Noto Sans Cham","Noto Sans Cherokee","Noto Sans Chorasmian","Noto Sans Coptic","Noto Sans Cuneiform","Noto Sans Cypriot","Noto Sans Cypro Minoan","Noto Sans Deseret","Noto Sans Devanagari","Noto Sans Display","Noto Sans Duployan","Noto Sans Egyptian Hieroglyphs","Noto Sans Elbasan","Noto Sans Elymaic","Noto Sans Ethiopic","Noto Sans Georgian","Noto Sans Glagolitic","Noto Sans Gothic","Noto Sans Grantha","Noto Sans Gujarati","Noto Sans Gunjala Gondi","Noto Sans Gurmukhi","Noto Sans HK","Noto Sans Hanifi Rohingya","Noto Sans Hanunoo","Noto Sans Hatran","Noto Sans Hebrew","Noto Sans Imperial Aramaic","Noto Sans Indic Siyaq Numbers","Noto Sans Inscriptional Pahlavi","Noto Sans Inscriptional Parthian","Noto Sans JP","Noto Sans Javanese","Noto Sans KR","Noto Sans Kaithi","Noto Sans Kannada","Noto Sans Kawi","Noto Sans Kayah Li","Noto Sans Kharoshthi","Noto Sans Khmer","Noto Sans Khojki","Noto Sans Khudawadi","Noto Sans Lao","Noto Sans Lao Looped","Noto Sans Lepcha","Noto Sans Limbu","Noto Sans Linear A","Noto Sans Linear B","Noto Sans Lisu","Noto Sans Lycian","Noto Sans Lydian","Noto Sans Mahajani","Noto Sans Malayalam","Noto Sans Mandaic","Noto Sans Manichaean","Noto Sans Marchen","Noto Sans Masaram Gondi","Noto Sans Math","Noto Sans Mayan Numerals","Noto Sans Medefaidrin","Noto Sans Meetei Mayek","Noto Sans Mende Kikakui","Noto Sans Meroitic","Noto Sans Miao","Noto Sans Modi","Noto Sans Mongolian","Noto Sans Mono","Noto Sans Mro","Noto Sans Multani","Noto Sans Myanmar","Noto Sans NKo","Noto Sans NKo Unjoined","Noto Sans Nabataean","Noto Sans Nag Mundari","Noto Sans Nandinagari","Noto Sans New Tai Lue","Noto Sans Newa","Noto Sans Nushu","Noto Sans Ogham","Noto Sans Ol Chiki","Noto Sans Old Hungarian","Noto Sans Old Italic","Noto Sans Old North Arabian","Noto Sans Old Permic","Noto Sans Old Persian","Noto Sans Old Sogdian","Noto Sans Old South Arabian","Noto Sans Old Turkic","Noto Sans Oriya","Noto Sans Osage","Noto Sans Osmanya","Noto Sans Pahawh Hmong","Noto Sans Palmyrene","Noto Sans Pau Cin Hau","Noto Sans Phags Pa","Noto Sans Phoenician","Noto Sans Psalter Pahlavi","Noto Sans Rejang","Noto Sans Runic","Noto Sans SC","Noto Sans Samaritan","Noto Sans Saurashtra","Noto Sans Sharada","Noto Sans Shavian","Noto Sans Siddham","Noto Sans SignWriting","Noto Sans Sinhala","Noto Sans Sogdian","Noto Sans Sora Sompeng","Noto Sans Soyombo","Noto Sans Sundanese","Noto Sans Syloti Nagri","Noto Sans Symbols","Noto Sans Symbols 2","Noto Sans Syriac","Noto Sans Syriac Eastern","Noto Sans TC","Noto Sans Tagalog","Noto Sans Tagbanwa","Noto Sans Tai Le","Noto Sans Tai Tham","Noto Sans Tai Viet","Noto Sans Takri","Noto Sans Tamil","Noto Sans Tamil Supplement","Noto Sans Tangsa","Noto Sans Telugu","Noto Sans Thaana","Noto Sans Thai","Noto Sans Thai Looped","Noto Sans Tifinagh","Noto Sans Tirhuta","Noto Sans Ugaritic","Noto Sans Vai","Noto Sans Vithkuqi","Noto Sans Wancho","Noto Sans Warang Citi","Noto Sans Yi","Noto Sans Zanabazar Square","Noto Serif","Noto Serif Ahom","Noto Serif Armenian","Noto Serif Balinese","Noto Serif Bengali","Noto Serif Devanagari","Noto Serif Display","Noto Serif Dogra","Noto Serif Ethiopic","Noto Serif Georgian","Noto Serif Grantha","Noto Serif Gujarati","Noto Serif Gurmukhi","Noto Serif HK","Noto Serif Hebrew","Noto Serif JP","Noto Serif KR","Noto Serif Kannada","Noto Serif Khitan Small Script","Noto Serif Khmer","Noto Serif Khojki","Noto Serif Lao","Noto Serif Makasar","Noto Serif Malayalam","Noto Serif Myanmar","Noto Serif NP Hmong","Noto Serif Old Uyghur","Noto Serif Oriya","Noto Serif Ottoman Siyaq","Noto Serif SC","Noto Serif Sinhala","Noto Serif TC","Noto Serif Tamil","Noto Serif Tangut","Noto Serif Telugu","Noto Serif Thai","Noto Serif Tibetan","Noto Serif Toto","Noto Serif Vithkuqi","Noto Serif Yezidi","Noto Traditional Nushu","Nova Cut","Nova Flat","Nova Mono","Nova Oval","Nova Round","Nova Script","Nova Slim","Nova Square","Numans","Nunito","Nunito Sans","Nuosu SIL","Odibee Sans","Odor Mean Chey","Offside","Oi","Old Standard TT","Oldenburg","Ole","Oleo Script","Oleo Script Swash Caps","Onest","Oooh Baby","Open Sans","Oranienbaum","Orbit","Orbitron","Oregano","Orelega One","Orienta","Original Surfer","Oswald","Outfit","Over the Rainbow","Overlock","Overlock SC","Overpass","Overpass Mono","Ovo","Oxanium","Oxygen","Oxygen Mono","PT Mono","PT Sans","PT Sans Caption","PT Sans Narrow","PT Serif","PT Serif Caption","Pacifico","Padauk","Padyakke Expanded One","Palanquin","Palanquin Dark","Palette Mosaic","Pangolin","Paprika","Parisienne","Passero One","Passion One","Passions Conflict","Pathway Extreme","Pathway Gothic One","Patrick Hand","Patrick Hand SC","Pattaya","Patua One","Pavanam","Paytone One","Peddana","Peralta","Permanent Marker","Petemoss","Petit Formal Script","Petrona","Philosopher","Phudu","Piazzolla","Piedra","Pinyon Script","Pirata One","Pixelify Sans","Plaster","Play","Playball","Playfair","Playfair Display","Playfair Display SC","Playpen Sans","Plus Jakarta Sans","Podkova","Poiret One","Poller One","Poltawski Nowy","Poly","Pompiere","Pontano Sans","Poor Story","Poppins","Port Lligat Sans","Port Lligat Slab","Potta One","Pragati Narrow","Praise","Prata","Preahvihear","Press Start 2P","Pridi","Princess Sofia","Prociono","Prompt","Prosto One","Proza Libre","Public Sans","Puppies Play","Puritan","Purple Purse","Qahiri","Quando","Quantico","Quattrocento","Quattrocento Sans","Questrial","Quicksand","Quintessential","Qwigley","Qwitcher Grypen","REM","Racing Sans One","Radio Canada","Radley","Rajdhani","Rakkas","Raleway","Raleway Dots","Ramabhadra","Ramaraja","Rambla","Rammetto One","Rampart One","Ranchers","Rancho","Ranga","Rasa","Rationale","Ravi Prakash","Readex Pro","Recursive","Red Hat Display","Red Hat Mono","Red Hat Text","Red Rose","Redacted","Redacted Script","Redressed","Reem Kufi","Reem Kufi Fun","Reem Kufi Ink","Reenie Beanie","Reggae One","Rethink Sans","Revalia","Rhodium Libre","Ribeye","Ribeye Marrow","Righteous","Risque","Road Rage","Roboto","Roboto Condensed","Roboto Flex","Roboto Mono","Roboto Serif","Roboto Slab","Rochester","Rock 3D","Rock Salt","RocknRoll One","Rokkitt","Romanesco","Ropa Sans","Rosario","Rosarivo","Rouge Script","Rowdies","Rozha One","Rubik","Rubik 80s Fade","Rubik Beastly","Rubik Broken Fax","Rubik Bubbles","Rubik Burned","Rubik Dirt","Rubik Distressed","Rubik Doodle Shadow","Rubik Doodle Triangles","Rubik Gemstones","Rubik Glitch","Rubik Glitch Pop","Rubik Iso","Rubik Lines","Rubik Maps","Rubik Marker Hatch","Rubik Maze","Rubik Microbe","Rubik Mono One","Rubik Moonrocks","Rubik Pixels","Rubik Puddles","Rubik Scribble","Rubik Spray Paint","Rubik Storm","Rubik Vinyl","Rubik Wet Paint","Ruda","Rufina","Ruge Boogie","Ruluko","Rum Raisin","Ruslan Display","Russo One","Ruthie","Ruwudu","Rye","STIX Two Text","Sacramento","Sahitya","Sail","Saira","Saira Condensed","Saira Extra Condensed","Saira Semi Condensed","Saira Stencil One","Salsa","Sanchez","Sancreek","Sansita","Sansita Swashed","Sarabun","Sarala","Sarina","Sarpanch","Sassy Frass","Satisfy","Sawarabi Gothic","Sawarabi Mincho","Scada","Scheherazade New","Schibsted Grotesk","Schoolbell","Scope One","Seaweed Script","Secular One","Sedgwick Ave","Sedgwick Ave Display","Sen","Send Flowers","Sevillana","Seymour One","Shadows Into Light","Shadows Into Light Two","Shalimar","Shantell Sans","Shanti","Share","Share Tech","Share Tech Mono","Shippori Antique","Shippori Antique B1","Shippori Mincho","Shippori Mincho B1","Shizuru","Shojumaru","Short Stack","Shrikhand","Siemreap","Sigmar","Sigmar One","Signika","Signika Negative","Silkscreen","Simonetta","Single Day","Sintony","Sirin Stencil","Six Caps","Sixtyfour","Skranji","Slabo 13px","Slabo 27px","Slackey","Slackside One","Smokum","Smooch","Smooch Sans","Smythe","Sniglet","Snippet","Snowburst One","Sofadi One","Sofia","Sofia Sans","Sofia Sans Condensed","Sofia Sans Extra Condensed","Sofia Sans Semi Condensed","Solitreo","Solway","Sometype Mono","Song Myung","Sono","Sonsie One","Sora","Sorts Mill Goudy","Source Code Pro","Source Sans 3","Source Serif 4","Space Grotesk","Space Mono","Special Elite","Spectral","Spectral SC","Spicy Rice","Spinnaker","Spirax","Splash","Spline Sans","Spline Sans Mono","Squada One","Square Peg","Sree Krushnadevaraya","Sriracha","Srisakdi","Staatliches","Stalemate","Stalinist One","Stardos Stencil","Stick","Stick No Bills","Stint Ultra Condensed","Stint Ultra Expanded","Stoke","Strait","Style Script","Stylish","Sue Ellen Francisco","Suez One","Sulphur Point","Sumana","Sunflower","Sunshiney","Supermercado One","Sura","Suranna","Suravaram","Suwannaphum","Swanky and Moo Moo","Syncopate","Syne","Syne Mono","Syne Tactile","Tai Heritage Pro","Tajawal","Tangerine","Tapestry","Taprom","Tauri","Taviraj","Teko","Tektur","Telex","Tenali Ramakrishna","Tenor Sans","Text Me One","Texturina","Thasadith","The Girl Next Door","The Nautigal","Tienne","Tillana","Tilt Neon","Tilt Prism","Tilt Warp","Timmana","Tinos","Tiro Bangla","Tiro Devanagari Hindi","Tiro Devanagari Marathi","Tiro Devanagari Sanskrit","Tiro Gurmukhi","Tiro Kannada","Tiro Tamil","Tiro Telugu","Titan One","Titillium Web","Tomorrow","Tourney","Trade Winds","Train One","Trirong","Trispace","Trocchi","Trochut","Truculenta","Trykker","Tsukimi Rounded","Tulpen One","Turret Road","Twinkle Star","Ubuntu","Ubuntu Condensed","Ubuntu Mono","Uchen","Ultra","Unbounded","Uncial Antiqua","Underdog","Unica One","UnifrakturCook","UnifrakturMaguntia","Unkempt","Unlock","Unna","Updock","Urbanist","VT323","Vampiro One","Varela","Varela Round","Varta","Vast Shadow","Vazirmatn","Vesper Libre","Viaoda Libre","Vibes","Vibur","Victor Mono","Vidaloka","Viga","Vina Sans","Voces","Volkhov","Vollkorn","Vollkorn SC","Voltaire","Vujahday Script","Waiting for the Sunrise","Wallpoet","Walter Turncoat","Warnes","Water Brush","Waterfall","Wavefont","Wellfleet","Wendy One","Whisper","WindSong","Wire One","Wix Madefor Display","Wix Madefor Text","Work Sans","Workbench","Xanh Mono","Yaldevi","Yanone Kaffeesatz","Yantramanav","Yatra One","Yellowtail","Yeon Sung","Yeseva One","Yesteryear","Yomogi","Young Serif","Yrsa","Ysabeau","Ysabeau Infant","Ysabeau Office","Ysabeau SC","Yuji Boku","Yuji Hentaigana Akari","Yuji Hentaigana Akebono","Yuji Mai","Yuji Syuku","Yusei Magic","ZCOOL KuaiLe","ZCOOL QingKe HuangYou","ZCOOL XiaoWei","Zen Antique","Zen Antique Soft","Zen Dots","Zen Kaku Gothic Antique","Zen Kaku Gothic New","Zen Kurenaido","Zen Loop","Zen Maru Gothic","Zen Old Mincho","Zen Tokyo Zoo","Zeyada","Zhi Mang Xing","Zilla Slab","Zilla Slab Highlight"],"description":"The font to use in the app.\n\nAny font available on [Google Fonts](https://fonts.google.com) may be used.\n","default":{"family":"Open Sans","source":"google"}}}},"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"}}},"GroupMemberDeleteActionDefinition":{"type":"object","additionalProperties":false,"required":["type","id"],"properties":{"type":{"enum":["group.member.delete"],"description":"Delete a group member from the group in which the invoking user is a member"},"id":{"$ref":"#/components/schemas/RemapperDefinition","description":"The id of the group member to delete"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"GroupMemberInviteActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["group.member.invite"],"description":"Invite an app member to join a group."},"id":{"description":"The ID of the group to invite the app member to.","$ref":"#/components/schemas/RemapperDefinition"},"email":{"description":"The email address of the user to invite.","$ref":"#/components/schemas/RemapperDefinition"},"role":{"description":"The role to invite the user as.","$ref":"#/components/schemas/RemapperDefinition"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"GroupMemberQueryActionDefinition":{"type":"object","additionalProperties":false,"required":["type","id"],"properties":{"type":{"enum":["group.member.query"],"description":"Get a list of a group's members"},"id":{"description":"The ID of a specific group to get the members from","$ref":"#/components/schemas/RemapperDefinition"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"GroupMemberRoleUpdateActionDefinition":{"type":"object","additionalProperties":false,"required":["type","id","role"],"properties":{"type":{"enum":["group.member.role.update"],"description":"Update the role of a group member."},"id":{"description":"The id of the group member to update the role of.","$ref":"#/components/schemas/RemapperDefinition"},"role":{"description":"The new role of the group member.","$ref":"#/components/schemas/RemapperDefinition"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"GroupQueryActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["group.query"],"description":"Get a list of all of the groups in an app."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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"}}},"JSONPointer":{"type":"object","description":"A JSON pointer which may be used to reference a JSON schema.","additionalProperties":false,"required":["$ref"],"properties":{"$ref":{"type":"string","description":"A JSON schema reference.","pattern":"^#\\/definitions\\/","example":"#/definitions/MyReusableSchema"},"default":{"description":"The default value that will be used."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchema":{"anyOf":[{"$ref":"#/components/schemas/JSONPointer"},{"$ref":"#/components/schemas/JSONSchemaAnyOf"},{"$ref":"#/components/schemas/JSONSchemaArray"},{"$ref":"#/components/schemas/JSONSchemaBoolean"},{"$ref":"#/components/schemas/JSONSchemaConst"},{"$ref":"#/components/schemas/JSONSchemaEnum"},{"$ref":"#/components/schemas/JSONSchemaInteger"},{"$ref":"#/components/schemas/JSONSchemaMultiType"},{"$ref":"#/components/schemas/JSONSchemaNot"},{"$ref":"#/components/schemas/JSONSchemaNull"},{"$ref":"#/components/schemas/JSONSchemaNumber"},{"$ref":"#/components/schemas/JSONSchemaObject"},{"$ref":"#/components/schemas/JSONSchemaOneOf"},{"$ref":"#/components/schemas/JSONSchemaRemapper"},{"$ref":"#/components/schemas/JSONSchemaString"}]},"JSONSchemaAnyOf":{"type":"object","description":"A JSON schema which determines the value must match one or more of the given schemas.","additionalProperties":false,"required":["anyOf"],"properties":{"anyOf":{"type":"array","description":"The JSON schema must match one or more of the given schemas.","items":{"$ref":"#/components/schemas/JSONSchema"}},"examples":{"type":"array","description":"An example value which is valid according to this schema.","items":{}},"default":{"description":"The default value which is used if no value is supplied."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaArray":{"type":"object","description":"A JSON schema for an array.","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["array"],"description":"The type of the JSON schema. An array means a list of data."},"example":{"type":"array","description":"An example array which is valid according to this schema.","items":{"type":"array","items":{}}},"default":{"type":"array","description":"The default value which is used if no value is supplied.","items":{}},"maxItems":{"type":"integer","description":"The minimum amount of items the array is allowed to have.","minimum":1},"minItems":{"type":"integer","description":"The maximum amount of items the array is allowed to have.","minimum":0},"uniqueItems":{"type":"boolean","description":"If true, all items in the array need to be unique","default":false},"items":{"$ref":"#/components/schemas/JSONSchema","description":"This property describes what the items in an array should look like."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaBoolean":{"type":"object","description":"A JSON schema for a boolean.","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["boolean"],"description":"The type of the JSON schema. A boolean means either true or false."},"examples":{"type":"array","items":{"type":"boolean","description":"An example boolean which is valid according to this schema."}},"default":{"type":"boolean","description":"The default value which is used if no value is supplied."},"enum":{"type":"array","description":"If an enum is specified, the type can be safely removed.","items":{"type":"boolean"}},"const":{"type":"boolean","description":"If const is specified, the type can be safely removed."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaConst":{"type":"object","description":"A JSON schema which describes a constant","additionalProperties":false,"required":["const"],"properties":{"const":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"enum":[null]}],"description":"The given value must exactly match one the value specified here."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaEnum":{"type":"object","description":"A JSON schema for an enum.","additionalProperties":false,"required":["enum"],"properties":{"enum":{"type":"array","description":"A specific set of values this property is allowed to have.","items":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"enum":[null]}]}},"enumDescriptions":{"type":"array","description":"An array is descriptions for the enum values.\n\nThe description is applied to the enum value at the same index.","items":{"type":"string"}},"examples":{"type":"array","items":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"enum":[null]}],"description":"An example which is valid according to this schema."}},"default":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"enum":[null]}],"description":"The default value which is used if no value is supplied."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaInteger":{"type":"object","description":"A JSON schema for an integer.","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["integer"],"description":"The type of the JSON schema. An integer means a fractionless number."},"examples":{"type":"array","items":{"type":"integer","description":"An example integer which is valid according to this schema."}},"default":{"type":"integer","description":"The default value which is used if no value is supplied."},"enum":{"type":"array","description":"If an enum is specified, the type can be safely removed.","items":{"type":"integer"}},"const":{"type":"integer","description":"If const is specified, the type can be safely removed."},"minimum":{"type":"integer","description":"The minimum value of the number.","example":0},"maximum":{"type":"integer","description":"The maximum value of the number.","example":100},"multipleOf":{"type":"integer","description":"The value must be a multiple of this number.\n\nFor example, if this is set to 3, then the values 0, 3, 6, 9, etc. will be allowed, but not 1, 2, 4,\n5, 7, 8, etc.\n"},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaMultiType":{"type":"object","description":"A JSON schema which defines multiple types.","additionalProperties":false,"required":["type"],"properties":{"type":{"type":"array","uniqueItems":true,"minItems":2,"description":"The type of the JSON schema. It\u2019s recommended to use only one.","items":{"enum":["array","boolean","integer","null","number","string"]}},"examples":{"type":"array","description":"An example which is valid according to this schema.","items":{}},"default":{"description":"The default value which is used if no value is supplied."},"maxItems":{"type":"integer","description":"The minimum amount of items the array is allowed to have.","minimum":1},"minItems":{"type":"integer","description":"The maximum amount of items the array is allowed to have.","minimum":0},"uniqueItems":{"type":"boolean","description":"If true, all items in the array need to be unique","default":false},"items":{"$ref":"#/components/schemas/JSONSchema","description":"This property describes what the items in an array should look like."},"minimum":{"type":"integer","description":"The minimum value of the number.","example":0},"maximum":{"type":"integer","description":"The maximum value of the number.","example":100},"multipleOf":{"type":"integer","description":"The value must be a multiple of this number.\n\nFor example, if this is set to 3, then the values 0, 3, 6, 9, etc. will be allowed, but not 1, 2, 4,\n5, 7, 8, etc.\n"},"maxProperties":{"type":"integer","description":"The maximum number of properties the object is allowed to have.","minimum":0},"minProperties":{"type":"integer","description":"The minimum number of properties the object is must have.","minimum":1},"properties":{"type":"object","description":"A mapping of object keys for the object to nested JSON schemas.","additionalProperties":{"$ref":"#/components/schemas/JSONSchema"}},"required":{"type":"array","description":"A list of properties that are required.","minItems":1,"items":{"type":"string","description":"A property name which is required on the object."}},"additionalProperties":{"description":"Describe if this object is allowed to have properties besides those defined in `properties`\n\nIt\u2019s recommended to set this to `false`.\n","example":false,"anyOf":[{"type":"boolean","description":"If false, the object may not have any additional properties.\n\nIf true, the object may have **any** type of additional properties. This is **not** recommended.\n"},{"$ref":"#/components/schemas/JSONSchema","description":"If this is a JSON schema, it describes any additional properties."}]},"format":{"enum":["date-time","time","date","duration","email","idn-email","hostname","idn-hostname","ipv4","ipv6","uuid","uri","uri-reference","iri","iri-reference","uri-template","json-pointer","relative-json-pointer","regex","action","binary","event-emitter","event-listener","fontawesome"],"description":"The format values should adhere to."},"minLength":{"type":"integer","description":"The minimum length of the string.","minimum":1},"maxLength":{"type":"integer","description":"The maximum length of the string.\n\nIt\u2019s highly recommended to set this property, even if it\u2019s a big number. For example 5000 characters\nis plenty for most larger input fields. Not doing so may result in extremely large user input, which\nresults in a bad user experience.\n","minimum":1,"example":5000},"pattern":{"type":"string","description":"A regular expression to describe user input.\n\nRegular expressions are a powerful way to enforce proper user input, but the learning curve is high.\nIf you don\u2019t know what this is, we recommend to omit this field for now.\n","minLength":1,"format":"regex"},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaNot":{"type":"object","description":"A JSON schema which may not be matched.","additionalProperties":false,"required":["not"],"properties":{"not":{"$ref":"#/components/schemas/JSONSchema","description":"The JSON schema which the value may not match."},"examples":{"type":"array","description":"An example value which is valid according to this schema.","items":{}},"default":{"description":"The default value which is used if no value is supplied."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaNull":{"type":"object","description":"A JSON schema of type null only accepts a null value","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["null"],"description":"Only accept a null value."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaNumber":{"type":"object","description":"A JSON schema for a number which has fractions.","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["number"],"description":"The type of the JSON schema. A number represents a number which has fractions. For fractionless numbers, use `integer` instead."},"enum":{"type":"array","description":"If an enum is specified, the type can be safely removed.","items":{"type":"number"}},"const":{"type":"number","description":"If const is specified, the type can be safely removed."},"examples":{"type":"array","items":{"type":"number","description":"An example number which is valid according to this schema."}},"default":{"type":"number","description":"The default value which is used if no value is supplied."},"minimum":{"type":"number","description":"The minimum value of the number.","example":0},"maximum":{"type":"number","description":"The maximum value of the number.","example":100},"exclusiveMinimum":{"type":"number","description":"The value must be bigger than this number. The given value itself is not allowed."},"exclusiveMaximum":{"type":"number","description":"The value must be smaller than this number. The given value itself is not allowed."},"multipleOf":{"type":"number","description":"The value must be a multiple of this number.\n\nFor example, if this is set to 0.5, then the values 0, 0.5, 1, 1.5, 2, 2.5, etc. will be allowed,\nbut not 0.3, 1.7, etc.\n"},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaObject":{"type":"object","description":"A JSON schema for an object.","additionalProperties":false,"required":["type","additionalProperties"],"properties":{"type":{"enum":["object"],"description":"The type of the JSON schema."},"examples":{"type":"array","items":{"type":"object","description":"An example object which is valid according to this schema.","additionalProperties":true}},"default":{"type":"object","description":"The default value which is used if no value is supplied.","additionalProperties":true},"maxProperties":{"type":"integer","description":"The maximum number of properties the object is allowed to have.","minimum":0},"minProperties":{"type":"integer","description":"The minimum number of properties the object is must have.","minimum":1},"required":{"type":"array","description":"A list of properties that are required.","minItems":1,"items":{"type":"string","description":"A property name which is required on the object."}},"properties":{"type":"object","description":"A mapping of object keys for the object to nested JSON schemas.","additionalProperties":{"$ref":"#/components/schemas/JSONSchema"}},"additionalProperties":{"description":"Describe if this object is allowed to have properties besides those defined in `properties`\n\nIt\u2019s recommended to set this to `false`.\n","example":false,"anyOf":[{"type":"boolean","description":"If false, the object may not have any additional properties.\n\nIf true, the object may have **any** type of additional properties. This is **not** recommended.\n"},{"$ref":"#/components/schemas/JSONSchema","description":"If this is a JSON schema, it describes any additional properties."}]},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaOneOf":{"type":"object","description":"A JSON schema which determines the value must match exactly one of the given schemas.","additionalProperties":false,"required":["oneOf"],"properties":{"oneOf":{"type":"array","description":"The JSON schema must match exactly one of the given schemas.","items":{"$ref":"#/components/schemas/JSONSchema"}},"example":{"description":"An example value which is valid according to this schema."},"default":{"description":"The default value which is used if no value is supplied."},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaRemapper":{"type":"object","description":"A JSON schema which allows a format of remapper without a type.","additionalProperties":false,"required":["format"],"properties":{"format":{"enum":["remapper"],"description":"Allow a remapper definition. This is supported for blocks only."},"default":{"$ref":"#/components/schemas/RemapperDefinition"},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"JSONSchemaRoot":{"type":"object","description":"A top level JSON schema.","additionalProperties":false,"properties":{"definitions":{"description":"This property may be used to store JSON schemas that may be referenced from other places.","additionalProperties":{"$ref":"#/components/schemas/JSONSchema"}},"$schema":{"description":"The JSON schema meta schema. You probably don\u2019t need to specify this explicitly.","enum":["http://json-schema.org/draft-04/schema#","http://json-schema.org/draft-07/schema#"],"default":"http://json-schema.org/draft-07/schema#"},"type":{"enum":["object"],"description":"The type of the JSON schema."},"examples":{"type":"array","items":{"type":"object","description":"An example object which is valid according to this schema.","additionalProperties":true}},"default":{"type":"object","description":"The default value which is used if no value is supplied.","additionalProperties":true},"maxProperties":{"type":"integer","description":"The maximum number of properties the object is allowed to have.","minimum":0},"minProperties":{"type":"integer","description":"The minimum number of properties the object is must have.","minimum":1},"required":{"type":"array","description":"A list of properties that are required.","minItems":1,"items":{"type":"string","description":"A property name which is required on the object."}},"properties":{"type":"object","description":"A mapping of object keys for the object to nested JSON schemas.","additionalProperties":{"$ref":"#/components/schemas/JSONSchema"}},"additionalProperties":{"description":"Describe if this object is allowed to have properties besides those defined in `properties`\n\nIt\u2019s recommended to set this to `false`.\n","example":false,"anyOf":[{"type":"boolean","description":"If false, the object may not have any additional properties.\n\nIf true, the object may have **any** type of additional properties. This is **not** recommended.\n"},{"$ref":"#/components/schemas/JSONSchema","description":"If this is a JSON schema, it describes any additional properties."}]},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}},"required":["type","additionalProperties"]},"JSONSchemaString":{"type":"object","description":"A JSON schema for a string.","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["string"],"description":"The type of the JSON schema. A string is the technical term for a piece of text."},"examples":{"type":"array","items":{"type":"string","description":"An example string which is valid according to this schema."}},"default":{"type":"string","description":"The default value which is used if no value is supplied."},"enum":{"type":"array","description":"If an enum is specified, the type can be safely removed.","items":{"type":"string"}},"const":{"type":"string","description":"If const is specified, the type can be safely removed."},"format":{"enum":["date-time","time","date","duration","email","idn-email","hostname","idn-hostname","ipv4","ipv6","uuid","uri","uri-reference","iri","iri-reference","uri-template","json-pointer","relative-json-pointer","regex","action","binary","event-emitter","event-listener","fontawesome"],"description":"The format values should adhere to."},"minLength":{"type":"integer","description":"The minimum length of the string.","minimum":1},"maxLength":{"type":"integer","description":"The maximum length of the string.\n\nIt\u2019s highly recommended to set this property, even if it\u2019s a big number. For example 5000 characters\nis plenty for most larger input fields. Not doing so may result in extremely large user input, which\nresults in a bad user experience.\n","minimum":1,"example":5000},"pattern":{"type":"string","description":"A regular expression to describe user input.\n\nRegular expressions are a powerful way to enforce proper user input, but the learning curve is high.\nIf you don\u2019t know what this is, we recommend to omit this field for now.\n","minLength":1,"format":"regex"},"multiline":{"type":"boolean","description":"If true, Appsemble renders a textarea in the graphical JSON editor.","default":false},"title":{"type":"string","minLength":1,"maxLength":50,"description":"A short title of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"},"description":{"type":"string","minLength":1,"maxLength":5000,"description":"A description of the instance.\n\nThis is used in various places inside Appsemble Studio.\n"}}},"LinkActionDefinition":{"type":"object","additionalProperties":false,"required":["type","to"],"properties":{"type":{"enum":["link"],"description":"The link action can be used to redirect the user to other pages or absolute URLs."},"to":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"$ref":"#/components/schemas/RemapperDefinition"}],"description":"The name of the page to link to. Subpages can be referred to using arrays. If this matches with an absolute URL, link will open this instead of matching it with a page or subpage."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"LinkBackActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["link.back"],"description":"Link back to the previous page in the browser history."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"LinkNextActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["link.next"],"description":"Link to the next page in the browser history."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"LogActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["log"],"description":"Output the result of the action into the console.\n\nThis is mostly useful for debugging blocks during development.\n"},"level":{"enum":["error","info","warn"],"default":"info","description":"The logging level on which to log."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"LoopPageActionsDefinition":{"type":"object","description":"These actions are fired on a loop page.","required":["onLoad"],"additionalProperties":false,"properties":{"onLoad":{"$ref":"#/components/schemas/ActionDefinition","description":"This action is used to define the data to pass onto the loop type array"},"onFlowCancel":{"$ref":"#/components/schemas/ActionDefinition","description":"This action gets triggered when `flow.cancel` gets called."},"onFlowFinish":{"$ref":"#/components/schemas/ActionDefinition","description":"This action gets triggered when a flow is finished.\n\nA flow is finished when `flow.finish` gets called, or when `flow.next` gets called on the final\nsubpage. This action has a special property in which the cumulative input data from each previous subpage gets sent, instead of the individual block that triggered this action."}}},"LoopPageDefinition":{"type":"object","description":"Generates sub pages dynamically based on data and display in a flow page.","required":["type","foreach","actions","name"],"additionalProperties":false,"properties":{"type":{"enum":["loop"]},"actions":{"$ref":"#/components/schemas/LoopPageActionsDefinition"},"foreach":{"$ref":"#/components/schemas/SubPage"},"progress":{"description":"The method that should be used to display the status of flow pages.","enum":["corner-dots","hidden"]},"retainFlowData":{"type":"boolean","description":"Whether to retain the flow data when navigating away to another page outside the flow.\n\nBy default the flow page retains it's data after navigating once. Set to false to clear it.\n","default":true},"name":{"type":"string","maxLength":50,"description":"The name of an app.\n\nThis field is always required and must be unique within the app, meaning that it is not possible to\nhave two pages with the same name. The name of the page is displayed at the *app bar* of each page as well as in the side navigational menu.\n\n> **Note**: The URL used to navigate to pages is determined by this property.\n"},"hideName":{"type":"boolean","description":"Whether or not the page name should be displayed in the *app bar*."},"navTitle":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the page when displayed in the navigation menu.\n\n  Context property `name` can be used to access the name of the page.\n  "},"hideNavTitle":{"type":"boolean","description":"Whether or not the page should be displayed in navigational menus.\n\n  By default all pages without parameters are added to navigational menus. Set to `true` to hide the\n  page from menus.\n  ","default":false},"navigation":{"$ref":"#/components/schemas/AppLayoutDefinition/properties/navigation","description":"The type of navigation displayed on the page.\n\nThis overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or\nApp navigation are not set.\n\nSet to `bottom` to use a navigation pane at the bottom of the screen instead of the default side\nmenu. Set to `hidden` to display no navigational menus at all.\n"},"icon":{"type":"string","description":"An optional icon from the fontawesome icon set\n\nThis will be displayed in the navigation menu.\n"},"parameters":{"type":"array","description":"Page parameters can be used for linking to a page that should display a single resource.\n\nThis defined as a list of strings representing the properties to pass through. More often than not\npassing `id` through is sufficient, depending on the block.\n","items":{"type":"string","minLength":1,"maxLength":30}},"roles":{"type":"array","description":"The list of roles that are allowed to view this page.\n\nIf the user doesn\u2019t have any of the roles in the list the page will be unavailable to them. An empty\nlist can be used to specify that users need to log in but do not need a specific role.\n\nUsers trying to visit a page without having the correct roles will be redirected to the first page\nthat they are allowed to view. If there aren\u2019t any accessible pages, the user will be logged out and\ninstructed to contact the app owner to get permissions.\n","items":{"type":"string"}},"theme":{"$ref":"#/components/schemas/Theme"},"badgeCount":{"$ref":"#/components/schemas/RemapperDefinition","description":"A Remapper that resolves to a number to be visibile in the side-menu."}}},"MatchActionDefinition":{"type":"object","additionalProperties":false,"required":["type","match"],"properties":{"type":{"enum":["match"],"description":"Run another action if one of the cases is true.\n\nOnly the first case that equals true is called."},"match":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["case","action"],"description":"","properties":{"case":{"$ref":"#/components/schemas/RemapperDefinition","description":"The case to be matched."},"action":{"$ref":"#/components/schemas/ActionDefinition","description":"Action to be called if the case equals true."}}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"MessageActionDefinition":{"type":"object","additionalProperties":false,"required":["type","body"],"properties":{"type":{"enum":["message"],"description":"Display a message to the user.\n\nThis is useful in combination with action chaining to notify users they have performed a certain action.\n"},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"The body of the message."},"color":{"enum":["dark","primary","link","success","info","warning","danger"],"default":"info","description":"The Bulma color to apply to the message."},"layout":{"enum":["bottom","top"],"default":"bottom","description":"The position of the message on the screen."},"dismissable":{"type":"boolean","description":"Boolean value indicating whether the user is able to dismiss the message manually."},"timeout":{"type":"integer","default":5000,"description":"The time in milliseconds how long the message should be visible."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"NoopActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["noop"],"description":"Do nothing when this action is triggered.\n\nThis is the default action for block actions that are not required.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"NotificationHookDataDefinition":{"type":"object","description":"The data used to display the content of the notification.","additionalProperties":true,"minProperties":1,"properties":{"title":{"$ref":"#/components/schemas/RemapperDefinition","description":"The title of the notification."},"content":{"$ref":"#/components/schemas/RemapperDefinition","description":"The body of the notification."},"link":{"type":"string","description":"The URL of the page the user gets redirected to after being clicked.\n\nIf the URL is relative, it will be relative to the app.\n"}}},"NotificationHookDefinition":{"type":"object","description":"The strategy used to notify users.","additionalProperties":false,"minProperties":1,"properties":{"to":{"type":"array","description":"The list of roles to notify.\n\nAside from roles, `$author` can also be used to notify the author of the resource.\n","minItems":1,"items":{"type":"string"}},"subscribe":{"description":"If set, allows users to manually subscribe for notifications for this resource regardless of roles.\n\nThe following values are allowed:\n- `all`: Allows users to be notified about actions on all of the resources of this type.\n- `single`: Allows users to be notified about actions a single instance of a resource of this\n  type.\n- `both`: Allows users to be notified about all resources or a single resource of this type.\n","enum":["all","single","both"]},"data":{"$ref":"#/components/schemas/NotificationHookDataDefinition"}}},"NotifyActionDefinition":{"type":"object","additionalProperties":false,"required":["type","title","body","to"],"properties":{"type":{"enum":["notify"],"description":"Send notifications to one or all the users of an app."},"title":{"$ref":"#/components/schemas/RemapperDefinition","description":"The title of the notification."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"The description of the notification."},"to":{"$ref":"#/components/schemas/RemapperDefinition","description":"To whom the notification should be sent.\n\nUse `all` to send the notification to all app subscribed users.\nOr notify specific users by passing either a single user id or an array of user ids.\n\nNothing is sent if the value is **not** a valid user id.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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"]}}}},"ObjectRemapperDefinition":{"type":"object","description":"An object based remapper is defined by a specific implementation\n\nObject based remappers may only define 1 key. The allowed value depends on the remapper.\n","minProperties":1,"maxProperties":1,"additionalProperties":false,"properties":{"array.map":{"$ref":"#/components/schemas/RemapperDefinition","description":"\nThe remapper goes through the given array and applies the given remappers on each individual item.\nThis can be very handy when sorting arrays by certain data. The remapper always returns an array.\nOutput can be an empty array if the supplied data isn\u2019t an array.\n\nFor example, if you want to sort through a list of people and only get their occupations you can do\nthe following:\n\nInput:\n\n```json\n[\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Delivery driver\"\n  },\n  {\n    \"name\": \"Otto\",\n    \"occupation\": \"Scientist\"\n  },\n  {\n    \"name\": \"Harry\",\n    \"occupation\": \"CEO\"\n  }\n]\n```\n```yaml\narray.map:\n  object.omit:\n    - name\n\n```\nResult:\n\n```json\n[{\"occupation\":\"Delivery driver\"},{\"occupation\":\"Scientist\"},{\"occupation\":\"CEO\"}]\n```\n\n\nAnother great use for `array.map` is to combine it with the `if` remapper and sort your arrays on\nspecific values.\n\nUsing the same input data from the previous example, look at how you can change the code to get\npeople from a specific occupation:\n\n```yaml\n- array.map:\n    if:\n      condition:\n        equals:\n          - prop: occupation\n          - Scientist\n      else: null\n      then:\n        object.from:\n          name:\n            prop: name\n          occupation:\n            prop: occupation\n- null.strip: null\n\n```\nResult:\n\n```json\n[{\"name\":\"Otto\",\"occupation\":\"Scientist\"}]\n```\n\n\nBecause `array.map` returns an array, every item has to return something. This is why we have to\nreturn the full object with the data we want in the `then` section. It\u2019s also why we return `null`.\nThis results in an array consisting of `null` values and objects with actual data in them. To solve\nthis problem, we use the `null.strip` remapper to remove any null values which results in a clean\narray.\n"},"array.unique":{"$ref":"#/components/schemas/RemapperDefinition","description":"\nFilters out unique values from an array. The value Remapper is applied to each entry in the array\nusing its result to determine uniqueness.\n\nIf the value Remapper results in undefined or null, the entire entry is used for uniqueness.\n\nIf the input is not an array, the input is returned without any modifications.\n\nInput:\n\n```json\n[1,1,2,3]\n```\n```yaml\narray.unique: null\n\n```\nResult:\n\n```json\n[1,2,3]\n```\n\n\nYou can also check for more complex values in arrays. The remapper accepts remappers as well, so you\ncan also use entire objects to check for unique values.\n\nFor this example, we have the following extended data with some duplicate values:\n\n```json\n[\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Delivery driver\",\n    \"age\": 19\n  },\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Photographer\",\n    \"age\": 19\n  },\n  {\n    \"name\": \"Otto\",\n    \"occupation\": \"Scientist\",\n    \"age\": 50\n  },\n  {\n    \"name\": \"Harry\",\n    \"occupation\": \"CEO\",\n    \"age\": 20\n  }\n]\n```\n\nWe can be fairly sure in this list of people the first two Peters are the same person but with a\ndifferent occupation. To get more complex unique values from here, we can do the following:\n\n```yaml\narray.unique:\n  object.from:\n    name: { prop: name }\n    age: { prop: age }\n```\n\nThis then checks the array for unique values in both the `name` and `age` fields. The result of this\nremapper is a filtered list:\n\n```json\n[\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Delivery driver\",\n    \"age\": 19\n  },\n  {\n    \"name\": \"Otto\",\n    \"occupation\": \"Scientist\",\n    \"age\": 50\n  },\n  {\n    \"name\": \"Harry\",\n    \"occupation\": \"CEO\",\n    \"age\": 20\n  }\n]\n```\n    "},"array.filter":{"$ref":"#/components/schemas/RemapperDefinition","description":"\nFilters out values based on the input conditions provided.\n\nFor example:\n\nInput:\n\n```json\n[{\"name\":\"Peter\"},{\"name\":\"Louis\"},{\"name\":\"Brian\"}]\n```\n```yaml\narray.filter:\n  equals:\n    - prop: name\n    - Louis\n\n```\nResult:\n\n```json\n[{\"name\":\"Louis\"}]\n```\n\n\nExample of how it can be used to filter a number array.\n\nInput:\n\n```json\n[1,2,1,3,4,1,5]\n```\n\n```yaml\narray.filter:\n  equals:\n    - array: item\n    - 1\n```\n\nResult:\n\n```json\n[1,1,1]\n```\n    "},"array.find":{"$ref":"#/components/schemas/RemapperDefinition","description":"\nReturns a single object or value from an array based on the given condition.\n\nFor example:\n\nInput:\n\n```json\n[{\"name\":\"Craig\"},{\"name\":\"Joey\"},{\"name\":\"Stuart\"}]\n```\n```yaml\narray.find:\n  equals:\n    - prop: name\n    - Craig\n\n```\nResult:\n\n```json\n{\"name\":\"Craig\"}\n```\n\n"},"array.from":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"\nCreates a new array based on a provided array of remappers. This array can also consist of static\nvalues.\n\nFor example:\n\n```yaml\narray.from:\n  - Peter\n  - Otto\n  - Harry\n\n```\nResult:\n\n```json\n[\"Peter\",\"Otto\",\"Harry\"]\n```\n\n\nThis remapper can also be used to convert given data into an array.\n\nInput:\n\n```json\n{\n  \"name\": \"Peter\",\n  \"occupation\": \"Delivery driver\"\n}\n```\n\n```yaml\narray.from:\n  - root: null # Takes the data passed to this remapper, explained more in the 'Data' page\n```\n\nResult:\n\n```json\n[\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Delivery driver\"\n  }\n]\n```\n    "},"array.append":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"\nAppend new values to the end of an array. If the input is not an array an empty array is returned.\n\nUsing the array from the previous example, we can add a new object on top of it using this remapper:\n\n```yaml\narray.append:\n  - object.from:\n      name: James\n      occupation: News reporter\n\n```\nResult:\n\n```json\n[\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Delivery driver\"\n  },\n  {\n    \"name\": \"Otto\",\n    \"occupation\": \"Scientist\"\n  },\n  {\n    \"name\": \"Harry\",\n    \"occupation\": \"CEO\"\n  },\n  {\n    \"name\": \"James\",\n    \"occupation\": \"News reporter\"\n  }\n]\n```\n\n\nExtra example:\n\narray remapper can also be used in combination with different remappers as in the current example comes object remapper:\n\nExample object:\n```json\n{\n  \"names\": [\"Bart\", \"Bas\", \"Sam\"]\n}\n```\n\nCombination of object and array remapper:\n\n```yaml\nobject.assign:\n  names:\n  - { prop: Applicants }\n  - array.append:\n    - Kevin\n```\n\nResult:\n```json\n{\n  \"names\": [\"Bart\", \"Bas\", \"Sam\", \"Kevin\"]\n}\n```\n    "},"array.omit":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"\nRemove values from an array. The input is expected to be the index(es) of the items to be deleted.\nAccepts an array of static or remapper values.\n\nWith the previous example we added a new person to the list of people, so now we can remove that\nperson. We already know the index of this person in the array is `3`, so it\u2019s easy:\n\n```yaml\narray.omit:\n  - 3\n\n```\nResult:\n\n```json\n[\n  {\n    \"name\": \"Peter\",\n    \"occupation\": \"Delivery driver\"\n  },\n  {\n    \"name\": \"Otto\",\n    \"occupation\": \"Scientist\"\n  },\n  {\n    \"name\": \"Harry\",\n    \"occupation\": \"CEO\"\n  }\n]\n```\n\n\nHowever, usually we don\u2019t know the exact index of the item we want to delete. Because the remapper\naccepts remappers as input we can get the desired item\u2019s ID from another source as well. Take the\nfollowing example:\n\nIn this example we assume the data from the previous example is passed to this table block using a\ndata loader\u2019s emitting event called \u201cpeople\u201d. When the user clicks on one of the people in the\ntable, it gets the list of people again. Using the index of this person, and the `array.omit`\nremapper, the person gets removed from the list.\n\n```yaml\ntype: table\nversion: 0.20.38\nevents:\n  listen:\n    data: people\nparameters:\n  fields:\n    - label: Name\n      value: { prop: name }\n      onClick: removePerson\n    - label: Occupation\n      value: { prop: occupation }\nactions:\n  removePerson:\n    type: resource.query\n    resource: citizensNYC\n    remapAfter:\n      array.omit:\n        - context: index # This gets the index of the item in the table, explained more in the 'Data' page.\n    onSuccess:\n      type: resource.update\n      resource: citizensNYC\n```\n    "},"array.flatten":{"$ref":"#/components/schemas/RemapperDefinition","description":"\nFlatten an array. Accepts an array of static or remapper values.\n\nSay for example that each person has some pets. We could get an array of all pets like so:\n\nInput:\n\n```json\n[\n  [\n    \"Milka\",\n    \"Sven\"\n  ],\n  \"Goldie\"\n]\n```\nResult:\n\n```json\n[\"Milka\",\"Sven\",\"Goldie\"]\n```\n\n"},"array.contains":{"$ref":"#/components/schemas/RemapperDefinition","description":"\nChecks if the input array includes the provided item.\nInput:\n\n```json\n[1,2,3,4,5]\n```\n```yaml\narray.contains:\n  static: 6\n\n```\nResult:\n\n```json\nfalse\n```\n\n"},"if":{"type":"object","description":"Check if condition results in a truthy value.\n\nReturns value of `then` if condition is truthy, otherwise it returns the value of `else`.\n\nFor example:\n\nInput:\n\n```json\n{\"guess\":4}\n```\n```yaml\nif:\n  condition:\n    equals:\n      - prop: guess\n      - 4\n  then:\n    static: You guessed right!\n  else:\n    static: You guessed wrong!\n\n```\nResult:\n\n```json\n\"You guessed right!\"\n```\n\n\nInput:\n\n```json\n{\"guess\":5}\n```\nResult:\n\n```json\n\"You guessed wrong!\"\n```\n\n","additionalProperties":false,"required":["condition","then","else"],"properties":{"condition":{"$ref":"#/components/schemas/RemapperDefinition","description":"The condition to check."},"then":{"$ref":"#/components/schemas/RemapperDefinition","description":"This remapper is used if the condition returns true."},"else":{"$ref":"#/components/schemas/RemapperDefinition","description":"This remapper is used if the condition returns false."}}},"equals":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"Compare all computed remapper values against each other.\n\nReturns `true` if all entries are equal, otherwise `false`.\n\nIn the following example, if the `inputValue` and `expectedValue` are of the same value, the\ncondition will return `true` and the `then` remapper will fire.\n\nInput:\n\n```json\n{\"inputValue\":\"example\",\"expectedValue\":\"example\"}\n```\n```yaml\nequals:\n  - prop: inputValue\n  - prop: expectedValue\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"gt":{"type":"array","description":"**(gt = Greater than)**\n\nCompare the first computed remapper value with the second computed remapper value.\n\nReturns `true` if the first entry is greater than the second entry.\n\nFor example, if `stock` is more than 5 here, it returns `true`.\n\nInput:\n\n```json\n{\"stock\":100}\n```\n```yaml\ngt:\n  - prop: stock\n  - 5\n\n```\nResult:\n\n```json\ntrue\n```\n\n","minItems":2,"maxItems":2,"items":{"$ref":"#/components/schemas/RemapperDefinition"}},"lt":{"type":"array","description":"**(lt = Lesser than)\n\nCompare the first computed remapper value with the second computed remapper value.\n\nReturns `true` if the first entry is lesser than the second entry.\n\nFor example, if `stock` is less than 5 here, it returns `true`.\n\nInput:\n\n```json\n{\"stock\":100}\n```\n```yaml\ngt:\n  - prop: stock\n  - 5\n\n```\nResult:\n\n```json\ntrue\n```\n\n","minItems":2,"maxItems":2,"items":{"$ref":"#/components/schemas/RemapperDefinition"}},"not":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"Compare all computed remapper values against the first.\n\nReturns `false` if all entries are equal to the first entry, otherwise `true`.\n\nIf only one remapper or none is passed, the remapper value gets computed and then inverted.\n\nIf `number` in the following example is something other than 4, the condition returns `true`.\n\nInput:\n\n```json\n{\"number\":3}\n```\n```yaml\nnot:\n  - prop: number\n  - 4\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"match":{"type":"array","description":"Check if any case results in a truthy value.\n\nReturns the value of the first case where the condition equals true, otherwise returns null.\n\nIn the following example, let's say the `Gem` is a \"Ruby\". The match remapper then returns\n`value: 75`.\n\nInput:\n\n```json\n{\"Gem\":\"Ruby\"}\n```\n```yaml\nmatch:\n  - case:\n      equals:\n        - prop: Gem\n        - Diamond\n    value: 100\n  - case:\n      equals:\n        - prop: Gem\n        - Ruby\n    value: 75\n  - case:\n      equals:\n        - prop: Gem\n        - Gold\n    value: 50\n  - case:\n      equals:\n        - prop: Gem\n        - Sapphire\n    value: 25\n    result: {}\n\n```\nResult:\n\n```json\n75\n```\n\n","items":{"type":"object","additionalProperties":false,"required":["case","value"],"description":"","properties":{"case":{"$ref":"#/components/schemas/RemapperDefinition","description":"The condition to check."},"value":{"$ref":"#/components/schemas/RemapperDefinition","description":"This remapper is used if the case is true"}}}},"and":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"Compare all computed remapper values against each other.\n\nReturns `true` if all entries are equal to `true`, otherwise `false`.\n\nIf only one remapper or none is passed, the remapper value gets computed.\n\nInput:\n\n```json\n{\"foo\":true}\n```\n```yaml\nand:\n  - prop: foo\n  - true\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"or":{"type":"array","items":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"Compare all computed remapper values against each other.\n\nReturns `false` if all entries are equal to `false`, otherwise `true`.\n\nIf only one remapper or none is passed, the remapper value gets computed.\n\nInput:\n\n```json\n{\"foo\":true}\n```\n```yaml\nor:\n  - prop: foo\n  - false\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"defined":{"$ref":"#/components/schemas/RemapperDefinition","description":"Check if a value is defined. Returns `true` if defined, `false` if not.\n\nConsiders falsy values like `0`, `\"\"` and `false` as defined.\n\nThe `null` and `undefined` values are considered as not defined.\n\nInput:\n\n```json\n[0,\"\",false,null,null]\n```\n```yaml\narray.map:\n  defined:\n    array: item\n\n```\nResult:\n\n```json\n[true,true,true,false,false]\n```\n\n"},"variable":{"type":"string","description":"Get a predefined app variable by name\n\nFor example:\n\n```yaml\nvariable: MY_VARIABLE\n\n```\nResult:\n\n```json\n\"variable value\"\n```\n\n"},"array":{"enum":["index","length","item","prevItem","nextItem"],"description":"Get the current array.map\u2019s index, length, the current item, previous item or next item.\n\nReturns nothing when not in the context of `array.map\u2019s`.\n\nFor example:\n\nInput:\n\n```json\n[\"a\",\"b\",\"c\"]\n```\n```yaml\narray.map:\n  object.from:\n    index:\n      array: index\n    length:\n      array: length\n    item:\n      array: item\n    prevItem:\n      array: prevItem\n    nextItem:\n      array: nextItem\n\n```\nResult:\n\n```json\n[\n  {\n    \"index\": 0,\n    \"length\": 3,\n    \"item\": \"a\",\n    \"nextItem\": \"b\"\n  },\n  {\n    \"index\": 1,\n    \"length\": 3,\n    \"item\": \"b\",\n    \"prevItem\": \"a\",\n    \"nextItem\": \"c\"\n  },\n  {\n    \"index\": 2,\n    \"length\": 3,\n    \"item\": \"c\",\n    \"prevItem\": \"b\"\n  }\n]\n```\n\n"},"app":{"enum":["id","locale","url"],"description":"Gives information about the current app. Using this remapper you can get access to the\nfollowing information:\n\n- `id`: App ID\n- `locale`: Current locale (user selected language) of the app\n- `url`: Base URL of the app\n\nExample:\n\n```yaml\napp: url\n\n```\nResult:\n\n```json\n\"https://example-app.example-organization.example.com\"\n```\n\n"},"context":{"type":"string","description":"Gets a property from custom context passed by blocks. This property is specific to each block. To\nunderstand what the context of a certain block does, check the block\u2019s description.\n\nFor this example, we will take the [`table`](/blocks/@appsemble/table/0.20.39) block. As of now,\nthis block provides two options for context: `index` and `repeatedIndex`. Whenever you click on an\nitem in the table, it gives the index of that table row in the associated action.\n\nSo with the following example:\n\n```yaml\ntype: table\nversion: 0.20.39\nevents:\n  listen:\n    data: contextData\nparameters:\n  fields:\n    - label: Name\n      value: { prop: name }\n      onClick: clickName\n    - label: Age\n      value: { prop: age }\nactions:\n  clickName:\n    remapBefore:\n      context: index\n    type: log\n```\n\nClicking on the first item would log `0`, the second item `1` and so on.\n"},"history":{"type":"integer","description":"> **Note:** This remapper is explained more in depth in the [History](/docs/remappers/history) page\n\nGives the data at the history entry at the specified history index. The history at specified index\nis the data that is passed to that action.\n\n```yaml\nremapBefore:\n  object.from:\n    title: Most influential bands of all time\n    content: ...\ntype: noop # history 0\nonSuccess:\n  type: resource.query # history 1\n  resource: people\n  onSuccess:\n    type: noop # history 2\n    onSuccess:\n      remapBefore:\n        history: 1\n      type: log # history 3\n```\n\nResult:\n\n```json\n{\n  \"title\": \"Most influential bands of all time\",\n  \"content\": ...\n}\n```\n    "},"tab.name":{"enum":[null],"description":"\n\nReturns the name of the current tab in a `tabs` page.\n\n```yaml\nname: Example Page A\ntype: tabs\n  tabs:\n    - name: Tab2\n      blocks:\n        - type: action-button\n          version: \"0.27.12\"\n          parameters:\n            icon: chevron-right\n          actions:\n            onClick:\n              type: log\n              remapBefore:\n                { tab.name: null }\n```\n    "},"step":{"type":"string","description":"\n\nWhile in a loop page, this remapper allows you to get properties from the data at the current index.\n\n```yaml\nname: Survey\ntype: loop\nactions:\n  onLoad:\n    type: resource.query\n    resource: questions\nforeach:\n  blocks:\n    - type: detail-viewer\n      version: 0.20.39\n      parameters:\n        fields:\n          - label: { step: title }\n```\n\nWith this example, we load an array of questions that have the `title` property. What the `step`\nremapper does in this case is show the title of the current question in the loop.\n\nThe result of this is a flow page where each page shows the question\u2019s title.\n\n"},"page":{"enum":["data","url"],"description":"Gives actual information about the current page. This remapper gives access to the following\ninformation:\n\n- `data`: Current page data (FlowPage)\n- `url`: Full URL of the current page\n\nExample:\n\n```json\n{\n  \"data\": {\n    \"name\": \"Peter\"\n  },\n  \"url\": \"https://example-app.examplecompany.appsemble.app/en/example-page-a\"\n}\n```\n\nThe page data only works in the context of a flow page. Let\u2019s say you have a\n[\u201cFlowPage\u201d](/docs/reference/app#-flow-page-definition) type with multiple subpages. Whenever you\nnavigate to the next page it adds the data from that page to the flow page\u2019s data. The page remapper\nallows you to access this cumulative data.\n\nThe following page definition shows a page definition for a flow page where the user has to fill in\nsome user information. For each subpage the result of `page: data` is shown.\n\n\n```yaml\nname: PageDataFlow\ntype: flow\nsteps:\n  # page: data = {}\n  - blocks:\n      - type: form\n        version: 0.20.39\n        parameters:\n          fields:\n            - name: name\n              type: string\n        actions:\n          onSubmit:\n            type: flow.next\n  # page: data = { name: \"Peter\" }\n  - blocks:\n      - type: form\n        version: 0.20.39\n        parameters:\n          fields:\n            - name: age\n              type: string\n        actions:\n          onSubmit:\n            type: flow.next\n  # page: data = { name: \"Peter\", age: \"47\" }\n  - blocks:\n      - type: data-loader\n        version: 0.20.39\n        actions:\n          onLoad:\n            remapBefore:\n              page: data\n            type: log\n```\n\nThe result of the final page\u2019s log would then be:\n\n```json\n{\n  \"name\": \"Peter\",\n  \"age\": \"47\"\n}\n```\n\n"},"prop":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"array","minItems":1,"items":{"anyOf":[{"type":"string"},{"type":"integer"}]}},{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/ObjectRemapperDefinition"}},{"$ref":"#/components/schemas/ObjectRemapperDefinition"}],"description":"Gets the chosen property from an object.\n\nInput:\n\n```json\n{\"age\":52,\"name\":\"John\"}\n```\n```yaml\nprop: name\n\n```\nResult:\n\n```json\n\"John\"\n```\n\n"},"len":{"enum":[null],"description":"\nReturns the length of an input array or an input string, unlike { array: length } remapper this remapper does not require\nan array to be in the context. This can be very useful when working with nested arrays.\nInput:\n\n```json\n\"string\"\n```\n```yaml\nlen: null\n\n```\nResult:\n\n```json\n6\n```\n\n"},"root":{"enum":[null],"description":"Gets the input data as it was initially passed to the remapper function.\n\n```yaml\ntype: resource.query\nresource: people\nquery:\n  object.from:\n    $filter: city eq 'Eindhoven'\nonSuccess:\n  remapBefore:\n    object.from:\n      name: Residents of Eindhoven\n      people:\n        root: null\n```\n\nResult:\n\n```json\n{\n  \"name\": \"Residents of Eindhoven\",\n  \"people\": [\n    {\n      \"name\": ...,\n      \"city\": \"Eindhoven\"\n    },\n    ...\n  ]\n}\n```\n    "},"static":{"description":"Create a static value\n\n```yaml\nstatic: Hello!\n\n```\nResult:\n\n```json\n\"Hello!\"\n```\n\n"},"translate":{"$ref":"#/components/schemas/RemapperDefinition","description":"> **Note:** This is explained much more in depth at [Translating](/docs/guides/translating)\n\nThis remapper allows you to easily add translations to your app. To make this remapper work, replace\nany static text with `translate: {name}`. Then, in your app\u2019s Translations page pick the language\nyou want to translate. You will see a list of names with input text below. Translations you manually\nput in the app using the `translate` remapper are found under \u201cCustom messages\u201d.\n\nAfter putting the translation in, any user that logs in with that language selected will see the\ntranslated message.\n\nExample:\n\n```yaml\ntype: detail-viewer\nversion: 0.20.39\nparameters:\n  fields:\n    - label: { translate: weatherTitle }\n      value: { translate: weatherBody }\n```\n\n"},"app.member":{"enum":["sub","name","email","email_verified","picture","locale","zoneinfo","role","properties"],"description":"\n> **Note:** For this remapper to work, the app member that activated the remapper has to be logged in to\n> the app\n\nProvides some fields of app member information taken from the OpenID user info. These fields are:\n\n- `sub`: The app member\u2019s identifier\n- `name`: The app member\u2019s name\n- `email`: The app member\u2019s **primary** email address\n- `email_verified`: Whether the app member\u2019s primary email address is verified or not (`boolean`)\n- `picture`: Full URL to the app member\u2019s profile picture web address\n- `locale`: The app member\u2019s default language [`BCP47`](https://en.wikipedia.org/wiki/IETF_language_tag)\n  language tag (ex. `en`) (Broken)\n- `zoneinfo`: The app member\u2019s timezone\n- `role`: The role of the app member in the app\n- `properties`: Custom properties defined on the app member\n\nExample:\n\n```json\n{\n  \"email\": \"example@hotmail.nl\",\n  \"email_verified\": true,\n  \"locale\": \"en\",\n  \"name\": \"Test User\",\n  \"picture\": \"https://www.gravatar.com/avatar/f46b82357ce29bcd1099915946cda468?s=128&d=mp\",\n  \"sub\": \"5c6270e2-ad31-414f-bcab-6752a2c4dcfd\",\n  \"properties\": {}\n}\n```\n    "},"container":{"type":"string","description":"\n> **Note:** For this remapper to work, the application needs to define a companion container.\n\nThis remapper provides a short way to access a companion container for the purpose of making http requests.\nWhen using the 'request' action, the url can be provided by using the 'container' remapper, and providing a string.\nThe string should contain the name of the companion container, followed by the API endpoint path.\n\nExample:\n```yaml\n    type: request\n    url: { container: my-container/api/endpoint }\n    proxy: true\n    method: get\n```\n    "},"slice":{"description":"Extract characters from a string, or items from an array\naccepts either an array of two numbers (indexes of starting point and ending point)\nor a number (index of the starting point).\nstartIndex is inclusive whereas the endIndex is not.\nInput:\n\n```json\n\"Laziness\"\n```\n```yaml\nslice:\n  - 3\n  - 6\n\n```\nResult:\n\n```json\n\"ine\"\n```\n","oneOf":[{"type":"array","items":{"type":"number"}},{"type":"number"}]},"date.add":{"type":"string","description":"Adds a specified date value to the provided date.\n\nThe value to add should be specified according to the\n[parse-duration](https://www.npmjs.com/package/parse-duration) API. If you want to add a day to a\ndate for example, the syntax would be `date.add: 1d`.\n\nFull list of supported unit types:\n- nanoseconds (ns)\n- microseconds (\u03bcs)\n- milliseconds (ms)\n- seconds (s, sec)\n- minutes (m, min)\n- hours (h, hr)\n- days (d)\n- weeks (w, wk)\n- months\n- years (y, yr)\n\nFor example:\n\nInput:\n\n```json\n\"2023-06-30T14:50:19.601Z\"\n```\n```yaml\n- date.now: null\n- date.add: 1w\n- date.format: null\n\n```\nResult:\n\n```json\n\"2023-07-07T14:50:19.601Z\"\n```\n\n"},"date.format":{"oneOf":[{"enum":[null]},{"type":"string"}],"description":"Format a date according to the RFC3339 format.\n\nHere is an example of a RFC3339 complicit date:\n`2002-10-02T15:00:00Z`\n\nIn an app definition, it\u2019s best to use this when you want to display a date in a specific format.\nFor example, if your app has a form with a Datepicker field the incoming data will be formatted\nas a simple date format. If you want to format it to the RFC3339 format, you can use this remapper.\n\nWhen you submit a form with a DateField, the internal output looks like the following. You can then format the date so that it uses the RFC3339 format.\n\nInput:\n\n```json\n\"2023-07-03\"\n```\n```yaml\ndate.format: null\n\n```\nResult:\n\n```json\n\"2023-07-02T22:00:00.000Z\"\n```\n\n\nThe remapper can also be used to format a date or timestamp using a custom format.\n\n```js\n\"2023-07-02T22:00:00.000Z\"\n```\n\nYou can then format the date with any supported pattern, please refer to https://date-fns.org/docs/format for the supported patterns.\n\n```yaml\ndate.format: yyyy-MM-dd\n```\n\nResult:\n```js\n2023-07-03\n```\n"},"date.now":{"enum":[null],"description":"Returns the current date as a JavaScript Date object.\n\n```yaml\ndate.now: null\n\n```\nResult:\n\n```json\n\"Mon Jul 03 2023 11:47:18 GMT+0200 (Midden-Europese zomertijd)\"\n```\n\n"},"date.parse":{"type":"string","description":"Convert a string to a date using a given format.\n\nFor example:\n\n```yaml\ndate.parse: MM/dd/yyyy\n\n```\nResult:\n\n```json\n\"Tue Feb 11 2014 00:00:00\"\n```\n\n\nSee [date-fns](https://date-fns.org/v2.29.3/docs/parse) for the supported formats.\n\nLeaving the format empty will try to parse the date using the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.\nFor example:\n```yaml\ndate.parse:\n- static: 2014-02-11T11:30:30 # The date string to parse\n- date.parse: ''              # The given format to parse the date with\n                      # => Tue Feb 11 2014 11:30:30\n```\n"},"from.history":{"type":"object","required":["index","props"],"description":"Creates a new object based on the specified properties in the given history index. This can be very\nuseful when you want to combine two sources of data together. It\u2019s also cleaner than separately\nusing `object.from` together with `history`.\n\nIn the following example, you can see why this might be handy. Let\u2019s say you get the details about a\nconcert from a source like an action or a block. You have this information and then you want to get\nsome additional data like the attendees of the concert. With `from.history` you can combine the\nolder data like the name and date, and add the new `attendees` data. The result will be an object\nwith this combined data.\n\nHistory index 1:\n\n```json\n{\n  \"name\": \"Rolling stones at Amsterdam Arena\",\n  \"artist\": \"Rolling Stones\",\n  \"location\": \"Amsterdam Arena\",\n  \"date\": \"07-07-2022\",\n  \"price\": 120\n}\n```\n\nInput:\n\n```json\n[ .. ]\n```\n\n```yaml\nobject.from:\n  concertDetails:\n    from.history:\n      index: 1\n      props:\n        name: { prop: name }\n        date: { prop: date }\n        attendees: { root: null }\n```\n\nResult:\n\n```json\n{\n  \"concertDetails\": {\n    \"attendees\": [ .. ],\n    \"date\": \"07-07-2022\",\n    \"name\": \"Rolling stones at Amsterdam Arena\"\n  }\n}\n```\n","additionalProperties":false,"properties":{"index":{"type":"integer","description":"The index of the history stack item to assign.\n\n0 is the index of the first item in the history stack.\n"},"props":{"description":"Predefined mapper keys to choose what properties to apply.","additionalProperties":{"$ref":"#/components/schemas/RemapperDefinition"}}}},"assign.history":{"type":"object","required":["index","props"],"description":"Assigns properties from the specified history stack index to an existing object.\nSimilarly to the `from.history` remapper, this allows you to get a property from a place in the\nhistory and give it to a new object. The only difference here is that you are not creating an\nentirely new object, but you are taking an existing object and assigning new values to it.\n\nSo, we can take the example from `from.history` and flip it.\n\nHistory index 1:\n\n```json\n{\n  \"peopleAmount\": 3000\n}\n```\n\nInput:\n\n```json\n{\n  \"name\": \"Rolling stones at Amsterdam Arena\",\n  \"artist\": \"Rolling Stones\",\n  \"location\": \"Amsterdam Arena\",\n  \"date\": \"07-07-2022\",\n  \"price\": 120\n}\n```\n\n```yaml\nobject.from:\n  concertDetails:\n    assign.history:\n      index: 1\n      props:\n        attendees: { prop: peopleAmount }\n```\n\nResult:\n\n```json\n{\n  \"concertDetails\": {\n    \"name\": \"Rolling stones at Amsterdam Arena\",\n    \"artist\": \"Rolling Stones\",\n    \"location\": \"Amsterdam Arena\",\n    \"date\": \"07-07-2022\",\n    \"price\": 120,\n    \"attendees\": 3000\n  }\n}\n```\n","additionalProperties":false,"properties":{"index":{"type":"integer","description":"The index of the history stack item to assign.\n\n0 is the index of the first item in the history stack.\n"},"props":{"description":"Predefined mapper keys to choose what properties to assign.","additionalProperties":{"$ref":"#/components/schemas/RemapperDefinition"}}}},"omit.history":{"type":"object","required":["index","keys"],"description":"Assigns properties from the specified history stack index to the current value and excludes the\ngiven properties.\n\nSimilarly to the other history remappers, this gives you the data from a certain point in the\nhistory stack and allows you to modify it before adding to the current value. This one, however,\nallows you to take the complete specified history data and omit certain values.\n\nThis remapper can be extremely helpful for re-using data you got before in the history stack while\nfiltering certain properties.\n\nFor example, let\u2019s say you have the information for a concert but don\u2019t want normal users to see\nsensitive data about it. Using `omit.history` you can take this concert data but exclude the\nsensitive parts.\n\nHistory index 1:\n\n```json\n{\n  \"name\": \"Rolling stones at Amsterdam Arena\",\n  \"artist\": \"Rolling Stones\",\n  \"location\": \"Amsterdam Arena\",\n  \"date\": \"07-07-2022\",\n  \"bandPasswords\": [ .. ],\n  \"bankDetailsAttendees\": [ .. ]\n}\n```\n\nInput:\n\n```json\n[ .. ]\n```\n\n```yaml\nobject.from:\n  concertDetails:\n    omit.history:\n      index: 1\n      keys:\n        - bandPasswords\n        - bankDetailsAttendees\n```\n\nResult:\n\n```json\n{\n  \"concertDetails\": {\n    \"name\": \"Rolling stones at Amsterdam Arena\",\n    \"artist\": \"Rolling Stones\",\n    \"location\": \"Amsterdam Arena\",\n    \"date\": \"07-07-2022\",\n    \"attendees\": [ .. ]\n  }\n}\n```\n","additionalProperties":false,"properties":{"index":{"type":"integer","description":"The index of the history stack item to assign.\n\n0 is the index of the first item in the history stack.\n"},"keys":{"description":"Exclude properties from the history stack item, based on the given object keys.\n\nNested properties can be excluded using arrays of keys.\n\nFor example:\n```yaml\nomit.history:\n  index: 0\n  keys:\n    - foo   # Excludes the property foo\n    - - bar # Excludes the property baz inside of bar\n      - baz\n```\n","type":"array","items":{"minItems":1,"anyOf":[{"type":"string"},{"type":"array","minItems":2,"items":{"type":"string"}}]}}}},"number.parse":{"anyOf":[{"enum":[null]},{"type":"string"},{"$ref":"#/components/schemas/ArrayRemapperDefinition"},{"$ref":"#/components/schemas/ObjectRemapperDefinition"}],"description":"Convert a string into a number.\n\nIf there is no remapper passed and the input can be converted, this will return the converted input.\n\nIf there is no remapper passed and the input is null, this will return 0.\n\nIf there is no remapper passed and the input cannot be converted, this will return the input.\n\nIf there is a remapper passed and the remapped value can be converted, this will return the converted remapped value.\n\nIf there is a remapper passed and the remapped value is null, this will return 0.\n\nIf there is a remapper passed and the remapped value cannot be converted, this will return the remapped value.\n\nFor example:\n\nInput:\n\n```json\n\"42\"\n```\n```yaml\nnumber.parse: null\n\n```\nResult:\n\n```json\n42\n```\n\n"},"object.assign":{"additionalProperties":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"\n\nLet\u2019s say you have an existing object that you want to add an additional value on top of. For this\nyou can use the `object.assign` remapper. The remapper takes an existing object and allows the user\nto assign their own value on top of that.\n\nInput:\n\n```json\n{\"title\":\"Weekly fishing 21\"}\n```\n```yaml\nobject.assign:\n  author: John Doe\n\n```\nResult:\n\n```json\n{\"author\":\"John Doe\",\"title\":\"Weekly fishing 21\"}\n```\n\n\n"},"object.from":{"additionalProperties":{"$ref":"#/components/schemas/RemapperDefinition"},"description":"\n\nWith this remapper you can create an entirely new object based on input values and other remappers.\n`object.from` itself accepts remapper functions as its input which allows you to chain multiple\nremappers together to make complex objects.\n\nAs a base, the remapper looks like this:\n\n```yaml\nobject.from:\n  email: example@hotmail.com\n  username: Chris Taub\n\n```\nResult:\n\n```json\n{\"email\":\"example@hotmail.com\",\"username\":\"Chris Taub\"}\n```\n\n\nMost of the time you won\u2019t create an object just to store one value. Luckily, this is where the\nchaining of remappers comes in. You can create an object that contains an `object.from` remapper\nwhich then allows more inputs:\n\n```yaml\nobject.from:\n  username: Chris Taub\n  email: example@hotmail.com\n  addresses:\n    object.from:\n      work:\n        object.from:\n          city: Eindhoven\n          address: Nachtegaallaan 15\n      home:\n        object.from:\n          city: Amsterdam\n          address: Amstel 1\n```\n\n```json\n{\n  \"username\": \"Chris Taub\",\n  \"email\": \"example@hotmail.com\",\n  \"addresses\": {\n    \"work\": {\n      \"city\": \"Eindhoven\",\n      \"address\": \"Nachtegaallaan 15\"\n    },\n    \"home\": {\n      \"city\": \"Amsterdam\",\n      \"address\": \"Amstel 1\"\n    }\n  }\n}\n```\n\n"},"object.omit":{"type":"array","items":{"minItems":1,"anyOf":[{"type":"string"},{"type":"array","minItems":2,"items":{"type":"string"}}]},"description":"\n\nIn contrary to the previous remapper, what if you have an object from which you want to remove a\nvalue? Then you can use `object.omit`. The remapper can remove properties from an existing object\nbased on the given object keys. This includes nested properties.\n\nInput:\n\n```json\n{\n  \"author\": \"John Doe\",\n  \"content\": {\n    \"interview\": \"...\",\n    \"introduction\": \"This is the introduction for the new weekly fishing issue\",\n    \"paragraph1\": \"...\"\n  },\n  \"title\": \"Weekly fishing 21\"\n}\n```\n```yaml\nobject.omit:\n  - author\n  - - content\n    - interview\n\n```\nResult:\n\n```json\n{\n  \"content\": {\n    \"introduction\": \"This is the introduction for the new weekly fishing issue\",\n    \"paragraph1\": \"...\"\n  },\n  \"title\": \"Weekly fishing 21\"\n}\n```\n\n"},"object.compare":{"type":"array","items":{"minItems":2,"maxItems":2,"$ref":"#/components/schemas/RemapperDefinition"},"description":"\n\nThis remapper allows you to compare two objects and get differences in their key-value pairs like in the following example:\n\nInput:\n\n```json\n{\n  \"name\": \"Alice\"\n}\n```\n```yaml\nobject.compare:\n  - object.from:\n      name:\n        prop: name\n      age: 25\n      address:\n        object.from:\n          city: Paris\n          zip: 7500\n      favoriteColors:\n        array.from:\n          - blue\n          - green\n  - object.from:\n      name: Alice\n      age: 26\n      address:\n        object.from:\n          city: Lyon\n          country: France\n      favoriteColors:\n        array.from:\n          - red\n          - green\n          - blue\n\n```\nResult:\n\n```json\n[\n  {\n    \"path\": [\n      \"age\"\n    ],\n    \"type\": \"changed\",\n    \"from\": 25,\n    \"to\": 26\n  },\n  {\n    \"path\": [\n      \"favoriteColors\"\n    ],\n    \"type\": \"changed\",\n    \"from\": [\n      \"blue\",\n      \"green\"\n    ],\n    \"to\": [\n      \"red\",\n      \"green\",\n      \"blue\"\n    ]\n  },\n  {\n    \"path\": [\n      \"address\",\n      \"city\"\n    ],\n    \"type\": \"changed\",\n    \"from\": \"Paris\",\n    \"to\": \"Lyon\"\n  },\n  {\n    \"path\": [\n      \"address\",\n      \"zip\"\n    ],\n    \"type\": \"removed\",\n    \"value\": 7500\n  },\n  {\n    \"path\": [\n      \"address\",\n      \"country\"\n    ],\n    \"type\": \"added\",\n    \"value\": \"France\"\n  }\n]\n```\n\n"},"object.explode":{"type":"string","description":"\n\nTakes an object with an array property and transforms it into an array of objects.\n\nEach object in the resulting array contains all the entries of the original object\nplus all the entries of the corresponding array item from the array property.\n\nIf one of the items in the array contains a key, which exists in the original object\nit will overwrite the original key.\n\nNested arrays or objects are not exploded.\n\nExample:\nInput:\n\n```json\n{\n  \"ownerName\": \"John\",\n  \"country\": \"USA\",\n  \"pets\": [\n    {\n      \"name\": \"Milka\"\n    },\n    {\n      \"name\": \"Sven\",\n      \"country\": \"Sweden\"\n    },\n    {\n      \"name\": \"Tom\",\n      \"likes\": [\n        \"mice\",\n        \"fish\"\n      ]\n    },\n    {\n      \"name\": \"Jerry\",\n      \"looks\": {\n        \"color\": \"brown\"\n      }\n    }\n  ]\n}\n```\n```yaml\nobject.explode: pets\n\n```\nResult:\n\n```json\n[\n  {\n    \"ownerName\": \"John\",\n    \"name\": \"Milka\",\n    \"country\": \"USA\"\n  },\n  {\n    \"ownerName\": \"John\",\n    \"name\": \"Sven\",\n    \"country\": \"Sweden\"\n  },\n  {\n    \"ownerName\": \"John\",\n    \"name\": \"Tom\",\n    \"country\": \"USA\",\n    \"likes\": [\n      \"mice\",\n      \"fish\"\n    ]\n  },\n  {\n    \"ownerName\": \"John\",\n    \"name\": \"Jerry\",\n    \"country\": \"USA\",\n    \"looks\": {\n      \"color\": \"brown\"\n    }\n  }\n]\n```\n\n"},"filter.from":{"additionalProperties":{"$ref":"#/components/schemas/FilterParametersDefinition"},"description":"\n\nWith this remapper you can generate an OData filter, ready to be passed to the `$filter` key in\nresource queries.\n\nThe different comparator options are as follows:\n\n- eq - Equal to\n- ne - Not equal to\n- lt - Less than\n- gt - Greater than\n- le - Less than or equal to\n- ge - Greater than or equal to\n\nThe most common types of values are `String`, `Number`, `Boolean` and `Date`. If you need a more specific\ntype, please refer to [the OData spec](https://www.odata.org/documentation/odata-version-2-0/overview/).\n\nAs a base, the remapper looks like this:\n\nInput:\n\n```json\n{\"exclude\":\"Peter\"}\n```\n```yaml\nfilter.from:\n  name:\n    type: String\n    comparator: ne\n    value:\n      prop: exclude\n  age:\n    type: Number\n    comparator: lt\n    value: 10\n  height:\n    type: Number\n    comparator: le\n    value: 1.75\n  heightString:\n    type: Number\n    comparator: le\n    value: \"1.75\"\n  birthday:\n    type: Date\n    comparator: ge\n    value: 2000-01-01\n  friendsSince:\n    type: Date\n    comparator: ge\n    value: 2014-01-01T00:00:00Z\n  job:\n    type: String\n    comparator: eq\n    value: null\n  employed:\n    type: Boolean\n    comparator: eq\n    value: false\n  id:\n    type: Guid\n    comparator: eq\n    value: 03a0a47b-e3a2-e311-9402-00155d104c24\n  undefined:\n    type: String\n    comparator: eq\n  special:\n    type: String\n    comparator: eq\n    value: Special character's \"test\" \\%&+?^/\n\n```\nResult:\n\n```json\n\"name ne 'Peter' and age lt 10 and height le 1.75 and heightString le 1.75 and birthday ge 2000-01-01 and friendsSince ge 2014-01-01T00:00:00Z and job eq null and employed eq false and id eq 03a0a47b-e3a2-e311-9402-00155d104c24 and undefined eq null and special eq 'Special character''s \\\"test\\\" \\\\\\\\%&+?^/'\"\n```\n\n\nHere is an example of how you can use the remapper in an app definition:\n\n```yaml\ntype: resource.query\n  resource: myResource\n  query:\n    object.from:\n      $filter:\n        filter.from:\n          name:\n            type: String\n            comparator: ne\n            value: { prop: exclude }\n          age:\n            type: Int64\n            comparator: lt\n            value: 10\n          birthday:\n            type: Date\n            comparator: ge\n            value: '2000-01-01'\n          job:\n            type: String\n            comparator: eq\n            value: null\n          employed:\n            type: Boolean\n            comparator: eq\n            value: false\n          special:\n            type: String\n            comparator: eq\n            value: \"Special character's test\"\n```\n"},"order.from":{"additionalProperties":{"enum":["asc","desc"]},"description":"\n\nWith this remapper you can generate an OData order, ready to be passed to the `$orderby` key in\nresource queries.\n\nThe different order options are as follows:\n\n- asc - Ascending\n- desc - Descending\n\n```yaml\norder.from:\n  name: asc\n  age: desc\n\n```\nResult:\n\n```json\n\"name asc,age desc\"\n```\n\n\nHere is an example of how you can use the remapper in an app definition:\n\n```yaml\ntype: resource.query\n  resource: myResource\n  query:\n    object.from:\n      $orderby:\n        order.from:\n          name: asc\n          age: desc\n```\n"},"random.choice":{"enum":[null],"description":"Pick and return a random entry from an array. If the input is not an array, the input is returned as-is.\nFor example:\n\nIf you input the following array:\n```json\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n```\n\n```yaml\nrandom.choice: null\n```\n\nThe result could return any one of these numbers.\n\nYou can also combine different data types in this array and have it work in the same way. If mixed in\nstrings, the result could be either one of the provided numbers or one of the provided strings.\n\n```json\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, \"Peter\", \"Patrick\", \"Michael\", \"Harry\"]\n```\n"},"random.integer":{"type":"array","maxItems":2,"minItems":2,"items":{"type":"integer"},"description":"Pick and return a random integer between the provided lowest and highest values.\nFor example:\n```yaml\nrandom.integer:\n  - 0\n  - 1000\n```\n\nReturns a random integer between 0 and 1000.\n"},"random.float":{"type":"array","maxItems":2,"minItems":2,"items":{"type":"number"},"description":"Pick and return a random float value between the provided lowest and highest values.\nFor example:\n```yaml\nrandom.float:\n  - 0\n  - 1\n```\n\nReturns a random float value between 0 and 1.\n"},"random.string":{"type":"object","required":["choice","length"],"additionalProperties":false,"properties":{"choice":{"type":"string","minLength":1},"length":{"type":"integer","minimum":1}},"description":"Pick and return a random string from a given length using characters from a given input string defined in `choice`.\nFor example:\n```yaml\nrandom.string:\n  choice: abcdefghijklmnopqrstuvwxyz0123456789\n  length: 6\n```\n\nReturns a randomized string that is 6 characters long and consists of any characters in the `choice` field, like: `g8ajss9`.\n"},"string.case":{"enum":["lower","upper"],"description":"Convert a string to upper or lower case.\n\nInput:\n\n```json\n\"Patrick\"\n```\n```yaml\nstring.case: upper\n\n```\nResult:\n\n```json\n\"PATRICK\"\n```\n\n"},"string.startsWith":{"type":"string","description":"Check if the initial characters of the string matches with the input string,\nthis remapper is case-sensitive.\nInput:\n\n```json\n\"Random string here\"\n```\n```yaml\nstring.startsWith: Random\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"string.endsWith":{"oneOf":[{"type":"string"},{"type":"object","description":"Alternative way to define input to facilitate the case-insensitive matching","required":["substring"],"additionalProperties":false,"properties":{"substring":{"type":"string"},"strict":{"type":"boolean"}}}],"description":"Check if the last characters of the string matches with the input string,\nthis remapper is case-sensitive unless specified explicitly,\nTo make the remapper ignore casing of the input and passed string, use the following example\nInput:\n\n```json\n\"Random string here\"\n```\n```yaml\nstring.endsWith:\n  substring: Here\n  strict: false\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"string.format":{"type":"object","additionalProperties":false,"properties":{"messageId":{"$ref":"#/components/schemas/RemapperDefinition","description":"The message id pointing to the template string to format."},"template":{"type":"string","description":"The template default string to format."},"values":{"description":"A set of remappers to convert the input to usable values.","additionalProperties":{"$ref":"#/components/schemas/RemapperDefinition"}}},"description":"Format a string using remapped input variables.\nUseful for replacing static text with generated values.\n\nInput:\n\n```json\n{\"lotteryPrize\":\"5000\"}\n```\n```yaml\nstring.format:\n  template: You have won \u20ac{lotteryAmount} in the lottery!!\n  values:\n    lotteryAmount:\n      prop: lotteryPrize\n\n```\nResult:\n\n```json\n\"You have won \u20ac5000 in the lottery!!\"\n```\n\n\n> **Tip:** Considering this can be inserted anywhere a remapper is accepted. You can also use this\n> to choose specific URL\u2019s more accurately.\n\n"},"string.replace":{"type":"object","minProperties":1,"maxProperties":1,"additionalProperties":{"type":"string"},"description":"\nUses RegEx to find a value in a string and replace it with a given value.\n\nInput:\n\n```json\n\"Eindhoven is the best city in the Netherlands\"\n```\n```yaml\nstring.replace:\n  (best*)\\w+: cleanest\n\n```\nResult:\n\n```json\n\"Eindhoven is the cleanest city in the Netherlands\"\n```\n\n"},"string.contains":{"type":"string","description":"\nChecks if the provided string is a substring of the input string.\nInput:\n\n```json\n\"Input string\"\n```\n```yaml\nstring.contains: string\n\n```\nResult:\n\n```json\ntrue\n```\n\n"},"ics":{"type":"object","description":"Create a calendar event. This event can be downloaded as an `.ics` file and\nuploaded to your agenda using the [download](../reference/action#download) action.\n\nFor example, the following input:\n```yaml\nics:\ncoordinates\n  object.from:\n    latitude: 38.897700545442646\n    longitude: -77.03655660152435\ndescription: \"Sprint planning meeting\"\nduration: 1d\nend: 2023-07-19\nlocation: The Oval Office.\nstart: 2023-07-18\ntitle: Important Meeting\nurl: https://google.nl\n```\n\nCreates the following ICS-formatted object:\n```\nBEGIN:VCALENDAR\nVERSION:2.0\nCALSCALE:GREGORIAN\nPRODID:http://remappers.appsemble.localhost:9999\nMETHOD:PUBLISH\nX-PUBLISHED-TTL:PT1H\nBEGIN:VEVENT\nUID:b8TsbczhfpIxPM-3lNHQz\nSUMMARY:Important Meeting\nDTSTAMP:20230703T102029Z\nDTSTART:20230717T220000Z\nDTEND:20230718T220000Z\nDESCRIPTION:Sprint planning meeting\nURL:https://google.nl\nGEO:38.897700545442646;-77.03655123710632\nLOCATION:The Oval Office.\nEND:VEVENT\nEND:VCALENDAR\n```\n","additionalProperties":false,"required":["start","title"],"properties":{"start":{"$ref":"#/components/schemas/RemapperDefinition","description":"The start of the icalendar event."},"end":{"$ref":"#/components/schemas/RemapperDefinition","description":"The end of the icalendar event."},"duration":{"$ref":"#/components/schemas/RemapperDefinition","description":"The duration of the event.","example":"1w 3d 10h 30m"},"title":{"$ref":"#/components/schemas/RemapperDefinition","description":"The title of the event."},"description":{"$ref":"#/components/schemas/RemapperDefinition","description":"An optional description of the event."},"url":{"$ref":"#/components/schemas/RemapperDefinition","description":"An optional link to attach to the event."},"location":{"$ref":"#/components/schemas/RemapperDefinition","description":"An optional location description to attach to the event."},"coordinates":{"$ref":"#/components/schemas/RemapperDefinition","description":"An optional geolocation description to attach to the event.\n\n  This must be an object with the properties `lat` or `latitude`, and `lon`, `lng` or `longitude`."}}},"null.strip":{"description":"Strip all null, undefined, and empty array values from an object or array.\nFor example, with the following input value:\n```json\n[0, 4, null, null, \"Peter\", 0.4234, null]\n```\n```yaml\nnull.strip: null\n```\n\nThe null values will be removed, leaving a dense array:\n```json\n[0, 4, \"Peter\", 0.4234]\n```\n\nInstead of giving it `null` as option, you can also provide a `depth` property to specify how\ndeep to recurse into the object or array to remove null values.\n\nFor example, with the following input:\n```json\n{\n  0: [0, null, \"Peter\"],\n  1: {\n    \"array1\": [4, null, 0.4234, null]\n  }\n}\n```\n\nYou can specify to which degree of depth you want the null values to be removed.\nWith this remapper definition:\n```yaml\nnull.strip:\n  depth: 2\n```\n\nIt will only check two objects in for any null values. That means only the first array within the\nobject will be checked. The result looks like this:\n```json\n{\n  0: [0, \"Peter\"],\n  1: {\n    \"array1\": [4, null, 0.4234, null]\n  }\n}\n```\n","anyOf":[{"enum":[null]},{"type":"object","required":["depth"],"additionalProperties":false,"description":"Options for the null.strip remapper.","properties":{"depth":{"type":"integer","minimum":1,"description":"How deep to recurse into objects and arrays to remove null values."}}}]},"type":{"enum":[null],"description":"Returns the type of the input object\n\nFor example, with the following input value:\n```json\n[0, 5, 7, 8]\n```\n```yaml\ntype: null\n```\n\nThe result will be:\n```json\n\"array\"\n```\n    "},"log":{"enum":["info","warn","error"],"description":"Logs in the browser's console and returns the incoming data and the remapper function's context.\n\nThe context contains relevant info about the app, like the URL and locale, but also contains the\nremapper\u2019s history.\n\nThe options represent the level of logging that will show in the console.\n\n- `input`: The input data going into this remapper,\n- `context`:\n  - `root`: The input data going into this remapper,\n  - `appId`: ID of the application,\n  - `url`: Absolute URL of the page where the remapper was fired,\n  - `appUrl`: Base URL of the application,\n  - `pageData`: Current page data of a FlowPage (See [page remapper](./data#page)),\n  - `userInfo`: User's information if they are logged in (See [user remapper](./data#user)),\n  - `context`: Internal context\n  - `history`: Complete list of this remapper\u2019s history (See [history remapper](./history))\n  - `locale`: The user\u2019s locale,\n  - `stepRef`: In a loop page, gives the properties from the loop\u2019s current data index (See [step remapper](./data#step))\n\nFor example:\n\n```json\n{\n  \"input\": {\n    \"name\": \"Peter\",\n    \"age\": 49,\n    \"birthday\": \"07-08-2023\"\n  },\n  \"context\": {\n    \"root\": {\n      \"name\": \"Peter\",\n      \"age\": 49,\n      \"birthday\": \"07-08-2023\"\n    },\n    \"appId\": 49,\n    \"url\": \"http://remappers.appsemble.localhost:9999/en/other\",\n    \"appUrl\": \"http://remappers.appsemble.localhost:9999\",\n    \"pageData\": {\n      \"triedAppsemble\": false\n    },\n    \"userInfo\": {\n      \"email\": \"example@hotmail.com\",\n      \"email_verified\": true,\n      \"name\": \"Example User 1\",\n      \"picture\": \"https://www.gravatar.com/avatar/f46b82357ce29bcd1099915946cda468?s=128&d=mp\",\n      \"sub\": \"0000-0000-0000-0000\",\n      \"locale\": \"en\",\n      \"zoneinfo\": \"Europe/Amsterdam\"\n    },\n    \"context\": {},\n    \"history\": [\n      [\n        0,\n        4,\n        null,\n        null,\n        \"Peter\",\n        0.4234,\n        null\n      ],\n      {\n        \"name\": \"Peter\",\n        \"age\": 49\n      },\n      {\n        \"name\": \"Peter\",\n        \"age\": 49,\n        \"birthday\": \"07-08-2023\"\n      }\n    ],\n    \"locale\": \"en\",\n    \"stepRef\": {\n      \"current\": {\n        \"answerType\": \"multiple choice\",\n        \"question\": \"How much do you enjoy working here?\"\n      }\n    }\n  }\n}\n```\n"},"xml.parse":{"description":"This can be used to parse an xml string into an object\n\nFor example:\n\nInput:\n\n```json\n{\"xml\":\"\\n<obj>\\n  <foo>bar</foo>\\n  <item foo=\\\"bar\\\">\\n    <item foo=\\\"bar\\\">\\n      <text>text</text>\\n    </item>\\n  </item>\\n  <item bar=\\\"baz\\\">\\n    <item bar=\\\"baz\\\">\\n      <text>text 2</text>\\n    </item>\\n  </item>\\n  <item>\\n    <item foo=\\\"bar\\\">\\n      <item foo=\\\"bar\\\">\\n        <text>text</text>\\n      </item>\\n    </item>\\n    <item bar=\\\"baz\\\">\\n      <item bar=\\\"baz\\\">\\n        <text>text 2</text>\\n      </item>\\n    </item>\\n  </item>\\n</obj>\\n\"}\n```\n```yaml\nxml.parse:\n  prop: xml\n\n```\nResult:\n\n```json\n{\n  \"obj\": {\n    \"foo\": \"bar\",\n    \"item\": [\n      {\n        \"foo\": \"bar\",\n        \"item\": {\n          \"foo\": \"bar\",\n          \"text\": \"text\"\n        }\n      },\n      {\n        \"bar\": \"baz\",\n        \"item\": {\n          \"bar\": \"baz\",\n          \"text\": \"text 2\"\n        }\n      },\n      {\n        \"item\": [\n          {\n            \"foo\": \"bar\",\n            \"item\": {\n              \"foo\": \"bar\",\n              \"text\": \"text\"\n            }\n          },\n          {\n            \"bar\": \"baz\",\n            \"item\": {\n              \"bar\": \"baz\",\n              \"text\": \"text 2\"\n            }\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n","$ref":"#/components/schemas/RemapperDefinition"},"maths":{"description":"This can be used to perform a mathematical operation on two numbers\n\nFor example:\n\nInput:\n\n```json\n{\"version\":0}\n```\n```yaml\nmaths:\n  a:\n    prop: version\n  b:\n    static: 1\n  operation: add\n\n```\nResult:\n\n```json\n1\n```\n","additionalProperties":false,"properties":{"a":{"$ref":"#/components/schemas/RemapperDefinition"},"b":{"$ref":"#/components/schemas/RemapperDefinition"},"operation":{"enum":["add","divide","mod","multiply","subtract"]}}}}},"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":"^([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-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\u2019s icon."}}},"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"}}}},"PageActionsDefinition":{"type":"object","description":"Action fired on page events","additionalProperties":false,"properties":{"onLoad":{"$ref":"#/components/schemas/ActionDefinition","description":"This action is fired when a page loads, highly helpful in loading data for the page"}}},"PageDefinition":{"type":"object","additionalProperties":false,"description":"The list of blocks that are displayed on the page.\n\nEach page requires at least one block. Blocks are displayed in the order that they are defined in\nthe list.\n","required":["blocks","name"],"properties":{"blocks":{"type":"array","minItems":1,"description":"The blocks that make up a page.","items":{"$ref":"#/components/schemas/BlockDefinition"}},"actions":{"$ref":"#/components/schemas/PageActionsDefinition"},"name":{"type":"string","maxLength":50,"description":"The name of an app.\n\nThis field is always required and must be unique within the app, meaning that it is not possible to\nhave two pages with the same name. The name of the page is displayed at the *app bar* of each page as well as in the side navigational menu.\n\n> **Note**: The URL used to navigate to pages is determined by this property.\n"},"hideName":{"type":"boolean","description":"Whether or not the page name should be displayed in the *app bar*."},"navTitle":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the page when displayed in the navigation menu.\n\n  Context property `name` can be used to access the name of the page.\n  "},"hideNavTitle":{"type":"boolean","description":"Whether or not the page should be displayed in navigational menus.\n\n  By default all pages without parameters are added to navigational menus. Set to `true` to hide the\n  page from menus.\n  ","default":false},"navigation":{"$ref":"#/components/schemas/AppLayoutDefinition/properties/navigation","description":"The type of navigation displayed on the page.\n\nThis overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or\nApp navigation are not set.\n\nSet to `bottom` to use a navigation pane at the bottom of the screen instead of the default side\nmenu. Set to `hidden` to display no navigational menus at all.\n"},"icon":{"type":"string","description":"An optional icon from the fontawesome icon set\n\nThis will be displayed in the navigation menu.\n"},"parameters":{"type":"array","description":"Page parameters can be used for linking to a page that should display a single resource.\n\nThis defined as a list of strings representing the properties to pass through. More often than not\npassing `id` through is sufficient, depending on the block.\n","items":{"type":"string","minLength":1,"maxLength":30}},"roles":{"type":"array","description":"The list of roles that are allowed to view this page.\n\nIf the user doesn\u2019t have any of the roles in the list the page will be unavailable to them. An empty\nlist can be used to specify that users need to log in but do not need a specific role.\n\nUsers trying to visit a page without having the correct roles will be redirected to the first page\nthat they are allowed to view. If there aren\u2019t any accessible pages, the user will be logged out and\ninstructed to contact the app owner to get permissions.\n","items":{"type":"string"}},"theme":{"$ref":"#/components/schemas/Theme"},"badgeCount":{"$ref":"#/components/schemas/RemapperDefinition","description":"A Remapper that resolves to a number to be visibile in the side-menu."}}},"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."}}},"RemapperDefinition":{"anyOf":[{"type":"boolean","description":"A boolean remapper is always returned directly."},{"enum":[null],"description":"A null remapper is always returned directly."},{"type":"number","description":"A numeric remapper is always returned directly."},{"type":"string","description":"A string remapper is always returned directly."},{"$ref":"#/components/schemas/ObjectRemapperDefinition"},{"$ref":"#/components/schemas/ArrayRemapperDefinition"}]},"RequestActionDefinition":{"type":"object","additionalProperties":false,"required":["type","url"],"properties":{"type":{"enum":["request"],"description":"Performs an HTTP request.\n\nThis can be used to call the Appsemble API or an external API in order to fetch data or send data.\nWhen sending `POST`, `PUT`, `DELETE` and `PATCH` calls the data that is currently available\nin the block gets passed through.\n\nIf the content type of the request is `text/xml` or `application/xml`, the data will be\nconverted to JSON.\n"},"url":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in the URL to send the request to.\n\nCan be a relative URL (E.g. `/api/health`) for usage with the Appsemble API, or an absolute URL\n(E.g. `https://example.com`) for usage with external sites."},"method":{"enum":["delete","get","patch","post","put"],"default":"get","description":"The type of request to make."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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))?$"}]}}},"ResourceCountActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.count"],"description":"Count the number of resources a similar `resource.query` action would return."},"resource":{"type":"string","description":"The type of the resource to count."},"own":{"type":"boolean","description":"If only the resources created by the authenticated app member should be included"},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceCreateActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.create"],"description":"Create a resource."},"resource":{"type":"string","description":"The type of the resource to create."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceDefinition":{"type":"object","additionalProperties":false,"description":"A definition of how this resource works.","required":["schema"],"properties":{"expires":{"type":"string","description":"A time string representing when a resource should expire.\n\nExample: 1d 8h 30m\n","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))?$"},"clonable":{"type":"boolean","description":"Whether the resource should be able to be transferred when cloning the app it belongs to"},"schema":{"$ref":"#/components/schemas/JSONSchemaRoot","description":"JSON schema definitions that may be used by the app."},"references":{"type":"object","description":"References to other resources.\n\nThe key is the property that references the other resource. The value is an object describing the\nname of the resource and how it should behave.\n","minProperties":1,"additionalProperties":{"type":"object","description":"A reference to between two resource types.","additionalProperties":false,"properties":{"resource":{"type":"string"},"create":{"type":"object","additionalProperties":false,"description":"Defines what happens when the specified action is executed on the referenced resource.","properties":{"triggers":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"Defines the type of trigger and the cascading strategy for it","required":["type"],"properties":{"type":{"enum":["create","update","delete"]},"cascade":{"description":"Defines the cascading strategy.\n\nIf 'update' is specified, the referencing property of the referencing resource is set to null.\n\nIf 'delete' is specified, the referencing resource is deleted.\n\nIf not specified, the referenced resource cannot be deleted\nwithout deleting the referencing resource first.","enum":["update","delete"]}}},"minItems":1,"uniqueItems":true}}},"patch":{"type":"object","additionalProperties":false,"description":"Defines what happens when the specified action is executed on the referenced resource.","properties":{"triggers":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"Defines the type of trigger and the cascading strategy for it","required":["type"],"properties":{"type":{"enum":["create","update","delete"]},"cascade":{"description":"Defines the cascading strategy.\n\nIf 'update' is specified, the referencing property of the referencing resource is set to null.\n\nIf 'delete' is specified, the referencing resource is deleted.\n\nIf not specified, the referenced resource cannot be deleted\nwithout deleting the referencing resource first.","enum":["update","delete"]}}},"minItems":1,"uniqueItems":true}}},"update":{"type":"object","additionalProperties":false,"description":"Defines what happens when the specified action is executed on the referenced resource.","properties":{"triggers":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"Defines the type of trigger and the cascading strategy for it","required":["type"],"properties":{"type":{"enum":["create","update","delete"]},"cascade":{"description":"Defines the cascading strategy.\n\nIf 'update' is specified, the referencing property of the referencing resource is set to null.\n\nIf 'delete' is specified, the referencing resource is deleted.\n\nIf not specified, the referenced resource cannot be deleted\nwithout deleting the referencing resource first.","enum":["update","delete"]}}},"minItems":1,"uniqueItems":true}}},"delete":{"type":"object","additionalProperties":false,"description":"Defines what happens when the specified action is executed on the referenced resource.","properties":{"triggers":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"Defines the type of trigger and the cascading strategy for it","required":["type"],"properties":{"type":{"enum":["create","update","delete"]},"cascade":{"description":"Defines the cascading strategy.\n\nIf 'update' is specified, the referencing property of the referencing resource is set to null.\n\nIf 'delete' is specified, the referencing resource is deleted.\n\nIf not specified, the referenced resource cannot be deleted\nwithout deleting the referencing resource first.","enum":["update","delete"]}}},"minItems":1,"uniqueItems":true}}}}}},"positioning":{"type":"boolean","default":false,"description":"Whether to enable position column for the instances of this resource. This is used for keeping an ordered list to enable custom sorting of the data using drag and drop features."},"enforceOrderingGroupByFields":{"type":"array","pattern":"^[a-zA-Z0-9]*$","description":"Group resources by fields when handling resource positions","items":{"type":"string"},"minItems":1},"url":{"type":"string","default":"/api/apps/{appId}/{resource}","description":"URL to use if not otherwise specified."},"id":{"type":"string","default":"id","description":"Name of the field used when accessing singular entities."},"history":{"description":"A definition of how versioning should happen for instances of this resource.","default":false,"oneOf":[{"type":"boolean","description":"Setting this to `true` is the same as using an object with the property `data` set to `true`."},{"$ref":"#/components/schemas/ResourceHistoryDefinition"}]},"query":{"type":"object","description":"Overrides for 'query' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"GET","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}","description":"URL to use for this type of request."}}},"get":{"type":"object","description":"Overrides for 'get' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"GET","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}/{id}","description":"URL to use for this type of request."}}},"count":{"type":"object","description":"Overrides for 'count' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"GET","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}/$count","description":"URL to use for this type of request."}}},"create":{"type":"object","description":"Overrides for 'create' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"POST","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}/{id}","description":"URL to use for this type of request."},"hooks":{"$ref":"#/components/schemas/ResourceHooksDefinition"}}},"patch":{"type":"object","description":"Overrides for 'patch' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"PATCH","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}/{id}","description":"URL to use for this type of request."},"hooks":{"$ref":"#/components/schemas/ResourceHooksDefinition"}}},"update":{"type":"object","description":"Overrides for 'update' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"PUT","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}/{id}","description":"URL to use for this type of request."},"hooks":{"$ref":"#/components/schemas/ResourceHooksDefinition"}}},"delete":{"type":"object","description":"Overrides for 'delete' requests.","additionalProperties":false,"properties":{"query":{"type":"object","description":"The query parameters to use in the request.","additionalProperties":{"type":"string"}},"method":{"type":"string","default":"DELETE","description":"HTTP method to use for this type of request."},"url":{"type":"string","default":"/api/apps/{appId}/{resource}/{id}","description":"URL to use for this type of request."},"hooks":{"$ref":"#/components/schemas/ResourceHooksDefinition"}}},"views":{"$ref":"#/components/schemas/ResourceViewDefinition"}}},"ResourceDeleteActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.delete"],"description":"Delete a resource."},"resource":{"type":"string","description":"The type of the resource to delete."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceDeleteAllActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.delete.all"],"description":"Delete all instances of a resource.\n> **Warning!**\n>\n> Use this action with caution to avoid losing precious data!"},"resource":{"type":"string","description":"The type of the resource to delete."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceDeleteBulkActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.delete.bulk"],"description":"Delete several instances of a resource."},"resource":{"type":"string","description":"The type of the resource to delete."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceGetActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.get"],"description":"Get a single resource."},"resource":{"type":"string","description":"The type of the resource to get."},"view":{"type":"string","description":"The view to use for the resource."},"id":{"$ref":"#/components/schemas/RemapperDefinition"},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceHistoryDefinition":{"type":"object","additionalProperties":false,"description":"A definition of how versioning works for instances of this resource","required":["data"],"properties":{"data":{"type":"boolean","default":true,"description":"If set to `false`, edits are still tracked, but exactly what changed is lost."}}},"ResourceHistoryGetActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.history.get"],"description":"Get the complete history of a resource."},"resource":{"type":"string","description":"The type of the resource to get."},"method":{"enum":["delete","get","patch","post","put"],"default":"get","description":"The type of request to make."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceHooksDefinition":{"type":"object","description":"Hooks that are triggered upon calling a resource action.","additionalProperties":false,"minProperties":1,"properties":{"notification":{"$ref":"#/components/schemas/NotificationHookDefinition"}}},"ResourcePatchActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.patch"],"description":"Patch a resource."},"resource":{"type":"string","description":"The type of the resource to patch."},"id":{"$ref":"#/components/schemas/RemapperDefinition"},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceQueryActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.query"],"description":"Query a list of resources."},"resource":{"type":"string","description":"The type of the resource to query."},"view":{"type":"string","description":"The view to use for the resource."},"own":{"type":"boolean","description":"If only the resources created by the authenticated app member should be included"},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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."}}}}}},"ResourceSubscriptionStatusActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.subscription.status"],"description":"Get the status of whether or not the user is subscriped to notifications for resource modifications."},"resource":{"type":"string","description":"The type of the resource to get the subscription state for."},"action":{"enum":["create","delete","update"],"description":"The resource action type to get the subscription state for.","default":"update"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceSubscriptionSubscribeActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.subscription.subscribe"],"description":"Subscribe to notifications on resource modifications."},"resource":{"type":"string","description":"The type of the resource to subscribe to."},"action":{"enum":["create","delete","update"],"description":"The resource action type to subscribe to.","default":"update"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceSubscriptionToggleActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.subscription.toggle"],"description":"Toggle whether or not to receive notifications on resource modifications."},"resource":{"type":"string","description":"The type of the resource to toggle the subscription state for."},"action":{"enum":["create","delete","update"],"description":"The resource action type to toggle the subscription state for.","default":"update"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceSubscriptionUnsubscribeActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.subscription.unsubscribe"],"description":"Unsubscribe from notifications on resource modifications."},"resource":{"type":"string","description":"The type of the resource to unsubscribe from."},"action":{"enum":["create","delete","update"],"description":"The resource action type to unsubscribe from.","default":"update"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceUpdateActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.update"],"description":"Update a resource."},"resource":{"type":"string","description":"The type of the resource to update."},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceUpdatePositionsActionDefinition":{"type":"object","additionalProperties":false,"required":["type","resource"],"properties":{"type":{"enum":["resource.update.positions"],"description":"Update the position of a resource."},"resource":{"type":"string","description":"The type of the resource to update."},"id":{"$ref":"#/components/schemas/RemapperDefinition"},"query":{"$ref":"#/components/schemas/RemapperDefinition","description":"A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is."},"body":{"$ref":"#/components/schemas/RemapperDefinition","description":"remapper that results in the request body to send.\n\nIf not specified, the raw input data is used.\n"},"proxy":{"type":"boolean","default":true,"description":"By default requests will be proxied through the Appsemble API.\n\nThis allows to protect user data and ensures\n[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be\ndisabled by setting this to `false`\n"},"schema":{"description":"The name of the schema to validate against before submitting data.","$ref":"#/components/schemas/JSONSchema"},"headers":{"type":"object","description":"The headers to be set for the outgoing request","additionalProperties":false,"properties":{"Content-Type":{"description":"Content type for the outgoing request","enum":["application/xml","text/plain","application/x-www-form-urlencoded","multipart/form-data"]}}},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"ResourceViewDefinition":{"type":"object","minProperties":1,"description":"Alternative views of a resource that are modified using remappers and support different sets of roles.","additionalProperties":{"type":"object","additionalProperties":false,"description":"A custom view for a resource.","properties":{"roles":{"type":"array","description":"The list of roles that are allowed to use this view.","items":{"type":"string"}},"remap":{"$ref":"#/components/schemas/RemapperDefinition","description":"The modified view."}}}},"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\u2019s 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"}}}}}},"SecurityCronDefinition":{"type":"object","description":"This describes the permissions that unauthenticated users have.","additionalProperties":false,"properties":{"inherits":{"type":"array","minItems":1,"description":"The name of the role to inherit from.\n\nNote that this role must exist.\n","items":{"type":"string"}},"permissions":{"type":"array","description":"Specific permissions within the app, which unauthenticated users should have","items":{"type":"string"}}}},"SecurityDefaultDefinition":{"type":"object","required":["role"],"description":"The default role to apply to members.","additionalProperties":false,"properties":{"policy":{"enum":["everyone","organization","invite"],"default":"everyone","description":"How the `default` role gets applied to users.\n\nThe following values are allowed:\n- `everyone`: Every authenticated user gets the default role.\n- `organization`: Every authenticated user gets the default role if they are in the same organization as the app.\n- `invite`: The app member has to be invited to the app with a specific role.\n\n> **Important**: When [OAuth2](../guides/oauth2) or [SAML2.0](../guides/saml) is used in the\n> app, you must set the policy to `everyone`. This will specifically allow every configured\n> authentication method on the secrets page to be used as login method. If you do not want other\n> Appsemble user accounts to be able to log in, you must `disable` the `appsemble login` options\n> (including the Appsemble OAuth2 option) in the secrets page. If this option is enabled, any\n> Appsemble user account is able to log in to the app and will receive the default role.\n"},"role":{"type":"string","description":"The default role to apply to members.\n\nThis must match with one of the roles defined within the security definition.\n"}}},"SecurityDefinition":{"type":"object","description":"This describes how the app is secured.","additionalProperties":false,"properties":{"default":{"$ref":"#/components/schemas/SecurityDefaultDefinition"},"guest":{"$ref":"#/components/schemas/SecurityGuestDefinition"},"cron":{"$ref":"#/components/schemas/SecurityCronDefinition"},"roles":{"type":"object","description":"This property defines the app roles that are available within the app.","minProperties":1,"additionalProperties":{"$ref":"#/components/schemas/SecurityRoleDefinition"}}}},"SecurityGuestDefinition":{"type":"object","description":"This describes the permissions that unauthenticated users have.","additionalProperties":false,"properties":{"inherits":{"type":"array","minItems":1,"description":"The name of the role to inherit from.\n\nNote that this role must exist.\n","items":{"type":"string"}},"permissions":{"type":"array","description":"Specific permissions within the app, which unauthenticated users should have","items":{"type":"string"}}}},"SecurityRoleDefinition":{"type":"object","description":"This describes a security role.","additionalProperties":false,"properties":{"description":{"type":"string","description":"The description of the role."},"defaultPage":{"type":"string","description":"The default page to redirect users with this role to."},"inherits":{"type":"array","minItems":1,"description":"The name of the role to inherit from.\n\nNote that this role must exist and can not inherit itself via this field or the `inherits` field\nof the referenced role.\n","items":{"type":"string"}},"permissions":{"type":"array","description":"Specific permissions within the app, which this role should have","items":{"type":"string"}}}},"ShareActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["share"],"description":"The `share` action can be used to display a prompt that allows the user to share something with others, primarily via social media.\n\nDepending on whether the user\u2019s browser supports a native share function it will either display a\nnative dialog for sharing links, or display a more limited fallback in a dialog.\n"},"url":{"$ref":"#/components/schemas/RemapperDefinition","description":"The url that is being shared."},"title":{"$ref":"#/components/schemas/RemapperDefinition","description":"The title that should be shared."},"text":{"$ref":"#/components/schemas/RemapperDefinition","description":"The main body that should be shared."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StaticActionDefinition":{"type":"object","additionalProperties":false,"required":["type","value"],"properties":{"type":{"enum":["static"],"description":"The `static` action returns static data defined in the action definition.\n\nThis is useful for example for stubbing data.\n"},"value":{"description":"The static value to return."},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StorageAppendActionDefinition":{"type":"object","additionalProperties":false,"required":["type","key","value"],"properties":{"type":{"enum":["storage.append"],"description":"Append data to an existing array in storage.\n      If the storage entry is a single object, it turns it into an array to append the data on.\n\nFor example:\n```yaml\ntype: storage.append\nkey: temp\nvalue: { root }\nstorage: localStorage\nremapBefore:\n  object.from:\n    text:\n      This is a new data item\n    value:\n      1\n```\n"},"key":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the storage entry."},"value":{"$ref":"#/components/schemas/RemapperDefinition","description":"The data to write on top of the storage entry."},"storage":{"enum":["indexedDB","localStorage","sessionStorage","appStorage"],"description":"The mechanism used to store the data.","default":"indexedDB"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StorageDeleteActionDefinition":{"type":"object","additionalProperties":false,"required":["type","key"],"properties":{"type":{"enum":["storage.delete"],"description":"Delete the item that is stored at the specified key.\n\nFor example:\n```yaml\ntype: storage.delete\nkey: temp\nstorage: localStorage\n```\n      "},"key":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the storage entry to remove."},"storage":{"enum":["indexedDB","localStorage","sessionStorage","appStorage"],"description":"The mechanism used to remove the data from.","default":"indexedDB"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StorageReadActionDefinition":{"type":"object","additionalProperties":false,"required":["type","key"],"properties":{"type":{"enum":["storage.read"],"description":"Read data from the app\u2019s local storage.\n\nFor example:\n```yaml\ntype: storage.read\nkey: temp\nstorage: localStorage\n```\n\n      "},"key":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the storage entry."},"storage":{"enum":["indexedDB","localStorage","sessionStorage","appStorage"],"description":"The mechanism used to read the data from.","default":"indexedDB"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StorageSubtractActionDefinition":{"type":"object","additionalProperties":false,"required":["type","key"],"properties":{"type":{"enum":["storage.subtract"],"description":"Subtract last item from a storage entry.\n\nIf the entry consists of only one item, turns it into a singular object.\n\nIf the entry is a single item, the entry is removed entirely.\n\nFor example:\n```yaml\ntype: storage.subtract\nkey: temp\nstorage: localStorage\n```\n        "},"key":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the storage entry."},"storage":{"enum":["indexedDB","localStorage","sessionStorage","appStorage"],"description":"The mechanism used to read the data from.","default":"indexedDB"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StorageUpdateActionDefinition":{"type":"object","additionalProperties":false,"required":["type","key","value"],"properties":{"type":{"enum":["storage.update"],"description":"Update an existing item in storage, or update an item inside a stored array.\n\nFor example:\n```yaml\ntype: storage.update\nkey: temp\nitem: 1\nvalue: { root }\nstorage: localStorage\nremapBefore:\n  object.from:\n    text: { prop: text }\n    value: { prop: value }\n    newField: \"New field\"\n```\n      "},"key":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the storage entry."},"item":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the item in an array to update."},"value":{"$ref":"#/components/schemas/RemapperDefinition","description":"The data to update the specified item with."},"storage":{"enum":["indexedDB","localStorage","sessionStorage","appStorage"],"description":"The mechanism used to store the data.","default":"indexedDB"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"StorageWriteActionDefinition":{"type":"object","additionalProperties":false,"required":["type","key","value"],"properties":{"type":{"enum":["storage.write"],"description":"Write data to the app\u2019s local storage.\n\nFor example:\n```yaml\ntype: storage.write\nkey: temp\nvalue: { root }\nstorage: localStorage\nremapBefore:\n  object.from:\n    data:\n      cool data\n    value:\n      1\n```\n      "},"key":{"$ref":"#/components/schemas/RemapperDefinition","description":"The key of the storage entry."},"value":{"$ref":"#/components/schemas/RemapperDefinition","description":"The data to write to the storage entry."},"expiry":{"enum":["1d","3d","7d","12h"],"description":"Set an expiry for your data, only works with the localStorage"},"storage":{"enum":["indexedDB","localStorage","sessionStorage","appStorage"],"description":"The mechanism used to store the data.","default":"indexedDB"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"SubPage":{"type":"object","description":"This describes what a sub page will look like in the app.","required":["blocks"],"additionalProperties":false,"properties":{"name":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the sub page."},"roles":{"type":"array","description":"The list of roles that are allowed to view this page.\n\nIf the user doesn\u2019t have any of the roles in the list the page will be unavailable to them. An empty\nlist can be used to specify that users need to log in but do not need a specific role.\n\nUsers trying to visit a page without having the correct roles will be redirected to the first page\nthat they are allowed to view. If there aren\u2019t any accessible pages, the user will be logged out and\ninstructed to contact the app owner to get permissions.\n","items":{"type":"string"}},"blocks":{"type":"array","minItems":1,"description":"The blocks that make up a page.","items":{"$ref":"#/components/schemas/BlockDefinition"}}}},"TabsPageDefinition":{"type":"object","description":"Shows a set of subpages as tabs at the top of the page.","oneOf":[{"required":["type","tabs"]},{"required":["type","definition"]}],"additionalProperties":true,"properties":{"type":{"enum":["tabs"]},"tabs":{"type":"array","minItems":1,"description":"Each of the available tabs for the tabs page.","items":{"$ref":"#/components/schemas/SubPage"}},"definition":{"type":"object","additionalProperties":false,"description":"Generate tabs dynamically","required":["events","foreach"],"properties":{"events":{"$ref":"#/components/schemas/EventsDefinition"},"foreach":{"$ref":"#/components/schemas/SubPage"}}},"actions":{"$ref":"#/components/schemas/PageActionsDefinition"},"name":{"type":"string","maxLength":50,"description":"The name of an app.\n\nThis field is always required and must be unique within the app, meaning that it is not possible to\nhave two pages with the same name. The name of the page is displayed at the *app bar* of each page as well as in the side navigational menu.\n\n> **Note**: The URL used to navigate to pages is determined by this property.\n"},"hideName":{"type":"boolean","description":"Whether or not the page name should be displayed in the *app bar*."},"navTitle":{"$ref":"#/components/schemas/RemapperDefinition","description":"The name of the page when displayed in the navigation menu.\n\n  Context property `name` can be used to access the name of the page.\n  "},"hideNavTitle":{"type":"boolean","description":"Whether or not the page should be displayed in navigational menus.\n\n  By default all pages without parameters are added to navigational menus. Set to `true` to hide the\n  page from menus.\n  ","default":false},"navigation":{"$ref":"#/components/schemas/AppLayoutDefinition/properties/navigation","description":"The type of navigation displayed on the page.\n\nThis overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or\nApp navigation are not set.\n\nSet to `bottom` to use a navigation pane at the bottom of the screen instead of the default side\nmenu. Set to `hidden` to display no navigational menus at all.\n"},"icon":{"type":"string","description":"An optional icon from the fontawesome icon set\n\nThis will be displayed in the navigation menu.\n"},"parameters":{"type":"array","description":"Page parameters can be used for linking to a page that should display a single resource.\n\nThis defined as a list of strings representing the properties to pass through. More often than not\npassing `id` through is sufficient, depending on the block.\n","items":{"type":"string","minLength":1,"maxLength":30}},"roles":{"type":"array","description":"The list of roles that are allowed to view this page.\n\nIf the user doesn\u2019t have any of the roles in the list the page will be unavailable to them. An empty\nlist can be used to specify that users need to log in but do not need a specific role.\n\nUsers trying to visit a page without having the correct roles will be redirected to the first page\nthat they are allowed to view. If there aren\u2019t any accessible pages, the user will be logged out and\ninstructed to contact the app owner to get permissions.\n","items":{"type":"string"}},"theme":{"$ref":"#/components/schemas/Theme"},"badgeCount":{"$ref":"#/components/schemas/RemapperDefinition","description":"A Remapper that resolves to a number to be visibile in the side-menu."}},"required":["name"]},"Theme":{"type":"object","description":"A generic theme definition.","additionalProperties":false,"minProperties":1,"properties":{"themeColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#ffffff","description":"The generic theme color of the app.\n\nThis is used for example in the URL bar on Android.\n"},"splashColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#ffffff","description":"The background color of the PWA splash screen.\n\nThis defaults to the theme color.\n"},"primaryColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#5393ff","description":"The primary color used within the app.\n\nThis is used in various elements like the navbar.\n"},"linkColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#0440ad","description":"The color used for links."},"infoColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#a7d0ff","description":"The color used for informational messages."},"successColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#1fd25b","description":"The color used for successful actions."},"warningColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#fed719","description":"The color used for warning messages."},"dangerColor":{"type":"string","pattern":"^#[\\dA-Fa-f]{6}$","default":"#ff2800","description":"The color used for error messages."},"tileLayer":{"type":"string","format":"uri","default":"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png","description":"The tileLayer to use for Leaflet maps."},"font":{"description":"The font to use in the app.","anyOf":[{"$ref":"#/components/schemas/CustomFontDefinition"},{"$ref":"#/components/schemas/GoogleFontDefinition"}]}}},"ThrowActionDefinition":{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"enum":["throw"],"description":"This action throws a new exception based on the data that is passed through.\n\nThis can be used to create a custom error that ends up in the error action handler.\n"},"remapBefore":{},"remapAfter":{},"onSuccess":{},"onError":{}}},"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/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."}}},"WebhookDefinition":{"type":"object","required":["schema","action"],"description":"A webhook definition defines app specific callable endpoints that Appsemble can handle.","additionalProperties":false,"properties":{"schema":{"$ref":"#/components/schemas/JSONSchemaRoot","description":"JSON schema definition of the payload."},"action":{"description":"The action to run when the webhook is triggered.","$ref":"#/components/schemas/ActionDefinition"}}}},"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\u2019s groups.","groups:write":"Read information about the user\u2019s 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.33.5"},"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\u2019s expert\u2019s 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\u2019s expert\u2019s 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\u2019s 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\u2019s 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/app-invites/{token}/respond":{"parameters":[{"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/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/app-invites/{token}":{"parameters":[{"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/app-members/{appMemberId}/picture":{"parameters":[{"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\u2019s 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/app-members/{appMemberId}/properties":{"parameters":[{"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\u2019s custom properties."}}}}}},"responses":{"200":{"description":"The updated app member","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppMember"}}}}},"security":[{"studio":[]},{"app":[]}]}},"/api/app-members/{appMemberId}/role":{"parameters":[{"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/app-members/{appMemberId}":{"parameters":[{"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}/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"}],"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\u2019s 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":"^([\\da-z](?:(?!.*--)[\\da-z-]*[\\da-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"}],"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"}}}}}}}},"/api/apps/{appId}/email":{"parameters":[{"$ref":"#/components/parameters/appId"}],"get":{"tags":["main","app"],"description":"Get the app\u2019s 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/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}/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\u2019s 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\u2019s preferred email address."},"email_verified":{"type":"boolean","description":"True if the end-user\u2019s email address has been verified, else false."},"properties":{"type":"object","description":"Custom app member properties."}}}}}}}},"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\u2019s profile picture."},"properties":{"type":"object","additionalProperties":{"type":"string"},"description":"The member\u2019s custom properties."},"locale":{"type":"string","description":"The preferred locale of the user."}}},"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\u2019s messages should be merged with its base language.","schema":{"type":"string"}},{"in":"query","name":"override","description":"Whether the app\u2019s language overrides should be included and merged.","schema":{"type":"string","default":"true"}}],"delete":{"tags":["main","apps","language"],"description":"Delete the app\u2019s 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\u2019s 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\u2019s 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}/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\u2019s 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/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\u2019s 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\u2019s 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\u2019s push notifications. If value isn\u2019t 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":[]}]}},"/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."},"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."},"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."},"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\u2019s profile picture."},"properties":{"type":"object","additionalProperties":{"type":"string"},"description":"The member\u2019s 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/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":"The account that was created."}}}},"/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","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":[{"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/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":{"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 \u2018true\u2019.","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"},"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."},"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":{"$ref":"#/components/schemas/AppDefinition/properties/name"},"description":{"$ref":"#/components/schemas/AppDefinition/properties/description"},"organizationId":{"$ref":"#/components/schemas/Organization/properties/id"},"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/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\u2019s 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/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\u2019s apps. Private apps are excluded unless the user is in the organization.","operationId":"getOrganizationApps","responses":{"200":{"description":"The list of this organization\u2019s 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\u2019s blocks.","operationId":"getOrganizationBlocks","responses":{"200":{"description":"The list of this organization\u2019s 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\u2019s 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\u2019s 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}":{"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"},"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"},"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/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/group-invites/{token}/respond":{"parameters":[{"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/group-invites/{token}":{"parameters":[{"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/group-members/{groupMemberId}/role":{"parameters":[{"$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\u2019s role has been successfully updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupMember"}}}}},"security":[{"studio":[]},{"app":[]},{"cli":["groups:write"]}]}},"/api/group-members/{groupMemberId}":{"parameters":[{"$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/groups/{groupId}/invites/resend":{"parameters":[{"$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/groups/{groupId}/invites":{"parameters":[{"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/groups/{groupId}/members":{"parameters":[{"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/OrganizationMember"}}}}}},"security":[{"studio":[]},{"app":["groups:read"]}]}},"/api/groups/{groupId}":{"parameters":[{"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\u2019s 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\u2019s 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":"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."}]}
</schema>

[User] Provide a JSON object that satisfies the schema "AppDefinition". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.

$filter

    An OData filter

    http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_SystemQueryOptionfilter

$orderby

    An OData query option to fetch ordered data

    https://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_SystemQueryOptionorderby

$own

If only the resources created by the authenticated app member should be included

$select

    The OData `$select` query option.

    This is a comma separated string of fields to select. Only filtering flat properties is
    supported.

    http://docs.oasis-open.org/odata/odata/v4.01/odata-v4.01-part1-protocol.html#sec_SystemQueryOptionselect

$skip

Start the query from an offset.

$top

Limit the number of entities returned.

appId

The ID of the app on which to perform an operation

memberId

The id of the app member on which to perform an operation

The ID of the app OAuth2 secret on which to perform an operation

appSamlSecretId

The ID of the app SAML secret on which to perform an operation

appVariableId

The id of the app variable on which to perform an operation

assetId

The ID of the asset on which to perform an operation

blockId

The ID of the block on which to perform an operation, but without the organization scope.

blockVersion

The version of the block on which to perform an operation.

delimiter

Delimiter to be used to parse the CSV file

endpoint

The URL of the endpoint associated with the subscription.

groupId

The ID of the group on which to perform an operation

groupMemberId

The id of the group member on which to perform an operation

language

The language on which to perform an operation

organizationId

The ID of the organization on which to perform an operation

readmeId

The id of an app readme

resourceId

The ID of the resource on which to perform an operation

resourceType

The type of the resource on which to perform an operation

roles

The roles of app members on which to perform an operation

screenshotId

The id of an app screenshot

seed

Whether the resources or assets are seed instead.

selectedGroupId

The currently selected group of the app member.

serviceSecretId

The id of the app service secret on which to perform an operation

trainingId

Id of the training on which the operation will be performed.

view

The view of the resource to fetch.

webhookName

The name of the webhook to call

webhookSecretId

The id of the app webhook secret on which to perform an operation

The OAuth2 client credentials

A representation of a user’s OAuth2 consent when logging in to an app.

The URI to redirect the user back to.

The OAuth2 scope requested by the app.

A resource definition

A `multipart/form-data` representation of a resource.

A list of assets that should be linked to the resource.

A user profile

An app response

A block definition response

The default error response.

An invite response

An OAuth2 authorization code.

An organization response

A resource response

A subscription response.

A mapping of resources names to resource subscriptions.

The base properties of an action definition.

This may be used to remap data before it is passed into the action function.

This may be used to remap data after it is passed into the action function.

Another action that is dispatched when the action has been dispatched successfully.

Another action that is dispatched when the action has failed to dispatch successfully.

This action sends a Google Analytics event.

It returns the input data.

The name of the analytics target event to send.

A remapper whose result will be sent to Google Analytics as additional context

An app definition defines what an app will look like.

The unique identifier for the app.

This value will be generated automatically by the API.

The URL path segment on which this app is reachable.

This may only contain lower case characters, numbers, and hyphens. By default this is a
normalized version of the app name.

The domain name on which this app should be served.

If this is unspecified, the app will be served from the path on the domain of the server
`HOSTNAME` variable.

Determine the app visibility of the app in the Appsemble app store.

This doesn’t affect whether or not the app can be accessed on its own domain.

- **public**: The app is publicly listed in the Appsemble app store.
- **unlisted**: The app store page can be accessed, but the app isn’t listed publicly in the
  Appsemble app store.
- **private**: The app is only visible to people who are part of the organization.

Whether or not people who have access to the app may see the app definition.

Determines whether this app should be locked from being updated.
      If this is set to `fullLock`, no changes can be made to the app,
      if this is set to `studioLock`, no changes can be made from the studio but updating from the CLI is possible,
      and to make any changes from the studio, this should be set to `unlocked`.

Whether to display app member name in the title bar.

Whether to display installtion prompt to the users of app

Determines whether this app should be included when fetching for templates.

Determines whether this app should be used in demo mode.

A long description for the app.

The long description will be rendered on the app details page. Markdown content is supported.

A list of URLs referencing app screenshots

If this is specified, Google analytics will be applied to the app

The Sentry DSN to use for this app.

If this is specified, the given Sentry DSN will be used for error tracking. Apps without a custom
domain fall back to use the Appsemble server Sentry DSN.

The name that should be used as the sentry environment.

  This is only applied when `sentryDsn` is specified.

Custom app logic as a JavaScript string

Appsemble SDK interfaces implementations

An object representing a member of an app

The app this account is for.

The app member info.

The single sign on configurations which link the user to an external account.

An app collection

The unique ID of the app collection.

The name of the app collection.

The ID of the organization that owns the app collection.

The name of the organization that owns the app collection.

The visibility of the app collection.

The app collection’s expert/curator.

The name of the expert.

The description of the expert.

The URL at which the expert’s profile image can be found.

The URL at which the app collection’s header image can be found.

When the collection was first created as an ISO 8601 formatted string

When the collection was last updated as an ISO 8601 formatted string

An app collection

The name of the app collection.

The visibility of the app collection.

The name of the app collection’s expert/curator.

The description of the app collection’s expert/curator.

The profile image of the app collection’s expert/curator.

The header image of the app collection.

An app definition describes what an Appsemble app looks like.

The human readable name of the app.

This will be displayed for example on the home screen or in the browser tab.

A short description describing the app.

This will be displayed on the app store.

Properties related to the layout of the app.

The strategy to use for apps to subscribe to push notifications.

If specified, push notifications can be sent to subscribed users via the _Notifications_ tab in the
app details page in Appsemble Studio. Setting this to `opt-in` allows for users to opt into
receiving push notifications by pressing the subscribe button in the App settings page. Setting this
to `startup` will cause Appsemble to immediately request for the permission upon opening the app.
If this is set to `login`, the app will request permissions for push notification once the user
logs in.

> **Note**: Setting `notifications` to `startup` is not recommended, due to its invasive nature.

The name of the page that should be displayed when the app is initially loaded.

This **must** match the name of a page defined for the app.

The default language for the app.

Resources define how Appsemble can store data for an app.

The most basic resource has a `schema` property and defines the minimal security rules.

A single resource definition.

Role and guest definitions that may be used by the app.

The pages of the app.

A list of cron jobs that are associated with this app.

A list of callable webhooks that are associated with this app.

Helper property that can be used to store YAML anchors.

Definition of the companion containers to be created.

The default registry used to pull images for companion containers.

The layout definition allows you to tweak several layout elements of the app.

The location of the login button.

The location of the settings button.

If set to `navigation`, it will only be visible if `login` is also visible in `navigation`.

The location of the feedback button.

If set to `navigation`, it will only be visible if `login` is also visible in `navigation`.

The location of the install button.

If set to `navigation`, it will only be visible if `login` is also visible in `navigation`.

The navigation type to use.

If this is omitted, a collapsable side navigation menu will be rendered on the left.

An object representing a member of an app

The id of the app member.

The role of the app member within the app.

The full name of the app member.

The email address of the app member.

Allows the app member to patch their own app member account.

Does nothing if the app member isn’t logged in.

The new full name of the app member.

The updated custom properties for the app member.

Values will be validated based on `members.properties`, if defined in the app definition.

The picture for the patched app member

Allows the app member to delete another app member.

Does nothing if the app member isn’t logged in.

The id of the app member to be deleted.

An object representing the OAuth2 info of a member of an app

The id of the app member.

The full name of the app member.

The email address of the app member.

Whether this email address has been verified.

The URL of the profile picture of the app member.

The locale of the app member.

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/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

The time zone of the app member.

The role of the app member within the app

The custom properties of the app member.

Allows the app member to invite another app member using an email address and a role.

Does nothing if the app member is not logged in.

The email to invite.

The role of the invited app member.

Allows the app member to login using an email address and a password.

Does nothing if the app member is already logged in.

The password to log in with.

The email to log in with.

Allow the app members to log out of the application.

Allows the app member to patch the properties of another app member account.

Does nothing if the app member isn’t logged in.

The new full name name of the app member.

The updated custom properties for the app member.

Values will be validated based on `members.properties`, if defined in the app definition.

Definition for an app member custom property.

The object for the reference to another resource

The resource referenced by this app member property.

Definition for an app member property.

Allows the currently logged in app member to fetch a list of app members by their roles.

Does nothing if the app member isn’t logged in.

The roles of the app members that would be fetched.

Additional filters to fetch members based on properties and other fields

Allows the app member to register using an email address and a password.

Does nothing if the app member is already logged in.

The password to log in with.

The email to log in with.

The full name of the app member.

The image to use for the profile picture of the app member.

The custom properties for the app member.

Values will be validated based on `members.properties`, if defined in the app definition.

Whether to login after registering.

Allows the app member to update the role of another app member account.

Does nothing if the app member isn’t logged in.

The id of the app member.

The updated role of the app member.

The role must exist in the roles property of the app's security definition or in the predefined app roles in the system -
`Member`, `MembersManager`, `GroupMembersManager`, `GroupsManager`, `ResourcesManager` and `Owner`

Definition for app member properties.

The properties object configuring app members

A single app member property definition.

The response object of an messages create call.

The language the messages represent.

If this is true, the app lock is ignored.

Settings for login in apps using third party OAuth2 providers

authorizationUrl clientId clientSecret icon name scope tokenUrl

An autogenerated ID

The OAuth2 redirect URL.

The URL to request access tokens from.

The public client id which identifies Appsemble to the authorization server.

The OAuth2 client secret.

A Font Awesome icon which represents the OAuth2 provider.

A display name which represents the OAuth2 provider.

The login scope that will be requested from the authorization server.

The URL to request user info from

A remapper to apply on retrieved user information from the user info endpoint.

When the secret was created originally.

When the secret was last updated.

App service secret settings

An autogenerated ID.

An optional name to give extra clarity what the secret is used for.

The url pattern that is matched when a proxied request action is called.

http-basic client-certificate client-credentials cookie custom-header query-parameter

The method to authenticate the request action with.

The parameter name, header name, username or certificate that goes with the secret.

The secret to authenticate the proxied outgoing request with.

The URL to request access tokens from.

The scope to request access tokens for.

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.

The custom certificate authority.

App variable

An autogenerated ID.

The name of the variable, that will be accessible from clients.

The value of the variable.

App webhook secret settings

An autogenerated ID.

An optional name to give extra clarity what the secret is used for.

The name of the webhook the secret is tied to

The autogenerated secret to authenticate the webhook caller with.

A mapping of the messages for this language

Translations for the core of the app.

Translations for global block messages and meta properties of the app.

Translations for the core of the app.

The name of the block type.

The version of the block.

A list of custom message IDs used by the app.

If a remapper is an array, it represents a chain of remappers.

Each item represents a remapper which is called with the result of the remapper before it.

If an array is nested, it will be flattened. This allows you to create reusable remappers and
reference them using YAML anchors.

The response object of an asset publish call.

The unique identifier for the asset.

The IANA MIME type of the asset.

The filename of the asset.

The given name of the asset. Assets may be referenced by their name or ID in the API.

A block that is displayed on a page.

The type of the block.

A block type follows the format `@organization/name`. If the organization is _appsemble_, it may
be omitted.

Some examples:

- `form`
- `@amsterdam/splash`

The version of the block to use.

Since blocks may change over time, a version must be specified in order to ensure that the block
will remain the same until it is manually updated.

An override of the block’s default layout.

`float` sets the block position to float on the page and does not collide with other blocks.
Layout float can be combined with the `position` property to place the block on the desired location.
`grow` adds space between blocks so the page is filled.
`static` on the contrary, does not add extra space between blocks.

Whether to render the block or not

An optional header to render above the block.

The list of roles that are allowed to view this block.

If a user does not have the right role, the block is not rendered.

For floating blocks this property defines where the block should float.

top left
top
top right
left
right
bottom left
bottom
bottom right

A free form mapping of named parameters.

The exact meaning of the parameters depends on the block type.

A mapping of actions that can be fired by the block to action handlers.

A version of a block definition

Block versions can’t be updated or deleted. This ensures apps that use a block version can never
be broken by alterations of block definitions.

The name of a block.

This uses the same form as scoped npm packages. For example, `@appsemble/form`.

The description of the block.

The long description of the block.

An icon to represent the block in Appsemble studio.

The relative URL on which the icon is served

A [semver](https://semver.org) representation of the block version.

Whether the block should be listed publicly for users who aren’t part of the block’s organization.

- **`public`**: The block is visible for everyone.
- **`unlisted`**: The block will only be visible if the user is logged in and is part of the block’s organization.

How the block will be displayed on the screen.

- **`float`**: The block will float somewhere on the screen.
- **`grow`**: The block will be positioned in the main page. It will grow to fill up remaining
  space on the page.
- **`static`**: The block will be positioned in the main page. It will take up a fixed amount of
  space.
- **`hidden`**: The block will not be rendered at all.

An object which describes the actions a block can trigger.

This will be used to validate app definitions.

A draft 7 JSON schema to use for block parameter validation.

If the parameters of a block definition don’t conform to this schema, the app definition will be
considered invalid.

An object describing the names of the events the block can listen and emit to.

A mapping of events this block may listen on

A mapping of events this block may listen on

A mapping of events this block may emit

A mapping of events this block may emit

deprecated

The translated messages for the block.

English (`en`) messages are required.

A mapping of language IDs to their English translation

The default translations to use.

A mapping of language IDs to their internationalized translation

The translated messages for this language.

A list of file assets that belong to the app version.

A list of exmples how the block can be used within an app definition.

Run another action if a certain contition is met.

A remapper to determine the condition to check.

If this yields a truthy value, the `then` action is called. Otherwise the `else` action is
called.

This action is called if the `if` remapper yields a truthy value.

This action is called if the `if` remapper yields a falsy value.

An object describing a companion container

Alias used to reference the container

Name of the image used for the container

Port used by the image provided

Maximum amount of resources the container can use. Deafult: 1 CPU and 512Mi memory

Environment variables that will be used within the container

Each item is an environment variable. `useValueFromSecret` property determines whether the value is taken literally or from and existing secret

Name of the environment variable

If set to true, will retrieve the value from the Kubernetes secret, the value property will refer to the secret key. If false, will take the value literally

The value of the environment variable. If `useValueFromSecret` is true, this property will refer to the Kubernetes secret's key

Metadata including labels and annotations to be added to the container

Groups pages together under a collapsible parent page. Following is an example of
how this can be used:
```yaml
pages:
  - name: Page 1
    type: container
    pages:
      - name: Contained page 1
        blocks:
          - type: action-button
            version: 0.29.8
            parameters:
              icon: git-alt
            actions:
              onClick:
                type: link
                to: Contained page 2
      - name: Contained page 2
        blocks:
          - type: action-button
            version: 0.29.8
            parameters:
              icon: git-alt
            actions:
              onClick:
                type: link
                to: Contained page 1
```

The pages of the app.

The name of an app.

This field is always required and must be unique within the app, meaning that it is not possible to
have two pages with the same name. The name of the page is displayed at the *app bar* of each page as well as in the side navigational menu.

> **Note**: The URL used to navigate to pages is determined by this property.

Whether or not the page name should be displayed in the *app bar*.

The name of the page when displayed in the navigation menu.

  Context property `name` can be used to access the name of the page.

Whether or not the page should be displayed in navigational menus.

  By default all pages without parameters are added to navigational menus. Set to `true` to hide the
  page from menus.

The type of navigation displayed on the page.

This overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or
App navigation are not set.

Set to `bottom` to use a navigation pane at the bottom of the screen instead of the default side
menu. Set to `hidden` to display no navigational menus at all.

An optional icon from the fontawesome icon set

This will be displayed in the navigation menu.

Page parameters can be used for linking to a page that should display a single resource.

This defined as a list of strings representing the properties to pass through. More often than not
passing `id` through is sufficient, depending on the block.

The list of roles that are allowed to view this page.

If the user doesn’t have any of the roles in the list the page will be unavailable to them. An empty
list can be used to specify that users need to log in but do not need a specific role.

Users trying to visit a page without having the correct roles will be redirected to the first page
that they are allowed to view. If there aren’t any accessible pages, the user will be logged out and
instructed to contact the app owner to get permissions.

A Remapper that resolves to a number to be visibile in the side-menu.

Use the controller to handle the action.

The name of the function in the controller that will handle the action

A controller for application logic.

A mapping of actions that can be fired by the controller to action handlers.

A cron definition defines tasks that Appsemble will run periodically for the app.

A crontab string to define when the action should be run.

See [Crontab guru](https://crontab.guru) for details

The action to run when the cronjob is triggered.

An action to parse the CSV files

The CSV file to be parsed

The delimiter to be used, defaults to comma(",")

A custom font definition.

Use a custom font.

The font family to use in the app.

Make sure the font is available using custom CSS.

This action opens a pop-up dialog that can be used to seamlessly transition to a new set of blocks temporarily.

Dialogs can be closed by calling the [`dialog.ok`](#DialogOkActionDefinition) or
[`dialog.error`](#DialogErrorActionDefinition). Users can still manually close dialogs, which
should be supported by the app.

Blocks with the layout type `float` (e.g. `action-button`) do not work in this action.

An optional title to set in the dialog header.

Whether users are allowed to close the dialog by clicking outside of it or on the close button.

Whether the dialog should be displayed full screen as if it’s a new page, or as a pop-up.

A list of blocks to display in the dialog.

Close an open dialog.

The dialog action that opened the dialog will be rejected with the data passed to this action.

Close an open dialog.

The dialog action that opened the dialog will be resolved with the data passed to this action.

Download the data as a file.

The filename to save the file as. This must include a file extension.

Run an action for each entry in an array.

The actions are run in parallel.

If the input is not an array, the action will be applied to the input instead.

Runs the action in series instead of parallel

This action is called for each item in the input array.

The email action can be used to send emails via the Appsemble server.

If `to`, `cc`, and `bcc` all end up being empty, no emails will be sent but the action will still continue as normal.

The address the email should be sent to. Can be either in the format of `test@example.com`, or `John Doe <test@example.com>`

The name of the sender of the email.

The list of additional email addresses email should be sent to. Uses the same format as `to`. Every email address in the CC is visible to all recipients.

The list of additional email addresses email should be sent to. Uses the same format as `to`. Email addresses in the BCC are hidden from other recipients.

The subject of the email.

The body of the email. The content of the body is converted to HTML using the Markdown syntax.

The attachments to include in the email.

The remapper must resolve to an object containing the following properties:

- `target`: The asset ID or link to download contents from to add as an attachment. This is mutually exclusive with `content`.
- `content`: The raw content to include as the file content. This is mutually exclusive with `target`.
- `filename`: The filename to include the attachment as.
- `accept` If the target is a URL, this will be set as the HTTP `Accept` header when downloading the file.

If the attachment is a string, it will be treated as the target.

The generic error object returned by any expected API errors.

Matches the HTTP response status code.

Matches the HTTP response status description.

A message describing the error.

This action allows for other blocks to emit data upon triggering the action.

This can be used to make blocks interact with each other, such as triggering the `data-loader`
block to refresh itself by sending an event action that matches the name of what the block is
listening to.

The name of the event to emit.

If specified, the action will wait for this event to have been emitted and respond with its data.

An object describing the names of the events the block can listen and emit to.

This property defines the events this block will listen on.

The key is the name of the event will listen on. The value is a user defined event name which should
match the name of an emitted event on the same page.

This property defines the events this block will emit.

The key is the name of the event will emit. The value is a user defined event name which should
match the name of a event on the same page that’s being listened on.

An object describing the comparison that should be applied to the key in an OData filter.

On [flow pages](#flow-page-definition-sub-pages), return to the previous page if
it is present. If this is called on the first page, nothing happens.

On [flow pages](../guides/page-types#flow-page), cancel the ongoing flow and invoke the page's [`onFlowFinish`](#flow-page-actions-definition-on-flow-finish) action.

On [flow pages](../guides/page-types#flow-page), triggers the
[`onFlowFinish`](#flow-page-actions-definition-on-flow-finish) action on the page.

On [flow pages](#flow-page-definition-sub-pages), proceed to the next page if it
is present. Otherwise, the flow is considered to be complete and [`flow.finish`](#flowfinish) will
be called instead.

These actions are fired on a flow page.

This action gets triggered when `flow.cancel` gets called.

This action gets triggered when a flow is finished.

A flow is finished when `flow.finish` gets called, or when `flow.next` gets called on the final
subpage. This action has a special property in which the cumulative input data from each previous subpage gets sent, instead of the individual block that triggered this action.

This action is fired when a page loads, highly helpful in loading data for the page

Shows a set of sub pages in a certain order which the user can navigate through.

Steps belonging to this page's flow.

The method that should be used to display the status of flow pages.

Whether to retain the flow data when navigating away to another page outside the flow.

By default the flow page retains it's data after navigating once. Set to false to clear it.

Whether or not the page name should be displayed in the *app bar*.

The name of the page when displayed in the navigation menu.

  Context property `name` can be used to access the name of the page.

Whether or not the page should be displayed in navigational menus.

  By default all pages without parameters are added to navigational menus. Set to `true` to hide the
  page from menus.

The type of navigation displayed on the page.

This overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or
App navigation are not set.

Set to `bottom` to use a navigation pane at the bottom of the screen instead of the default side
menu. Set to `hidden` to display no navigational menus at all.

An optional icon from the fontawesome icon set

This will be displayed in the navigation menu.

Page parameters can be used for linking to a page that should display a single resource.

This defined as a list of strings representing the properties to pass through. More often than not
passing `id` through is sufficient, depending on the block.

A Remapper that resolves to a number to be visibile in the side-menu.

On [flow pages](#flow-page-definition-sub-pages), move to a specific step.

The name of the step to move to.

This is a remapper which gets called with the action input and context.

A Google font definition.

Use a font from [Google Fonts](https://fonts.google.com).

ABeeZee
ADLaM Display
AR One Sans
Abel
Abhaya Libre
Aboreto
Abril Fatface
Abyssinica SIL
Aclonica
Acme
Actor
Adamina
Advent Pro
Afacad
Agbalumo
Agdasima
Aguafina Script
Akatab
Akaya Kanadaka
Akaya Telivigala
Akronim
Akshar
Aladin
Alata
Alatsi
Albert Sans
Aldrich
Alef
Alegreya
Alegreya SC
Alegreya Sans
Alegreya Sans SC
Aleo
Alex Brush
Alexandria
Alfa Slab One
Alice
Alike
Alike Angular
Alkalami
Alkatra
Allan
Allerta
Allerta Stencil
Allison
Allura
Almarai
Almendra
Almendra Display
Almendra SC
Alumni Sans
Alumni Sans Collegiate One
Alumni Sans Inline One
Alumni Sans Pinstripe
Amarante
Amaranth
Amatic SC
Amethysta
Amiko
Amiri
Amiri Quran
Amita
Anaheim
Andada Pro
Andika
Anek Bangla
Anek Devanagari
Anek Gujarati
Anek Gurmukhi
Anek Kannada
Anek Latin
Anek Malayalam
Anek Odia
Anek Tamil
Anek Telugu
Angkor
Annie Use Your Telescope
Anonymous Pro
Antic
Antic Didone
Antic Slab
Anton
Antonio
Anuphan
Anybody
Aoboshi One
Arapey
Arbutus
Arbutus Slab
Architects Daughter
Archivo
Archivo Black
Archivo Narrow
Are You Serious
Aref Ruqaa
Aref Ruqaa Ink
Arima
Arimo
Arizonia
Armata
Arsenal
Artifika
Arvo
Arya
Asap
Asap Condensed
Asar
Asset
Assistant
Astloch
Asul
Athiti
Atkinson Hyperlegible
Atma
Atomic Age
Aubrey
Audiowide
Autour One
Average
Average Sans
Averia Gruesa Libre
Averia Libre
Averia Sans Libre
Averia Serif Libre
Azeret Mono
B612
B612 Mono
BIZ UDGothic
BIZ UDMincho
BIZ UDPGothic
BIZ UDPMincho
Babylonica
Bacasime Antique
Bad Script
Bagel Fat One
Bahiana
Bahianita
Bai Jamjuree
Bakbak One
Ballet
Baloo 2
Baloo Bhai 2
Baloo Bhaijaan 2
Baloo Bhaina 2
Baloo Chettan 2
Baloo Da 2
Baloo Paaji 2
Baloo Tamma 2
Baloo Tammudu 2
Baloo Thambi 2
Balsamiq Sans
Balthazar
Bangers
Barlow
Barlow Condensed
Barlow Semi Condensed
Barriecito
Barrio
Basic
Baskervville
Battambang
Baumans
Bayon
Be Vietnam Pro
Beau Rivage
Bebas Neue
Belanosima
Belgrano
Bellefair
Belleza
Bellota
Bellota Text
BenchNine
Benne
Bentham
Berkshire Swash
Besley
Beth Ellen
Bevan
BhuTuka Expanded One
Big Shoulders Display
Big Shoulders Inline Display
Big Shoulders Inline Text
Big Shoulders Stencil Display
Big Shoulders Stencil Text
Big Shoulders Text
Bigelow Rules
Bigshot One
Bilbo
Bilbo Swash Caps
BioRhyme
BioRhyme Expanded
Birthstone
Birthstone Bounce
Biryani
Bitter
Black And White Picture
Black Han Sans
Black Ops One
Blaka
Blaka Hollow
Blaka Ink
Blinker
Bodoni Moda
Bokor
Bona Nova
Bonbon
Bonheur Royale
Boogaloo
Borel
Bowlby One
Bowlby One SC
Braah One
Brawler
Bree Serif
Bricolage Grotesque
Bruno Ace
Bruno Ace SC
Brygada 1918
Bubblegum Sans
Bubbler One
Buda
Buenard
Bungee
Bungee Hairline
Bungee Inline
Bungee Outline
Bungee Shade
Bungee Spice
Butcherman
Butterfly Kids
Cabin
Cabin Condensed
Cabin Sketch
Caesar Dressing
Cagliostro
Cairo
Cairo Play
Caladea
Calistoga
Calligraffitti
Cambay
Cambo
Candal
Cantarell
Cantata One
Cantora One
Caprasimo
Capriola
Caramel
Carattere
Cardo
Carlito
Carme
Carrois Gothic
Carrois Gothic SC
Carter One
Castoro
Castoro Titling
Catamaran
Caudex
Caveat
Caveat Brush
Cedarville Cursive
Ceviche One
Chakra Petch
Changa
Changa One
Chango
Charis SIL
Charm
Charmonman
Chathura
Chau Philomene One
Chela One
Chelsea Market
Chenla
Cherish
Cherry Bomb One
Cherry Cream Soda
Cherry Swash
Chewy
Chicle
Chilanka
Chivo
Chivo Mono
Chokokutai
Chonburi
Cinzel
Cinzel Decorative
Clicker Script
Climate Crisis
Coda
Codystar
Coiny
Combo
Comfortaa
Comforter
Comforter Brush
Comic Neue
Coming Soon
Comme
Commissioner
Concert One
Condiment
Content
Contrail One
Convergence
Cookie
Copse
Corben
Corinthia
Cormorant
Cormorant Garamond
Cormorant Infant
Cormorant SC
Cormorant Unicase
Cormorant Upright
Courgette
Courier Prime
Cousine
Coustard
Covered By Your Grace
Crafty Girls
Creepster
Crete Round
Crimson Pro
Crimson Text
Croissant One
Crushed
Cuprum
Cute Font
Cutive
Cutive Mono
DM Mono
DM Sans
DM Serif Display
DM Serif Text
Dai Banna SIL
Damion
Dancing Script
Dangrek
Darker Grotesque
Darumadrop One
David Libre
Dawning of a New Day
Days One
Dekko
Dela Gothic One
Delicious Handrawn
Delius
Delius Swash Caps
Delius Unicase
Della Respira
Denk One
Devonshire
Dhurjati
Didact Gothic
Diphylleia
Diplomata
Diplomata SC
Do Hyeon
Dokdo
Domine
Donegal One
Dongle
Doppio One
Dorsa
Dosis
DotGothic16
Dr Sugiyama
Duru Sans
DynaPuff
Dynalight
EB Garamond
Eagle Lake
East Sea Dokdo
Eater
Economica
Eczar
Edu NSW ACT Foundation
Edu QLD Beginner
Edu SA Beginner
Edu TAS Beginner
Edu VIC WA NT Beginner
El Messiri
Electrolize
Elsie
Elsie Swash Caps
Emblema One
Emilys Candy
Encode Sans
Encode Sans Condensed
Encode Sans Expanded
Encode Sans SC
Encode Sans Semi Condensed
Encode Sans Semi Expanded
Engagement
Englebert
Enriqueta
Ephesis
Epilogue
Erica One
Esteban
Estonia
Euphoria Script
Ewert
Exo
Exo 2
Expletus Sans
Explora
Fahkwang
Familjen Grotesk
Fanwood Text
Farro
Farsan
Fascinate
Fascinate Inline
Faster One
Fasthand
Fauna One
Faustina
Federant
Federo
Felipa
Fenix
Festive
Figtree
Finger Paint
Finlandica
Fira Code
Fira Mono
Fira Sans
Fira Sans Condensed
Fira Sans Extra Condensed
Fjalla One
Fjord One
Flamenco
Flavors
Fleur De Leah
Flow Block
Flow Circular
Flow Rounded
Foldit
Fondamento
Fontdiner Swanky
Forum
Fragment Mono
Francois One
Frank Ruhl Libre
Fraunces
Freckle Face
Fredericka the Great
Fredoka
Freehand
Fresca
Frijole
Fruktur
Fugaz One
Fuggles
Fuzzy Bubbles
GFS Didot
GFS Neohellenic
Gabarito
Gabriela
Gaegu
Gafata
Gajraj One
Galada
Galdeano
Galindo
Gamja Flower
Gantari
Gasoek One
Gayathri
Gelasio
Gemunu Libre
Genos
Gentium Book Plus
Gentium Plus
Geo
Geologica
Georama
Geostar
Geostar Fill
Germania One
Gideon Roman
Gidugu
Gilda Display
Girassol
Give You Glory
Glass Antiqua
Glegoo
Gloock
Gloria Hallelujah
Glory
Gluten
Goblin One
Gochi Hand
Goldman
Golos Text
Gorditas
Gothic A1
Gotu
Goudy Bookletter 1911
Gowun Batang
Gowun Dodum
Graduate
Grand Hotel
Grandiflora One
Grandstander
Grape Nuts
Gravitas One
Great Vibes
Grechen Fuemen
Grenze
Grenze Gotisch
Grey Qo
Griffy
Gruppo
Gudea
Gugi
Gulzar
Gupter
Gurajada
Gwendolyn
Habibi
Hachi Maru Pop
Hahmlet
Halant
Hammersmith One
Hanalei
Hanalei Fill
Handjet
Handlee
Hanken Grotesk
Hanuman
Happy Monkey
Harmattan
Headland One
Hedvig Letters Sans
Hedvig Letters Serif
Heebo
Henny Penny
Hepta Slab
Herr Von Muellerhoff
Hi Melody
Hina Mincho
Hind
Hind Guntur
Hind Madurai
Hind Siliguri
Hind Vadodara
Holtwood One SC
Homemade Apple
Homenaje
Honk
Hubballi
Hurricane
IBM Plex Mono
IBM Plex Sans
IBM Plex Sans Arabic
IBM Plex Sans Condensed
IBM Plex Sans Devanagari
IBM Plex Sans Hebrew
IBM Plex Sans JP
IBM Plex Sans KR
IBM Plex Sans Thai
IBM Plex Sans Thai Looped
IBM Plex Serif
IM Fell DW Pica
IM Fell DW Pica SC
IM Fell Double Pica
IM Fell Double Pica SC
IM Fell English
IM Fell English SC
IM Fell French Canon
IM Fell French Canon SC
IM Fell Great Primer
IM Fell Great Primer SC
Ibarra Real Nova
Iceberg
Iceland
Imbue
Imperial Script
Imprima
Inclusive Sans
Inconsolata
Inder
Indie Flower
Ingrid Darling
Inika
Inknut Antiqua
Inria Sans
Inria Serif
Inspiration
Instrument Sans
Instrument Serif
Inter
Inter Tight
Irish Grover
Island Moments
Istok Web
Italiana
Italianno
Itim
Jacques Francois
Jacques Francois Shadow
Jaldi
JetBrains Mono
Jim Nightshade
Joan
Jockey One
Jolly Lodger
Jomhuria
Jomolhari
Josefin Sans
Josefin Slab
Jost
Joti One
Jua
Judson
Julee
Julius Sans One
Junge
Jura
Just Another Hand
Just Me Again Down Here
K2D
Kablammo
Kadwa
Kaisei Decol
Kaisei HarunoUmi
Kaisei Opti
Kaisei Tokumin
Kalam
Kalnia
Kameron
Kanit
Kantumruy Pro
Karantina
Karla
Karma
Katibeh
Kaushan Script
Kavivanar
Kavoon
Kay Pho Du
Kdam Thmor Pro
Keania One
Kelly Slab
Kenia
Khand
Khmer
Khula
Kings
Kirang Haerang
Kite One
Kiwi Maru
Klee One
Knewave
KoHo
Kodchasan
Koh Santepheap
Kolker Brush
Konkhmer Sleokchher
Kosugi
Kosugi Maru
Kotta One
Koulen
Kranky
Kreon
Kristi
Krona One
Krub
Kufam
Kulim Park
Kumar One
Kumar One Outline
Kumbh Sans
Kurale
La Belle Aurore
Labrada
Lacquer
Laila
Lakki Reddy
Lalezar
Lancelot
Langar
Lateef
Lato
Lavishly Yours
League Gothic
League Script
League Spartan
Leckerli One
Ledger
Lekton
Lemon
Lemonada
Lexend
Lexend Deca
Lexend Exa
Lexend Giga
Lexend Mega
Lexend Peta
Lexend Tera
Lexend Zetta
Libre Barcode 128
Libre Barcode 128 Text
Libre Barcode 39
Libre Barcode 39 Extended
Libre Barcode 39 Extended Text
Libre Barcode 39 Text
Libre Barcode EAN13 Text
Libre Baskerville
Libre Bodoni
Libre Caslon Display
Libre Caslon Text
Libre Franklin
Licorice
Life Savers
Lilita One
Lily Script One
Limelight
Linden Hill
Linefont
Lisu Bosa
Literata
Liu Jian Mao Cao
Livvic
Lobster
Lobster Two
Londrina Outline
Londrina Shadow
Londrina Sketch
Londrina Solid
Long Cang
Lora
Love Light
Love Ya Like A Sister
Loved by the King
Lovers Quarrel
Luckiest Guy
Lugrasimo
Lumanosimo
Lunasima
Lusitana
Lustria
Luxurious Roman
Luxurious Script
M PLUS 1
M PLUS 1 Code
M PLUS 1p
M PLUS 2
M PLUS Code Latin
M PLUS Rounded 1c
Ma Shan Zheng
Macondo
Macondo Swash Caps
Mada
Magra
Maiden Orange
Maitree
Major Mono Display
Mako
Mali
Mallanna
Mandali
Manjari
Manrope
Mansalva
Manuale
Marcellus
Marcellus SC
Marck Script
Margarine
Marhey
Markazi Text
Marko One
Marmelad
Martel
Martel Sans
Martian Mono
Marvel
Mate
Mate SC
Material Icons
Material Icons Outlined
Material Icons Round
Material Icons Sharp
Material Icons Two Tone
Material Symbols Outlined
Material Symbols Rounded
Material Symbols Sharp
Maven Pro
McLaren
Mea Culpa
Meddon
MedievalSharp
Medula One
Meera Inimai
Megrim
Meie Script
Meow Script
Merienda
Merriweather
Merriweather Sans
Metal
Metal Mania
Metamorphous
Metrophobic
Michroma
Milonga
Miltonian
Miltonian Tattoo
Mina
Mingzat
Miniver
Miriam Libre
Mirza
Miss Fajardose
Mitr
Mochiy Pop One
Mochiy Pop P One
Modak
Modern Antiqua
Mogra
Mohave
Moirai One
Molengo
Molle
Monda
Monofett
Monomaniac One
Monoton
Monsieur La Doulaise
Montaga
Montagu Slab
MonteCarlo
Montez
Montserrat
Montserrat Alternates
Montserrat Subrayada
Moo Lah Lah
Mooli
Moon Dance
Moul
Moulpali
Mountains of Christmas
Mouse Memoirs
Mr Bedfort
Mr Dafoe
Mr De Haviland
Mrs Saint Delafield
Mrs Sheppards
Ms Madi
Mukta
Mukta Mahee
Mukta Malar
Mukta Vaani
Mulish
Murecho
MuseoModerno
My Soul
Mynerve
Mystery Quest
NTR
Nabla
Nanum Brush Script
Nanum Gothic
Nanum Gothic Coding
Nanum Myeongjo
Nanum Pen Script
Narnoor
Neonderthaw
Nerko One
Neucha
Neuton
New Rocker
New Tegomin
News Cycle
Newsreader
Niconne
Niramit
Nixie One
Nobile
Nokora
Norican
Nosifer
Notable
Nothing You Could Do
Noticia Text
Noto Color Emoji
Noto Emoji
Noto Kufi Arabic
Noto Music
Noto Naskh Arabic
Noto Nastaliq Urdu
Noto Rashi Hebrew
Noto Sans
Noto Sans Adlam
Noto Sans Adlam Unjoined
Noto Sans Anatolian Hieroglyphs
Noto Sans Arabic
Noto Sans Armenian
Noto Sans Avestan
Noto Sans Balinese
Noto Sans Bamum
Noto Sans Bassa Vah
Noto Sans Batak
Noto Sans Bengali
Noto Sans Bhaiksuki
Noto Sans Brahmi
Noto Sans Buginese
Noto Sans Buhid
Noto Sans Canadian Aboriginal
Noto Sans Carian
Noto Sans Caucasian Albanian
Noto Sans Chakma
Noto Sans Cham
Noto Sans Cherokee
Noto Sans Chorasmian
Noto Sans Coptic
Noto Sans Cuneiform
Noto Sans Cypriot
Noto Sans Cypro Minoan
Noto Sans Deseret
Noto Sans Devanagari
Noto Sans Display
Noto Sans Duployan
Noto Sans Egyptian Hieroglyphs
Noto Sans Elbasan
Noto Sans Elymaic
Noto Sans Ethiopic
Noto Sans Georgian
Noto Sans Glagolitic
Noto Sans Gothic
Noto Sans Grantha
Noto Sans Gujarati
Noto Sans Gunjala Gondi
Noto Sans Gurmukhi
Noto Sans HK
Noto Sans Hanifi Rohingya
Noto Sans Hanunoo
Noto Sans Hatran
Noto Sans Hebrew
Noto Sans Imperial Aramaic
Noto Sans Indic Siyaq Numbers
Noto Sans Inscriptional Pahlavi
Noto Sans Inscriptional Parthian
Noto Sans JP
Noto Sans Javanese
Noto Sans KR
Noto Sans Kaithi
Noto Sans Kannada
Noto Sans Kawi
Noto Sans Kayah Li
Noto Sans Kharoshthi
Noto Sans Khmer
Noto Sans Khojki
Noto Sans Khudawadi
Noto Sans Lao
Noto Sans Lao Looped
Noto Sans Lepcha
Noto Sans Limbu
Noto Sans Linear A
Noto Sans Linear B
Noto Sans Lisu
Noto Sans Lycian
Noto Sans Lydian
Noto Sans Mahajani
Noto Sans Malayalam
Noto Sans Mandaic
Noto Sans Manichaean
Noto Sans Marchen
Noto Sans Masaram Gondi
Noto Sans Math
Noto Sans Mayan Numerals
Noto Sans Medefaidrin
Noto Sans Meetei Mayek
Noto Sans Mende Kikakui
Noto Sans Meroitic
Noto Sans Miao
Noto Sans Modi
Noto Sans Mongolian
Noto Sans Mono
Noto Sans Mro
Noto Sans Multani
Noto Sans Myanmar
Noto Sans NKo
Noto Sans NKo Unjoined
Noto Sans Nabataean
Noto Sans Nag Mundari
Noto Sans Nandinagari
Noto Sans New Tai Lue
Noto Sans Newa
Noto Sans Nushu
Noto Sans Ogham
Noto Sans Ol Chiki
Noto Sans Old Hungarian
Noto Sans Old Italic
Noto Sans Old North Arabian
Noto Sans Old Permic
Noto Sans Old Persian
Noto Sans Old Sogdian
Noto Sans Old South Arabian
Noto Sans Old Turkic
Noto Sans Oriya
Noto Sans Osage
Noto Sans Osmanya
Noto Sans Pahawh Hmong
Noto Sans Palmyrene
Noto Sans Pau Cin Hau
Noto Sans Phags Pa
Noto Sans Phoenician
Noto Sans Psalter Pahlavi
Noto Sans Rejang
Noto Sans Runic
Noto Sans SC
Noto Sans Samaritan
Noto Sans Saurashtra
Noto Sans Sharada
Noto Sans Shavian
Noto Sans Siddham
Noto Sans SignWriting
Noto Sans Sinhala
Noto Sans Sogdian
Noto Sans Sora Sompeng
Noto Sans Soyombo
Noto Sans Sundanese
Noto Sans Syloti Nagri
Noto Sans Symbols
Noto Sans Symbols 2
Noto Sans Syriac
Noto Sans Syriac Eastern
Noto Sans TC
Noto Sans Tagalog
Noto Sans Tagbanwa
Noto Sans Tai Le
Noto Sans Tai Tham
Noto Sans Tai Viet
Noto Sans Takri
Noto Sans Tamil
Noto Sans Tamil Supplement
Noto Sans Tangsa
Noto Sans Telugu
Noto Sans Thaana
Noto Sans Thai
Noto Sans Thai Looped
Noto Sans Tifinagh
Noto Sans Tirhuta
Noto Sans Ugaritic
Noto Sans Vai
Noto Sans Vithkuqi
Noto Sans Wancho
Noto Sans Warang Citi
Noto Sans Yi
Noto Sans Zanabazar Square
Noto Serif
Noto Serif Ahom
Noto Serif Armenian
Noto Serif Balinese
Noto Serif Bengali
Noto Serif Devanagari
Noto Serif Display
Noto Serif Dogra
Noto Serif Ethiopic
Noto Serif Georgian
Noto Serif Grantha
Noto Serif Gujarati
Noto Serif Gurmukhi
Noto Serif HK
Noto Serif Hebrew
Noto Serif JP
Noto Serif KR
Noto Serif Kannada
Noto Serif Khitan Small Script
Noto Serif Khmer
Noto Serif Khojki
Noto Serif Lao
Noto Serif Makasar
Noto Serif Malayalam
Noto Serif Myanmar
Noto Serif NP Hmong
Noto Serif Old Uyghur
Noto Serif Oriya
Noto Serif Ottoman Siyaq
Noto Serif SC
Noto Serif Sinhala
Noto Serif TC
Noto Serif Tamil
Noto Serif Tangut
Noto Serif Telugu
Noto Serif Thai
Noto Serif Tibetan
Noto Serif Toto
Noto Serif Vithkuqi
Noto Serif Yezidi
Noto Traditional Nushu
Nova Cut
Nova Flat
Nova Mono
Nova Oval
Nova Round
Nova Script
Nova Slim
Nova Square
Numans
Nunito
Nunito Sans
Nuosu SIL
Odibee Sans
Odor Mean Chey
Offside
Oi
Old Standard TT
Oldenburg
Ole
Oleo Script
Oleo Script Swash Caps
Onest
Oooh Baby
Open Sans
Oranienbaum
Orbit
Orbitron
Oregano
Orelega One
Orienta
Original Surfer
Oswald
Outfit
Over the Rainbow
Overlock
Overlock SC
Overpass
Overpass Mono
Ovo
Oxanium
Oxygen
Oxygen Mono
PT Mono
PT Sans
PT Sans Caption
PT Sans Narrow
PT Serif
PT Serif Caption
Pacifico
Padauk
Padyakke Expanded One
Palanquin
Palanquin Dark
Palette Mosaic
Pangolin
Paprika
Parisienne
Passero One
Passion One
Passions Conflict
Pathway Extreme
Pathway Gothic One
Patrick Hand
Patrick Hand SC
Pattaya
Patua One
Pavanam
Paytone One
Peddana
Peralta
Permanent Marker
Petemoss
Petit Formal Script
Petrona
Philosopher
Phudu
Piazzolla
Piedra
Pinyon Script
Pirata One
Pixelify Sans
Plaster
Play
Playball
Playfair
Playfair Display
Playfair Display SC
Playpen Sans
Plus Jakarta Sans
Podkova
Poiret One
Poller One
Poltawski Nowy
Poly
Pompiere
Pontano Sans
Poor Story
Poppins
Port Lligat Sans
Port Lligat Slab
Potta One
Pragati Narrow
Praise
Prata
Preahvihear
Press Start 2P
Pridi
Princess Sofia
Prociono
Prompt
Prosto One
Proza Libre
Public Sans
Puppies Play
Puritan
Purple Purse
Qahiri
Quando
Quantico
Quattrocento
Quattrocento Sans
Questrial
Quicksand
Quintessential
Qwigley
Qwitcher Grypen
REM
Racing Sans One
Radio Canada
Radley
Rajdhani
Rakkas
Raleway
Raleway Dots
Ramabhadra
Ramaraja
Rambla
Rammetto One
Rampart One
Ranchers
Rancho
Ranga
Rasa
Rationale
Ravi Prakash
Readex Pro
Recursive
Red Hat Display
Red Hat Mono
Red Hat Text
Red Rose
Redacted
Redacted Script
Redressed
Reem Kufi
Reem Kufi Fun
Reem Kufi Ink
Reenie Beanie
Reggae One
Rethink Sans
Revalia
Rhodium Libre
Ribeye
Ribeye Marrow
Righteous
Risque
Road Rage
Roboto
Roboto Condensed
Roboto Flex
Roboto Mono
Roboto Serif
Roboto Slab
Rochester
Rock 3D
Rock Salt
RocknRoll One
Rokkitt
Romanesco
Ropa Sans
Rosario
Rosarivo
Rouge Script
Rowdies
Rozha One
Rubik
Rubik 80s Fade
Rubik Beastly
Rubik Broken Fax
Rubik Bubbles
Rubik Burned
Rubik Dirt
Rubik Distressed
Rubik Doodle Shadow
Rubik Doodle Triangles
Rubik Gemstones
Rubik Glitch
Rubik Glitch Pop
Rubik Iso
Rubik Lines
Rubik Maps
Rubik Marker Hatch
Rubik Maze
Rubik Microbe
Rubik Mono One
Rubik Moonrocks
Rubik Pixels
Rubik Puddles
Rubik Scribble
Rubik Spray Paint
Rubik Storm
Rubik Vinyl
Rubik Wet Paint
Ruda
Rufina
Ruge Boogie
Ruluko
Rum Raisin
Ruslan Display
Russo One
Ruthie
Ruwudu
Rye
STIX Two Text
Sacramento
Sahitya
Sail
Saira
Saira Condensed
Saira Extra Condensed
Saira Semi Condensed
Saira Stencil One
Salsa
Sanchez
Sancreek
Sansita
Sansita Swashed
Sarabun
Sarala
Sarina
Sarpanch
Sassy Frass
Satisfy
Sawarabi Gothic
Sawarabi Mincho
Scada
Scheherazade New
Schibsted Grotesk
Schoolbell
Scope One
Seaweed Script
Secular One
Sedgwick Ave
Sedgwick Ave Display
Sen
Send Flowers
Sevillana
Seymour One
Shadows Into Light
Shadows Into Light Two
Shalimar
Shantell Sans
Shanti
Share
Share Tech
Share Tech Mono
Shippori Antique
Shippori Antique B1
Shippori Mincho
Shippori Mincho B1
Shizuru
Shojumaru
Short Stack
Shrikhand
Siemreap
Sigmar
Sigmar One
Signika
Signika Negative
Silkscreen
Simonetta
Single Day
Sintony
Sirin Stencil
Six Caps
Sixtyfour
Skranji
Slabo 13px
Slabo 27px
Slackey
Slackside One
Smokum
Smooch
Smooch Sans
Smythe
Sniglet
Snippet
Snowburst One
Sofadi One
Sofia
Sofia Sans
Sofia Sans Condensed
Sofia Sans Extra Condensed
Sofia Sans Semi Condensed
Solitreo
Solway
Sometype Mono
Song Myung
Sono
Sonsie One
Sora
Sorts Mill Goudy
Source Code Pro
Source Sans 3
Source Serif 4
Space Grotesk
Space Mono
Special Elite
Spectral
Spectral SC
Spicy Rice
Spinnaker
Spirax
Splash
Spline Sans
Spline Sans Mono
Squada One
Square Peg
Sree Krushnadevaraya
Sriracha
Srisakdi
Staatliches
Stalemate
Stalinist One
Stardos Stencil
Stick
Stick No Bills
Stint Ultra Condensed
Stint Ultra Expanded
Stoke
Strait
Style Script
Stylish
Sue Ellen Francisco
Suez One
Sulphur Point
Sumana
Sunflower
Sunshiney
Supermercado One
Sura
Suranna
Suravaram
Suwannaphum
Swanky and Moo Moo
Syncopate
Syne
Syne Mono
Syne Tactile
Tai Heritage Pro
Tajawal
Tangerine
Tapestry
Taprom
Tauri
Taviraj
Teko
Tektur
Telex
Tenali Ramakrishna
Tenor Sans
Text Me One
Texturina
Thasadith
The Girl Next Door
The Nautigal
Tienne
Tillana
Tilt Neon
Tilt Prism
Tilt Warp
Timmana
Tinos
Tiro Bangla
Tiro Devanagari Hindi
Tiro Devanagari Marathi
Tiro Devanagari Sanskrit
Tiro Gurmukhi
Tiro Kannada
Tiro Tamil
Tiro Telugu
Titan One
Titillium Web
Tomorrow
Tourney
Trade Winds
Train One
Trirong
Trispace
Trocchi
Trochut
Truculenta
Trykker
Tsukimi Rounded
Tulpen One
Turret Road
Twinkle Star
Ubuntu
Ubuntu Condensed
Ubuntu Mono
Uchen
Ultra
Unbounded
Uncial Antiqua
Underdog
Unica One
UnifrakturCook
UnifrakturMaguntia
Unkempt
Unlock
Unna
Updock
Urbanist
VT323
Vampiro One
Varela
Varela Round
Varta
Vast Shadow
Vazirmatn
Vesper Libre
Viaoda Libre
Vibes
Vibur
Victor Mono
Vidaloka
Viga
Vina Sans
Voces
Volkhov
Vollkorn
Vollkorn SC
Voltaire
Vujahday Script
Waiting for the Sunrise
Wallpoet
Walter Turncoat
Warnes
Water Brush
Waterfall
Wavefont
Wellfleet
Wendy One
Whisper
WindSong
Wire One
Wix Madefor Display
Wix Madefor Text
Work Sans
Workbench
Xanh Mono
Yaldevi
Yanone Kaffeesatz
Yantramanav
Yatra One
Yellowtail
Yeon Sung
Yeseva One
Yesteryear
Yomogi
Young Serif
Yrsa
Ysabeau
Ysabeau Infant
Ysabeau Office
Ysabeau SC
Yuji Boku
Yuji Hentaigana Akari
Yuji Hentaigana Akebono
Yuji Mai
Yuji Syuku
Yusei Magic
ZCOOL KuaiLe
ZCOOL QingKe HuangYou
ZCOOL XiaoWei
Zen Antique
Zen Antique Soft
Zen Dots
Zen Kaku Gothic Antique
Zen Kaku Gothic New
Zen Kurenaido
Zen Loop
Zen Maru Gothic
Zen Old Mincho
Zen Tokyo Zoo
Zeyada
Zhi Mang Xing
Zilla Slab
Zilla Slab Highlight

The font to use in the app.

Any font available on [Google Fonts](https://fonts.google.com) may be used.

An object representing a member of a group

The id of the app member.

The role of the app member within the group.

Delete a group member from the group in which the invoking user is a member

The id of the group member to delete

Invite an app member to join a group.

The ID of the group to invite the app member to.

The email address of the user to invite.

The role to invite the user as.

Get a list of a group's members

The ID of a specific group to get the members from

Update the role of a group member.

The id of the group member to update the role of.

The new role of the group member.

Get a list of all of the groups in an app.

A health check status

Whether or not the database status is healthy

A JSON pointer which may be used to reference a JSON schema.

A JSON schema reference.

The default value that will be used.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema which determines the value must match one or more of the given schemas.

The JSON schema must match one or more of the given schemas.

An example value which is valid according to this schema.

The default value which is used if no value is supplied.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for an array.

The type of the JSON schema. An array means a list of data.

An example array which is valid according to this schema.

The default value which is used if no value is supplied.

The minimum amount of items the array is allowed to have.

The maximum amount of items the array is allowed to have.

If true, all items in the array need to be unique

This property describes what the items in an array should look like.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for a boolean.

The type of the JSON schema. A boolean means either true or false.

An example boolean which is valid according to this schema.

The default value which is used if no value is supplied.

If an enum is specified, the type can be safely removed.

If const is specified, the type can be safely removed.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema which describes a constant

The given value must exactly match one the value specified here.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for an enum.

A specific set of values this property is allowed to have.

An array is descriptions for the enum values.

The description is applied to the enum value at the same index.

An example which is valid according to this schema.

The default value which is used if no value is supplied.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for an integer.

The type of the JSON schema. An integer means a fractionless number.

An example integer which is valid according to this schema.

The default value which is used if no value is supplied.

If an enum is specified, the type can be safely removed.

If const is specified, the type can be safely removed.

The minimum value of the number.

The maximum value of the number.

The value must be a multiple of this number.

For example, if this is set to 3, then the values 0, 3, 6, 9, etc. will be allowed, but not 1, 2, 4,
5, 7, 8, etc.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema which defines multiple types.

The type of the JSON schema. It’s recommended to use only one.

array boolean integer null number string

An example which is valid according to this schema.

The default value which is used if no value is supplied.

The minimum amount of items the array is allowed to have.

The maximum amount of items the array is allowed to have.

If true, all items in the array need to be unique

This property describes what the items in an array should look like.

The minimum value of the number.

The maximum value of the number.

The value must be a multiple of this number.

For example, if this is set to 3, then the values 0, 3, 6, 9, etc. will be allowed, but not 1, 2, 4,
5, 7, 8, etc.

The maximum number of properties the object is allowed to have.

The minimum number of properties the object is must have.

A mapping of object keys for the object to nested JSON schemas.

A list of properties that are required.

A property name which is required on the object.

Describe if this object is allowed to have properties besides those defined in `properties`

It’s recommended to set this to `false`.

If false, the object may not have any additional properties.

If true, the object may have **any** type of additional properties. This is **not** recommended.

If this is a JSON schema, it describes any additional properties.

date-time time date duration email idn-email hostname idn-hostname ipv4 ipv6 uuid uri uri-reference iri iri-reference uri-template json-pointer relative-json-pointer regex action binary event-emitter event-listener fontawesome

The format values should adhere to.

The minimum length of the string.

The maximum length of the string.

It’s highly recommended to set this property, even if it’s a big number. For example 5000 characters
is plenty for most larger input fields. Not doing so may result in extremely large user input, which
results in a bad user experience.

A regular expression to describe user input.

Regular expressions are a powerful way to enforce proper user input, but the learning curve is high.
If you don’t know what this is, we recommend to omit this field for now.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema which may not be matched.

The JSON schema which the value may not match.

An example value which is valid according to this schema.

The default value which is used if no value is supplied.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema of type null only accepts a null value

Only accept a null value.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for a number which has fractions.

The type of the JSON schema. A number represents a number which has fractions. For fractionless numbers, use `integer` instead.

If an enum is specified, the type can be safely removed.

If const is specified, the type can be safely removed.

An example number which is valid according to this schema.

The default value which is used if no value is supplied.

The minimum value of the number.

The maximum value of the number.

The value must be bigger than this number. The given value itself is not allowed.

The value must be smaller than this number. The given value itself is not allowed.

The value must be a multiple of this number.

For example, if this is set to 0.5, then the values 0, 0.5, 1, 1.5, 2, 2.5, etc. will be allowed,
but not 0.3, 1.7, etc.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for an object.

The type of the JSON schema.

An example object which is valid according to this schema.

The default value which is used if no value is supplied.

The maximum number of properties the object is allowed to have.

The minimum number of properties the object is must have.

A list of properties that are required.

A property name which is required on the object.

A mapping of object keys for the object to nested JSON schemas.

Describe if this object is allowed to have properties besides those defined in `properties`

It’s recommended to set this to `false`.

If false, the object may not have any additional properties.

If true, the object may have **any** type of additional properties. This is **not** recommended.

If this is a JSON schema, it describes any additional properties.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema which determines the value must match exactly one of the given schemas.

The JSON schema must match exactly one of the given schemas.

An example value which is valid according to this schema.

The default value which is used if no value is supplied.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema which allows a format of remapper without a type.

Allow a remapper definition. This is supported for blocks only.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A top level JSON schema.

This property may be used to store JSON schemas that may be referenced from other places.

The JSON schema meta schema. You probably don’t need to specify this explicitly.

The type of the JSON schema.

An example object which is valid according to this schema.

The default value which is used if no value is supplied.

The maximum number of properties the object is allowed to have.

The minimum number of properties the object is must have.

A list of properties that are required.

A property name which is required on the object.

A mapping of object keys for the object to nested JSON schemas.

Describe if this object is allowed to have properties besides those defined in `properties`

It’s recommended to set this to `false`.

If false, the object may not have any additional properties.

If true, the object may have **any** type of additional properties. This is **not** recommended.

If this is a JSON schema, it describes any additional properties.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

A JSON schema for a string.

The type of the JSON schema. A string is the technical term for a piece of text.

An example string which is valid according to this schema.

The default value which is used if no value is supplied.

If an enum is specified, the type can be safely removed.

If const is specified, the type can be safely removed.

The format values should adhere to.

The minimum length of the string.

The maximum length of the string.

It’s highly recommended to set this property, even if it’s a big number. For example 5000 characters
is plenty for most larger input fields. Not doing so may result in extremely large user input, which
results in a bad user experience.

A regular expression to describe user input.

Regular expressions are a powerful way to enforce proper user input, but the learning curve is high.
If you don’t know what this is, we recommend to omit this field for now.

If true, Appsemble renders a textarea in the graphical JSON editor.

A short title of the instance.

This is used in various places inside Appsemble Studio.

A description of the instance.

This is used in various places inside Appsemble Studio.

The link action can be used to redirect the user to other pages or absolute URLs.

The name of the page to link to. Subpages can be referred to using arrays. If this matches with an absolute URL, link will open this instead of matching it with a page or subpage.

Link back to the previous page in the browser history.

Link to the next page in the browser history.

Output the result of the action into the console.

This is mostly useful for debugging blocks during development.

The logging level on which to log.

These actions are fired on a loop page.

This action is used to define the data to pass onto the loop type array

This action gets triggered when `flow.cancel` gets called.

This action gets triggered when a flow is finished.

A flow is finished when `flow.finish` gets called, or when `flow.next` gets called on the final
subpage. This action has a special property in which the cumulative input data from each previous subpage gets sent, instead of the individual block that triggered this action.

Generates sub pages dynamically based on data and display in a flow page.

The method that should be used to display the status of flow pages.

Whether to retain the flow data when navigating away to another page outside the flow.

By default the flow page retains it's data after navigating once. Set to false to clear it.

Whether or not the page name should be displayed in the *app bar*.

The name of the page when displayed in the navigation menu.

  Context property `name` can be used to access the name of the page.

Whether or not the page should be displayed in navigational menus.

  By default all pages without parameters are added to navigational menus. Set to `true` to hide the
  page from menus.

The type of navigation displayed on the page.

This overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or
App navigation are not set.

Set to `bottom` to use a navigation pane at the bottom of the screen instead of the default side
menu. Set to `hidden` to display no navigational menus at all.

An optional icon from the fontawesome icon set

This will be displayed in the navigation menu.

Page parameters can be used for linking to a page that should display a single resource.

This defined as a list of strings representing the properties to pass through. More often than not
passing `id` through is sufficient, depending on the block.

A Remapper that resolves to a number to be visibile in the side-menu.

Run another action if one of the cases is true.

Only the first case that equals true is called.

The case to be matched.

Action to be called if the case equals true.

Display a message to the user.

This is useful in combination with action chaining to notify users they have performed a certain action.

The body of the message.

dark primary link success info warning danger

The Bulma color to apply to the message.

The position of the message on the screen.

Boolean value indicating whether the user is able to dismiss the message manually.

The time in milliseconds how long the message should be visible.

Do nothing when this action is triggered.

This is the default action for block actions that are not required.

The data used to display the content of the notification.

The title of the notification.

The body of the notification.

The URL of the page the user gets redirected to after being clicked.

If the URL is relative, it will be relative to the app.

The strategy used to notify users.

The list of roles to notify.

Aside from roles, `$author` can also be used to notify the author of the resource.

If set, allows users to manually subscribe for notifications for this resource regardless of roles.

The following values are allowed:
- `all`: Allows users to be notified about actions on all of the resources of this type.
- `single`: Allows users to be notified about actions a single instance of a resource of this
  type.
- `both`: Allows users to be notified about all resources or a single resource of this type.

Send notifications to one or all the users of an app.

The title of the notification.

The description of the notification.

To whom the notification should be sent.

Use `all` to send the notification to all app subscribed users.
Or notify specific users by passing either a single user id or an array of user ids.

Nothing is sent if the value is **not** a valid user id.

OAuth2 client credentials

The OAuth2 authorization code.

OAuth2 client credentials

The generated client id

The generated client secret

A description for the user to recognize the client.

When the client credentials expire automatically.

The scopes that have been granted to the client.

apps:export apps:write apps:delete blocks:write blocks:delete organizations:write resources:read resources:write assets:write groups:read groups:write

An object based remapper is defined by a specific implementation

Object based remappers may only define 1 key. The allowed value depends on the remapper.

The remapper goes through the given array and applies the given remappers on each individual item.
This can be very handy when sorting arrays by certain data. The remapper always returns an array.
Output can be an empty array if the supplied data isn’t an array.

For example, if you want to sort through a list of people and only get their occupations you can do
the following:

Input:

```json
[
  {
    "name": "Peter",
    "occupation": "Delivery driver"
  },
  {
    "name": "Otto",
    "occupation": "Scientist"
  },
  {
    "name": "Harry",
    "occupation": "CEO"
  }
]
```
```yaml
array.map:
  object.omit:
    - name

```
Result:

```json
[{"occupation":"Delivery driver"},{"occupation":"Scientist"},{"occupation":"CEO"}]
```

Another great use for `array.map` is to combine it with the `if` remapper and sort your arrays on
specific values.

Using the same input data from the previous example, look at how you can change the code to get
people from a specific occupation:

```yaml
- array.map:
    if:
      condition:
        equals:
          - prop: occupation
          - Scientist
      else: null
      then:
        object.from:
          name:
            prop: name
          occupation:
            prop: occupation
- null.strip: null

```
Result:

```json
[{"name":"Otto","occupation":"Scientist"}]
```

Because `array.map` returns an array, every item has to return something. This is why we have to
return the full object with the data we want in the `then` section. It’s also why we return `null`.
This results in an array consisting of `null` values and objects with actual data in them. To solve
this problem, we use the `null.strip` remapper to remove any null values which results in a clean
array.

Filters out unique values from an array. The value Remapper is applied to each entry in the array
using its result to determine uniqueness.

If the value Remapper results in undefined or null, the entire entry is used for uniqueness.

If the input is not an array, the input is returned without any modifications.

Input:

```json
[1,1,2,3]
```
```yaml
array.unique: null

```
Result:

```json
[1,2,3]
```

You can also check for more complex values in arrays. The remapper accepts remappers as well, so you
can also use entire objects to check for unique values.

For this example, we have the following extended data with some duplicate values:

```json
[
  {
    "name": "Peter",
    "occupation": "Delivery driver",
    "age": 19
  },
  {
    "name": "Peter",
    "occupation": "Photographer",
    "age": 19
  },
  {
    "name": "Otto",
    "occupation": "Scientist",
    "age": 50
  },
  {
    "name": "Harry",
    "occupation": "CEO",
    "age": 20
  }
]
```

We can be fairly sure in this list of people the first two Peters are the same person but with a
different occupation. To get more complex unique values from here, we can do the following:

```yaml
array.unique:
  object.from:
    name: { prop: name }
    age: { prop: age }
```

This then checks the array for unique values in both the `name` and `age` fields. The result of this
remapper is a filtered list:

```json
[
  {
    "name": "Peter",
    "occupation": "Delivery driver",
    "age": 19
  },
  {
    "name": "Otto",
    "occupation": "Scientist",
    "age": 50
  },
  {
    "name": "Harry",
    "occupation": "CEO",
    "age": 20
  }
]
```

Filters out values based on the input conditions provided.

For example:

Input:

```json
[{"name":"Peter"},{"name":"Louis"},{"name":"Brian"}]
```
```yaml
array.filter:
  equals:
    - prop: name
    - Louis

```
Result:

```json
[{"name":"Louis"}]
```

Example of how it can be used to filter a number array.

Input:

```json
[1,2,1,3,4,1,5]
```

```yaml
array.filter:
  equals:
    - array: item
    - 1
```

Result:

```json
[1,1,1]
```

Returns a single object or value from an array based on the given condition.

For example:

Input:

```json
[{"name":"Craig"},{"name":"Joey"},{"name":"Stuart"}]
```
```yaml
array.find:
  equals:
    - prop: name
    - Craig

```
Result:

```json
{"name":"Craig"}
```

Creates a new array based on a provided array of remappers. This array can also consist of static
values.

For example:

```yaml
array.from:
  - Peter
  - Otto
  - Harry

```
Result:

```json
["Peter","Otto","Harry"]
```

This remapper can also be used to convert given data into an array.

Input:

```json
{
  "name": "Peter",
  "occupation": "Delivery driver"
}
```

```yaml
array.from:
  - root: null # Takes the data passed to this remapper, explained more in the 'Data' page
```

Result:

```json
[
  {
    "name": "Peter",
    "occupation": "Delivery driver"
  }
]
```

Append new values to the end of an array. If the input is not an array an empty array is returned.

Using the array from the previous example, we can add a new object on top of it using this remapper:

```yaml
array.append:
  - object.from:
      name: James
      occupation: News reporter

```
Result:

```json
[
  {
    "name": "Peter",
    "occupation": "Delivery driver"
  },
  {
    "name": "Otto",
    "occupation": "Scientist"
  },
  {
    "name": "Harry",
    "occupation": "CEO"
  },
  {
    "name": "James",
    "occupation": "News reporter"
  }
]
```

Extra example:

array remapper can also be used in combination with different remappers as in the current example comes object remapper:

Example object:
```json
{
  "names": ["Bart", "Bas", "Sam"]
}
```

Combination of object and array remapper:

```yaml
object.assign:
  names:
  - { prop: Applicants }
  - array.append:
    - Kevin
```

Result:
```json
{
  "names": ["Bart", "Bas", "Sam", "Kevin"]
}
```

Remove values from an array. The input is expected to be the index(es) of the items to be deleted.
Accepts an array of static or remapper values.

With the previous example we added a new person to the list of people, so now we can remove that
person. We already know the index of this person in the array is `3`, so it’s easy:

```yaml
array.omit:
  - 3

```
Result:

```json
[
  {
    "name": "Peter",
    "occupation": "Delivery driver"
  },
  {
    "name": "Otto",
    "occupation": "Scientist"
  },
  {
    "name": "Harry",
    "occupation": "CEO"
  }
]
```

However, usually we don’t know the exact index of the item we want to delete. Because the remapper
accepts remappers as input we can get the desired item’s ID from another source as well. Take the
following example:

In this example we assume the data from the previous example is passed to this table block using a
data loader’s emitting event called “people”. When the user clicks on one of the people in the
table, it gets the list of people again. Using the index of this person, and the `array.omit`
remapper, the person gets removed from the list.

```yaml
type: table
version: 0.20.38
events:
  listen:
    data: people
parameters:
  fields:
    - label: Name
      value: { prop: name }
      onClick: removePerson
    - label: Occupation
      value: { prop: occupation }
actions:
  removePerson:
    type: resource.query
    resource: citizensNYC
    remapAfter:
      array.omit:
        - context: index # This gets the index of the item in the table, explained more in the 'Data' page.
    onSuccess:
      type: resource.update
      resource: citizensNYC
```

Flatten an array. Accepts an array of static or remapper values.

Say for example that each person has some pets. We could get an array of all pets like so:

Input:

```json
[
  [
    "Milka",
    "Sven"
  ],
  "Goldie"
]
```
Result:

```json
["Milka","Sven","Goldie"]
```

Checks if the input array includes the provided item.
Input:

```json
[1,2,3,4,5]
```
```yaml
array.contains:
  static: 6

```
Result:

```json
false
```

Check if condition results in a truthy value.

Returns value of `then` if condition is truthy, otherwise it returns the value of `else`.

For example:

Input:

```json
{"guess":4}
```
```yaml
if:
  condition:
    equals:
      - prop: guess
      - 4
  then:
    static: You guessed right!
  else:
    static: You guessed wrong!

```
Result:

```json
"You guessed right!"
```

Input:

```json
{"guess":5}
```
Result:

```json
"You guessed wrong!"
```

The condition to check.

This remapper is used if the condition returns true.

This remapper is used if the condition returns false.

Compare all computed remapper values against each other.

Returns `true` if all entries are equal, otherwise `false`.

In the following example, if the `inputValue` and `expectedValue` are of the same value, the
condition will return `true` and the `then` remapper will fire.

Input:

```json
{"inputValue":"example","expectedValue":"example"}
```
```yaml
equals:
  - prop: inputValue
  - prop: expectedValue

```
Result:

```json
true
```

**(gt = Greater than)**

Compare the first computed remapper value with the second computed remapper value.

Returns `true` if the first entry is greater than the second entry.

For example, if `stock` is more than 5 here, it returns `true`.

Input:

```json
{"stock":100}
```
```yaml
gt:
  - prop: stock
  - 5

```
Result:

```json
true
```

**(lt = Lesser than)

Compare the first computed remapper value with the second computed remapper value.

Returns `true` if the first entry is lesser than the second entry.

For example, if `stock` is less than 5 here, it returns `true`.

Input:

```json
{"stock":100}
```
```yaml
gt:
  - prop: stock
  - 5

```
Result:

```json
true
```

Compare all computed remapper values against the first.

Returns `false` if all entries are equal to the first entry, otherwise `true`.

If only one remapper or none is passed, the remapper value gets computed and then inverted.

If `number` in the following example is something other than 4, the condition returns `true`.

Input:

```json
{"number":3}
```
```yaml
not:
  - prop: number
  - 4

```
Result:

```json
true
```

Check if any case results in a truthy value.

Returns the value of the first case where the condition equals true, otherwise returns null.

In the following example, let's say the `Gem` is a "Ruby". The match remapper then returns
`value: 75`.

Input:

```json
{"Gem":"Ruby"}
```
```yaml
match:
  - case:
      equals:
        - prop: Gem
        - Diamond
    value: 100
  - case:
      equals:
        - prop: Gem
        - Ruby
    value: 75
  - case:
      equals:
        - prop: Gem
        - Gold
    value: 50
  - case:
      equals:
        - prop: Gem
        - Sapphire
    value: 25
    result: {}

```
Result:

```json
75
```

The condition to check.

This remapper is used if the case is true

Compare all computed remapper values against each other.

Returns `true` if all entries are equal to `true`, otherwise `false`.

If only one remapper or none is passed, the remapper value gets computed.

Input:

```json
{"foo":true}
```
```yaml
and:
  - prop: foo
  - true

```
Result:

```json
true
```

Compare all computed remapper values against each other.

Returns `false` if all entries are equal to `false`, otherwise `true`.

If only one remapper or none is passed, the remapper value gets computed.

Input:

```json
{"foo":true}
```
```yaml
or:
  - prop: foo
  - false

```
Result:

```json
true
```

Check if a value is defined. Returns `true` if defined, `false` if not.

Considers falsy values like `0`, `""` and `false` as defined.

The `null` and `undefined` values are considered as not defined.

Input:

```json
[0,"",false,null,null]
```
```yaml
array.map:
  defined:
    array: item

```
Result:

```json
[true,true,true,false,false]
```

Get a predefined app variable by name

For example:

```yaml
variable: MY_VARIABLE

```
Result:

```json
"variable value"
```

Get the current array.map’s index, length, the current item, previous item or next item.

Returns nothing when not in the context of `array.map’s`.

For example:

Input:

```json
["a","b","c"]
```
```yaml
array.map:
  object.from:
    index:
      array: index
    length:
      array: length
    item:
      array: item
    prevItem:
      array: prevItem
    nextItem:
      array: nextItem

```
Result:

```json
[
  {
    "index": 0,
    "length": 3,
    "item": "a",
    "nextItem": "b"
  },
  {
    "index": 1,
    "length": 3,
    "item": "b",
    "prevItem": "a",
    "nextItem": "c"
  },
  {
    "index": 2,
    "length": 3,
    "item": "c",
    "prevItem": "b"
  }
]
```

Gives information about the current app. Using this remapper you can get access to the
following information:

- `id`: App ID
- `locale`: Current locale (user selected language) of the app
- `url`: Base URL of the app

Example:

```yaml
app: url

```
Result:

```json
"https://example-app.example-organization.example.com"
```

Gets a property from custom context passed by blocks. This property is specific to each block. To
understand what the context of a certain block does, check the block’s description.

For this example, we will take the [`table`](/blocks/@appsemble/table/0.20.39) block. As of now,
this block provides two options for context: `index` and `repeatedIndex`. Whenever you click on an
item in the table, it gives the index of that table row in the associated action.

So with the following example:

```yaml
type: table
version: 0.20.39
events:
  listen:
    data: contextData
parameters:
  fields:
    - label: Name
      value: { prop: name }
      onClick: clickName
    - label: Age
      value: { prop: age }
actions:
  clickName:
    remapBefore:
      context: index
    type: log
```

Clicking on the first item would log `0`, the second item `1` and so on.

> **Note:** This remapper is explained more in depth in the [History](/docs/remappers/history) page

Gives the data at the history entry at the specified history index. The history at specified index
is the data that is passed to that action.

```yaml
remapBefore:
  object.from:
    title: Most influential bands of all time
    content: ...
type: noop # history 0
onSuccess:
  type: resource.query # history 1
  resource: people
  onSuccess:
    type: noop # history 2
    onSuccess:
      remapBefore:
        history: 1
      type: log # history 3
```

Result:

```json
{
  "title": "Most influential bands of all time",
  "content": ...
}
```

Returns the name of the current tab in a `tabs` page.

```yaml
name: Example Page A
type: tabs
  tabs:
    - name: Tab2
      blocks:
        - type: action-button
          version: "0.27.12"
          parameters:
            icon: chevron-right
          actions:
            onClick:
              type: log
              remapBefore:
                { tab.name: null }
```

While in a loop page, this remapper allows you to get properties from the data at the current index.

```yaml
name: Survey
type: loop
actions:
  onLoad:
    type: resource.query
    resource: questions
foreach:
  blocks:
    - type: detail-viewer
      version: 0.20.39
      parameters:
        fields:
          - label: { step: title }
```

With this example, we load an array of questions that have the `title` property. What the `step`
remapper does in this case is show the title of the current question in the loop.

The result of this is a flow page where each page shows the question’s title.

Gives actual information about the current page. This remapper gives access to the following
information:

- `data`: Current page data (FlowPage)
- `url`: Full URL of the current page

Example:

```json
{
  "data": {
    "name": "Peter"
  },
  "url": "https://example-app.examplecompany.appsemble.app/en/example-page-a"
}
```

The page data only works in the context of a flow page. Let’s say you have a
[“FlowPage”](/docs/reference/app#-flow-page-definition) type with multiple subpages. Whenever you
navigate to the next page it adds the data from that page to the flow page’s data. The page remapper
allows you to access this cumulative data.

The following page definition shows a page definition for a flow page where the user has to fill in
some user information. For each subpage the result of `page: data` is shown.

```yaml
name: PageDataFlow
type: flow
steps:
  # page: data = {}
  - blocks:
      - type: form
        version: 0.20.39
        parameters:
          fields:
            - name: name
              type: string
        actions:
          onSubmit:
            type: flow.next
  # page: data = { name: "Peter" }
  - blocks:
      - type: form
        version: 0.20.39
        parameters:
          fields:
            - name: age
              type: string
        actions:
          onSubmit:
            type: flow.next
  # page: data = { name: "Peter", age: "47" }
  - blocks:
      - type: data-loader
        version: 0.20.39
        actions:
          onLoad:
            remapBefore:
              page: data
            type: log
```

The result of the final page’s log would then be:

```json
{
  "name": "Peter",
  "age": "47"
}
```

Gets the chosen property from an object.

Input:

```json
{"age":52,"name":"John"}
```
```yaml
prop: name

```
Result:

```json
"John"
```

Returns the length of an input array or an input string, unlike { array: length } remapper this remapper does not require
an array to be in the context. This can be very useful when working with nested arrays.
Input:

```json
"string"
```
```yaml
len: null

```
Result:

```json
6
```

Gets the input data as it was initially passed to the remapper function.

```yaml
type: resource.query
resource: people
query:
  object.from:
    $filter: city eq 'Eindhoven'
onSuccess:
  remapBefore:
    object.from:
      name: Residents of Eindhoven
      people:
        root: null
```

Result:

```json
{
  "name": "Residents of Eindhoven",
  "people": [
    {
      "name": ...,
      "city": "Eindhoven"
    },
    ...
  ]
}
```

Create a static value

```yaml
static: Hello!

```
Result:

```json
"Hello!"
```

> **Note:** This is explained much more in depth at [Translating](/docs/guides/translating)

This remapper allows you to easily add translations to your app. To make this remapper work, replace
any static text with `translate: {name}`. Then, in your app’s Translations page pick the language
you want to translate. You will see a list of names with input text below. Translations you manually
put in the app using the `translate` remapper are found under “Custom messages”.

After putting the translation in, any user that logs in with that language selected will see the
translated message.

Example:

```yaml
type: detail-viewer
version: 0.20.39
parameters:
  fields:
    - label: { translate: weatherTitle }
      value: { translate: weatherBody }
```

sub name email email_verified picture locale zoneinfo role properties

> **Note:** For this remapper to work, the app member that activated the remapper has to be logged in to
> the app

Provides some fields of app member information taken from the OpenID user info. These fields are:

- `sub`: The app member’s identifier
- `name`: The app member’s name
- `email`: The app member’s **primary** email address
- `email_verified`: Whether the app member’s primary email address is verified or not (`boolean`)
- `picture`: Full URL to the app member’s profile picture web address
- `locale`: The app member’s default language [`BCP47`](https://en.wikipedia.org/wiki/IETF_language_tag)
  language tag (ex. `en`) (Broken)
- `zoneinfo`: The app member’s timezone
- `role`: The role of the app member in the app
- `properties`: Custom properties defined on the app member

Example:

```json
{
  "email": "example@hotmail.nl",
  "email_verified": true,
  "locale": "en",
  "name": "Test User",
  "picture": "https://www.gravatar.com/avatar/f46b82357ce29bcd1099915946cda468?s=128&d=mp",
  "sub": "5c6270e2-ad31-414f-bcab-6752a2c4dcfd",
  "properties": {}
}
```

> **Note:** For this remapper to work, the application needs to define a companion container.

This remapper provides a short way to access a companion container for the purpose of making http requests.
When using the 'request' action, the url can be provided by using the 'container' remapper, and providing a string.
The string should contain the name of the companion container, followed by the API endpoint path.

Example:
```yaml
    type: request
    url: { container: my-container/api/endpoint }
    proxy: true
    method: get
```

Extract characters from a string, or items from an array
accepts either an array of two numbers (indexes of starting point and ending point)
or a number (index of the starting point).
startIndex is inclusive whereas the endIndex is not.
Input:

```json
"Laziness"
```
```yaml
slice:
  - 3
  - 6

```
Result:

```json
"ine"
```

Adds a specified date value to the provided date.

The value to add should be specified according to the
[parse-duration](https://www.npmjs.com/package/parse-duration) API. If you want to add a day to a
date for example, the syntax would be `date.add: 1d`.

Full list of supported unit types:
- nanoseconds (ns)
- microseconds (μs)
- milliseconds (ms)
- seconds (s, sec)
- minutes (m, min)
- hours (h, hr)
- days (d)
- weeks (w, wk)
- months
- years (y, yr)

For example:

Input:

```json
"2023-06-30T14:50:19.601Z"
```
```yaml
- date.now: null
- date.add: 1w
- date.format: null

```
Result:

```json
"2023-07-07T14:50:19.601Z"
```

Format a date according to the RFC3339 format.

Here is an example of a RFC3339 complicit date:
`2002-10-02T15:00:00Z`

In an app definition, it’s best to use this when you want to display a date in a specific format.
For example, if your app has a form with a Datepicker field the incoming data will be formatted
as a simple date format. If you want to format it to the RFC3339 format, you can use this remapper.

When you submit a form with a DateField, the internal output looks like the following. You can then format the date so that it uses the RFC3339 format.

Input:

```json
"2023-07-03"
```
```yaml
date.format: null

```
Result:

```json
"2023-07-02T22:00:00.000Z"
```

The remapper can also be used to format a date or timestamp using a custom format.

```js
"2023-07-02T22:00:00.000Z"
```

You can then format the date with any supported pattern, please refer to https://date-fns.org/docs/format for the supported patterns.

```yaml
date.format: yyyy-MM-dd
```

Result:
```js
2023-07-03
```

Returns the current date as a JavaScript Date object.

```yaml
date.now: null

```
Result:

```json
"Mon Jul 03 2023 11:47:18 GMT+0200 (Midden-Europese zomertijd)"
```

Convert a string to a date using a given format.

For example:

```yaml
date.parse: MM/dd/yyyy

```
Result:

```json
"Tue Feb 11 2014 00:00:00"
```

See [date-fns](https://date-fns.org/v2.29.3/docs/parse) for the supported formats.

Leaving the format empty will try to parse the date using the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
For example:
```yaml
date.parse:
- static: 2014-02-11T11:30:30 # The date string to parse
- date.parse: ''              # The given format to parse the date with
                      # => Tue Feb 11 2014 11:30:30
```

Creates a new object based on the specified properties in the given history index. This can be very
useful when you want to combine two sources of data together. It’s also cleaner than separately
using `object.from` together with `history`.

In the following example, you can see why this might be handy. Let’s say you get the details about a
concert from a source like an action or a block. You have this information and then you want to get
some additional data like the attendees of the concert. With `from.history` you can combine the
older data like the name and date, and add the new `attendees` data. The result will be an object
with this combined data.

History index 1:

```json
{
  "name": "Rolling stones at Amsterdam Arena",
  "artist": "Rolling Stones",
  "location": "Amsterdam Arena",
  "date": "07-07-2022",
  "price": 120
}
```

Input:

```json
[ .. ]
```

```yaml
object.from:
  concertDetails:
    from.history:
      index: 1
      props:
        name: { prop: name }
        date: { prop: date }
        attendees: { root: null }
```

Result:

```json
{
  "concertDetails": {
    "attendees": [ .. ],
    "date": "07-07-2022",
    "name": "Rolling stones at Amsterdam Arena"
  }
}
```

The index of the history stack item to assign.

0 is the index of the first item in the history stack.

Predefined mapper keys to choose what properties to apply.

Assigns properties from the specified history stack index to an existing object.
Similarly to the `from.history` remapper, this allows you to get a property from a place in the
history and give it to a new object. The only difference here is that you are not creating an
entirely new object, but you are taking an existing object and assigning new values to it.

So, we can take the example from `from.history` and flip it.

History index 1:

```json
{
  "peopleAmount": 3000
}
```

Input:

```json
{
  "name": "Rolling stones at Amsterdam Arena",
  "artist": "Rolling Stones",
  "location": "Amsterdam Arena",
  "date": "07-07-2022",
  "price": 120
}
```

```yaml
object.from:
  concertDetails:
    assign.history:
      index: 1
      props:
        attendees: { prop: peopleAmount }
```

Result:

```json
{
  "concertDetails": {
    "name": "Rolling stones at Amsterdam Arena",
    "artist": "Rolling Stones",
    "location": "Amsterdam Arena",
    "date": "07-07-2022",
    "price": 120,
    "attendees": 3000
  }
}
```

The index of the history stack item to assign.

0 is the index of the first item in the history stack.

Predefined mapper keys to choose what properties to assign.

Assigns properties from the specified history stack index to the current value and excludes the
given properties.

Similarly to the other history remappers, this gives you the data from a certain point in the
history stack and allows you to modify it before adding to the current value. This one, however,
allows you to take the complete specified history data and omit certain values.

This remapper can be extremely helpful for re-using data you got before in the history stack while
filtering certain properties.

For example, let’s say you have the information for a concert but don’t want normal users to see
sensitive data about it. Using `omit.history` you can take this concert data but exclude the
sensitive parts.

History index 1:

```json
{
  "name": "Rolling stones at Amsterdam Arena",
  "artist": "Rolling Stones",
  "location": "Amsterdam Arena",
  "date": "07-07-2022",
  "bandPasswords": [ .. ],
  "bankDetailsAttendees": [ .. ]
}
```

Input:

```json
[ .. ]
```

```yaml
object.from:
  concertDetails:
    omit.history:
      index: 1
      keys:
        - bandPasswords
        - bankDetailsAttendees
```

Result:

```json
{
  "concertDetails": {
    "name": "Rolling stones at Amsterdam Arena",
    "artist": "Rolling Stones",
    "location": "Amsterdam Arena",
    "date": "07-07-2022",
    "attendees": [ .. ]
  }
}
```

The index of the history stack item to assign.

0 is the index of the first item in the history stack.

Exclude properties from the history stack item, based on the given object keys.

Nested properties can be excluded using arrays of keys.

For example:
```yaml
omit.history:
  index: 0
  keys:
    - foo   # Excludes the property foo
    - - bar # Excludes the property baz inside of bar
      - baz
```

Convert a string into a number.

If there is no remapper passed and the input can be converted, this will return the converted input.

If there is no remapper passed and the input is null, this will return 0.

If there is no remapper passed and the input cannot be converted, this will return the input.

If there is a remapper passed and the remapped value can be converted, this will return the converted remapped value.

If there is a remapper passed and the remapped value is null, this will return 0.

If there is a remapper passed and the remapped value cannot be converted, this will return the remapped value.

For example:

Input:

```json
"42"
```
```yaml
number.parse: null

```
Result:

```json
42
```

Let’s say you have an existing object that you want to add an additional value on top of. For this
you can use the `object.assign` remapper. The remapper takes an existing object and allows the user
to assign their own value on top of that.

Input:

```json
{"title":"Weekly fishing 21"}
```
```yaml
object.assign:
  author: John Doe

```
Result:

```json
{"author":"John Doe","title":"Weekly fishing 21"}
```

With this remapper you can create an entirely new object based on input values and other remappers.
`object.from` itself accepts remapper functions as its input which allows you to chain multiple
remappers together to make complex objects.

As a base, the remapper looks like this:

```yaml
object.from:
  email: example@hotmail.com
  username: Chris Taub

```
Result:

```json
{"email":"example@hotmail.com","username":"Chris Taub"}
```

Most of the time you won’t create an object just to store one value. Luckily, this is where the
chaining of remappers comes in. You can create an object that contains an `object.from` remapper
which then allows more inputs:

```yaml
object.from:
  username: Chris Taub
  email: example@hotmail.com
  addresses:
    object.from:
      work:
        object.from:
          city: Eindhoven
          address: Nachtegaallaan 15
      home:
        object.from:
          city: Amsterdam
          address: Amstel 1
```

```json
{
  "username": "Chris Taub",
  "email": "example@hotmail.com",
  "addresses": {
    "work": {
      "city": "Eindhoven",
      "address": "Nachtegaallaan 15"
    },
    "home": {
      "city": "Amsterdam",
      "address": "Amstel 1"
    }
  }
}
```

In contrary to the previous remapper, what if you have an object from which you want to remove a
value? Then you can use `object.omit`. The remapper can remove properties from an existing object
based on the given object keys. This includes nested properties.

Input:

```json
{
  "author": "John Doe",
  "content": {
    "interview": "...",
    "introduction": "This is the introduction for the new weekly fishing issue",
    "paragraph1": "..."
  },
  "title": "Weekly fishing 21"
}
```
```yaml
object.omit:
  - author
  - - content
    - interview

```
Result:

```json
{
  "content": {
    "introduction": "This is the introduction for the new weekly fishing issue",
    "paragraph1": "..."
  },
  "title": "Weekly fishing 21"
}
```

This remapper allows you to compare two objects and get differences in their key-value pairs like in the following example:

Input:

```json
{
  "name": "Alice"
}
```
```yaml
object.compare:
  - object.from:
      name:
        prop: name
      age: 25
      address:
        object.from:
          city: Paris
          zip: 7500
      favoriteColors:
        array.from:
          - blue
          - green
  - object.from:
      name: Alice
      age: 26
      address:
        object.from:
          city: Lyon
          country: France
      favoriteColors:
        array.from:
          - red
          - green
          - blue

```
Result:

```json
[
  {
    "path": [
      "age"
    ],
    "type": "changed",
    "from": 25,
    "to": 26
  },
  {
    "path": [
      "favoriteColors"
    ],
    "type": "changed",
    "from": [
      "blue",
      "green"
    ],
    "to": [
      "red",
      "green",
      "blue"
    ]
  },
  {
    "path": [
      "address",
      "city"
    ],
    "type": "changed",
    "from": "Paris",
    "to": "Lyon"
  },
  {
    "path": [
      "address",
      "zip"
    ],
    "type": "removed",
    "value": 7500
  },
  {
    "path": [
      "address",
      "country"
    ],
    "type": "added",
    "value": "France"
  }
]
```

Takes an object with an array property and transforms it into an array of objects.

Each object in the resulting array contains all the entries of the original object
plus all the entries of the corresponding array item from the array property.

If one of the items in the array contains a key, which exists in the original object
it will overwrite the original key.

Nested arrays or objects are not exploded.

Example:
Input:

```json
{
  "ownerName": "John",
  "country": "USA",
  "pets": [
    {
      "name": "Milka"
    },
    {
      "name": "Sven",
      "country": "Sweden"
    },
    {
      "name": "Tom",
      "likes": [
        "mice",
        "fish"
      ]
    },
    {
      "name": "Jerry",
      "looks": {
        "color": "brown"
      }
    }
  ]
}
```
```yaml
object.explode: pets

```
Result:

```json
[
  {
    "ownerName": "John",
    "name": "Milka",
    "country": "USA"
  },
  {
    "ownerName": "John",
    "name": "Sven",
    "country": "Sweden"
  },
  {
    "ownerName": "John",
    "name": "Tom",
    "country": "USA",
    "likes": [
      "mice",
      "fish"
    ]
  },
  {
    "ownerName": "John",
    "name": "Jerry",
    "country": "USA",
    "looks": {
      "color": "brown"
    }
  }
]
```

With this remapper you can generate an OData filter, ready to be passed to the `$filter` key in
resource queries.

The different comparator options are as follows:

- eq - Equal to
- ne - Not equal to
- lt - Less than
- gt - Greater than
- le - Less than or equal to
- ge - Greater than or equal to

The most common types of values are `String`, `Number`, `Boolean` and `Date`. If you need a more specific
type, please refer to [the OData spec](https://www.odata.org/documentation/odata-version-2-0/overview/).

As a base, the remapper looks like this:

Input:

```json
{"exclude":"Peter"}
```
```yaml
filter.from:
  name:
    type: String
    comparator: ne
    value:
      prop: exclude
  age:
    type: Number
    comparator: lt
    value: 10
  height:
    type: Number
    comparator: le
    value: 1.75
  heightString:
    type: Number
    comparator: le
    value: "1.75"
  birthday:
    type: Date
    comparator: ge
    value: 2000-01-01
  friendsSince:
    type: Date
    comparator: ge
    value: 2014-01-01T00:00:00Z
  job:
    type: String
    comparator: eq
    value: null
  employed:
    type: Boolean
    comparator: eq
    value: false
  id:
    type: Guid
    comparator: eq
    value: 03a0a47b-e3a2-e311-9402-00155d104c24
  undefined:
    type: String
    comparator: eq
  special:
    type: String
    comparator: eq
    value: Special character's "test" \%&+?^/

```
Result:

```json
"name ne 'Peter' and age lt 10 and height le 1.75 and heightString le 1.75 and birthday ge 2000-01-01 and friendsSince ge 2014-01-01T00:00:00Z and job eq null and employed eq false and id eq 03a0a47b-e3a2-e311-9402-00155d104c24 and undefined eq null and special eq 'Special character''s \"test\" \\\\%&+?^/'"
```

Here is an example of how you can use the remapper in an app definition:

```yaml
type: resource.query
  resource: myResource
  query:
    object.from:
      $filter:
        filter.from:
          name:
            type: String
            comparator: ne
            value: { prop: exclude }
          age:
            type: Int64
            comparator: lt
            value: 10
          birthday:
            type: Date
            comparator: ge
            value: '2000-01-01'
          job:
            type: String
            comparator: eq
            value: null
          employed:
            type: Boolean
            comparator: eq
            value: false
          special:
            type: String
            comparator: eq
            value: "Special character's test"
```

With this remapper you can generate an OData order, ready to be passed to the `$orderby` key in
resource queries.

The different order options are as follows:

- asc - Ascending
- desc - Descending

```yaml
order.from:
  name: asc
  age: desc

```
Result:

```json
"name asc,age desc"
```

Here is an example of how you can use the remapper in an app definition:

```yaml
type: resource.query
  resource: myResource
  query:
    object.from:
      $orderby:
        order.from:
          name: asc
          age: desc
```

Pick and return a random entry from an array. If the input is not an array, the input is returned as-is.
For example:

If you input the following array:
```json
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

```yaml
random.choice: null
```

The result could return any one of these numbers.

You can also combine different data types in this array and have it work in the same way. If mixed in
strings, the result could be either one of the provided numbers or one of the provided strings.

```json
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "Peter", "Patrick", "Michael", "Harry"]
```

Pick and return a random integer between the provided lowest and highest values.
For example:
```yaml
random.integer:
  - 0
  - 1000
```

Returns a random integer between 0 and 1000.

Pick and return a random float value between the provided lowest and highest values.
For example:
```yaml
random.float:
  - 0
  - 1
```

Returns a random float value between 0 and 1.

Pick and return a random string from a given length using characters from a given input string defined in `choice`.
For example:
```yaml
random.string:
  choice: abcdefghijklmnopqrstuvwxyz0123456789
  length: 6
```

Returns a randomized string that is 6 characters long and consists of any characters in the `choice` field, like: `g8ajss9`.

Convert a string to upper or lower case.

Input:

```json
"Patrick"
```
```yaml
string.case: upper

```
Result:

```json
"PATRICK"
```

Check if the initial characters of the string matches with the input string,
this remapper is case-sensitive.
Input:

```json
"Random string here"
```
```yaml
string.startsWith: Random

```
Result:

```json
true
```

Alternative way to define input to facilitate the case-insensitive matching

Check if the last characters of the string matches with the input string,
this remapper is case-sensitive unless specified explicitly,
To make the remapper ignore casing of the input and passed string, use the following example
Input:

```json
"Random string here"
```
```yaml
string.endsWith:
  substring: Here
  strict: false

```
Result:

```json
true
```

The message id pointing to the template string to format.

The template default string to format.

A set of remappers to convert the input to usable values.

Format a string using remapped input variables.
Useful for replacing static text with generated values.

Input:

```json
{"lotteryPrize":"5000"}
```
```yaml
string.format:
  template: You have won €{lotteryAmount} in the lottery!!
  values:
    lotteryAmount:
      prop: lotteryPrize

```
Result:

```json
"You have won €5000 in the lottery!!"
```

> **Tip:** Considering this can be inserted anywhere a remapper is accepted. You can also use this
> to choose specific URL’s more accurately.

Uses RegEx to find a value in a string and replace it with a given value.

Input:

```json
"Eindhoven is the best city in the Netherlands"
```
```yaml
string.replace:
  (best*)\w+: cleanest

```
Result:

```json
"Eindhoven is the cleanest city in the Netherlands"
```

Checks if the provided string is a substring of the input string.
Input:

```json
"Input string"
```
```yaml
string.contains: string

```
Result:

```json
true
```

Create a calendar event. This event can be downloaded as an `.ics` file and
uploaded to your agenda using the [download](../reference/action#download) action.

For example, the following input:
```yaml
ics:
coordinates
  object.from:
    latitude: 38.897700545442646
    longitude: -77.03655660152435
description: "Sprint planning meeting"
duration: 1d
end: 2023-07-19
location: The Oval Office.
start: 2023-07-18
title: Important Meeting
url: https://google.nl
```

Creates the following ICS-formatted object:
```
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
PRODID:http://remappers.appsemble.localhost:9999
METHOD:PUBLISH
X-PUBLISHED-TTL:PT1H
BEGIN:VEVENT
UID:b8TsbczhfpIxPM-3lNHQz
SUMMARY:Important Meeting
DTSTAMP:20230703T102029Z
DTSTART:20230717T220000Z
DTEND:20230718T220000Z
DESCRIPTION:Sprint planning meeting
URL:https://google.nl
GEO:38.897700545442646;-77.03655123710632
LOCATION:The Oval Office.
END:VEVENT
END:VCALENDAR
```

The start of the icalendar event.

The end of the icalendar event.

The duration of the event.

The title of the event.

An optional description of the event.

An optional link to attach to the event.

An optional location description to attach to the event.

An optional geolocation description to attach to the event.

  This must be an object with the properties `lat` or `latitude`, and `lon`, `lng` or `longitude`.

Strip all null, undefined, and empty array values from an object or array.
For example, with the following input value:
```json
[0, 4, null, null, "Peter", 0.4234, null]
```
```yaml
null.strip: null
```

The null values will be removed, leaving a dense array:
```json
[0, 4, "Peter", 0.4234]
```

Instead of giving it `null` as option, you can also provide a `depth` property to specify how
deep to recurse into the object or array to remove null values.

For example, with the following input:
```json
{
  0: [0, null, "Peter"],
  1: {
    "array1": [4, null, 0.4234, null]
  }
}
```

You can specify to which degree of depth you want the null values to be removed.
With this remapper definition:
```yaml
null.strip:
  depth: 2
```

It will only check two objects in for any null values. That means only the first array within the
object will be checked. The result looks like this:
```json
{
  0: [0, "Peter"],
  1: {
    "array1": [4, null, 0.4234, null]
  }
}
```

Options for the null.strip remapper.

How deep to recurse into objects and arrays to remove null values.

Returns the type of the input object

For example, with the following input value:
```json
[0, 5, 7, 8]
```
```yaml
type: null
```

The result will be:
```json
"array"
```

Logs in the browser's console and returns the incoming data and the remapper function's context.

The context contains relevant info about the app, like the URL and locale, but also contains the
remapper’s history.

The options represent the level of logging that will show in the console.

- `input`: The input data going into this remapper,
- `context`:
  - `root`: The input data going into this remapper,
  - `appId`: ID of the application,
  - `url`: Absolute URL of the page where the remapper was fired,
  - `appUrl`: Base URL of the application,
  - `pageData`: Current page data of a FlowPage (See [page remapper](./data#page)),
  - `userInfo`: User's information if they are logged in (See [user remapper](./data#user)),
  - `context`: Internal context
  - `history`: Complete list of this remapper’s history (See [history remapper](./history))
  - `locale`: The user’s locale,
  - `stepRef`: In a loop page, gives the properties from the loop’s current data index (See [step remapper](./data#step))

For example:

```json
{
  "input": {
    "name": "Peter",
    "age": 49,
    "birthday": "07-08-2023"
  },
  "context": {
    "root": {
      "name": "Peter",
      "age": 49,
      "birthday": "07-08-2023"
    },
    "appId": 49,
    "url": "http://remappers.appsemble.localhost:9999/en/other",
    "appUrl": "http://remappers.appsemble.localhost:9999",
    "pageData": {
      "triedAppsemble": false
    },
    "userInfo": {
      "email": "example@hotmail.com",
      "email_verified": true,
      "name": "Example User 1",
      "picture": "https://www.gravatar.com/avatar/f46b82357ce29bcd1099915946cda468?s=128&d=mp",
      "sub": "0000-0000-0000-0000",
      "locale": "en",
      "zoneinfo": "Europe/Amsterdam"
    },
    "context": {},
    "history": [
      [
        0,
        4,
        null,
        null,
        "Peter",
        0.4234,
        null
      ],
      {
        "name": "Peter",
        "age": 49
      },
      {
        "name": "Peter",
        "age": 49,
        "birthday": "07-08-2023"
      }
    ],
    "locale": "en",
    "stepRef": {
      "current": {
        "answerType": "multiple choice",
        "question": "How much do you enjoy working here?"
      }
    }
  }
}
```

This can be used to parse an xml string into an object

For example:

Input:

```json
{"xml":"\n<obj>\n  <foo>bar</foo>\n  <item foo=\"bar\">\n    <item foo=\"bar\">\n      <text>text</text>\n    </item>\n  </item>\n  <item bar=\"baz\">\n    <item bar=\"baz\">\n      <text>text 2</text>\n    </item>\n  </item>\n  <item>\n    <item foo=\"bar\">\n      <item foo=\"bar\">\n        <text>text</text>\n      </item>\n    </item>\n    <item bar=\"baz\">\n      <item bar=\"baz\">\n        <text>text 2</text>\n      </item>\n    </item>\n  </item>\n</obj>\n"}
```
```yaml
xml.parse:
  prop: xml

```
Result:

```json
{
  "obj": {
    "foo": "bar",
    "item": [
      {
        "foo": "bar",
        "item": {
          "foo": "bar",
          "text": "text"
        }
      },
      {
        "bar": "baz",
        "item": {
          "bar": "baz",
          "text": "text 2"
        }
      },
      {
        "item": [
          {
            "foo": "bar",
            "item": {
              "foo": "bar",
              "text": "text"
            }
          },
          {
            "bar": "baz",
            "item": {
              "bar": "baz",
              "text": "text 2"
            }
          }
        ]
      }
    ]
  }
}
```

This can be used to perform a mathematical operation on two numbers

For example:

Input:

```json
{"version":0}
```
```yaml
maths:
  a:
    prop: version
  b:
    static: 1
  operation: add

```
Result:

```json
1
```

An organization groups a set of users, apps, themes, and permissions together

The unique identifier for the organization.

The display name for the organization.

The description of the organization.

The email address of the organization.

The website of the organization.

The URL used to fetch the organization’s icon.

A member of an organization.

The primary email address of the user.

Member AppTranslator AppContentsExplorer AppContentsManager AppMemberManager AppGroupManager AppGroupMembersManager AppManager AppCollectionManager BlockManager Maintainer Owner

Additional custom properties that a user might have.

Action fired on page events

This action is fired when a page loads, highly helpful in loading data for the page

The list of blocks that are displayed on the page.

Each page requires at least one block. Blocks are displayed in the order that they are defined in
the list.

The blocks that make up a page.

Whether or not the page name should be displayed in the *app bar*.

The name of the page when displayed in the navigation menu.

  Context property `name` can be used to access the name of the page.

Whether or not the page should be displayed in navigational menus.

  By default all pages without parameters are added to navigational menus. Set to `true` to hide the
  page from menus.

The type of navigation displayed on the page.

This overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or
App navigation are not set.

Set to `bottom` to use a navigation pane at the bottom of the screen instead of the default side
menu. Set to `hidden` to display no navigational menus at all.

An optional icon from the fontawesome icon set

This will be displayed in the navigation menu.

Page parameters can be used for linking to a page that should display a single resource.

This defined as a list of strings representing the properties to pass through. More often than not
passing `id` through is sufficient, depending on the block.

A Remapper that resolves to a number to be visibile in the side-menu.

A representation of an App rating.

A value ranging from 1 to 5 stars rating of the App.

An optional explanation of the given rating.

The name of the user who submitted the rating.

A boolean remapper is always returned directly.

A null remapper is always returned directly.

A numeric remapper is always returned directly.

A string remapper is always returned directly.

Performs an HTTP request.

This can be used to call the Appsemble API or an external API in order to fetch data or send data.
When sending `POST`, `PUT`, `DELETE` and `PATCH` calls the data that is currently available
in the block gets passed through.

If the content type of the request is `text/xml` or `application/xml`, the data will be
converted to JSON.

A remapper that results in the URL to send the request to.

Can be a relative URL (E.g. `/api/health`) for usage with the Appsemble API, or an absolute URL
(E.g. `https://example.com`) for usage with external sites.

The type of request to make.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

application/xml text/plain application/x-www-form-urlencoded multipart/form-data

A resource can be anything defined as described in an app resource definition.

Count the number of resources a similar `resource.query` action would return.

The type of the resource to count.

If only the resources created by the authenticated app member should be included

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Create a resource.

The type of the resource to create.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

A definition of how this resource works.

A time string representing when a resource should expire.

Example: 1d 8h 30m

Whether the resource should be able to be transferred when cloning the app it belongs to

JSON schema definitions that may be used by the app.

References to other resources.

The key is the property that references the other resource. The value is an object describing the
name of the resource and how it should behave.

A reference to between two resource types.

Defines what happens when the specified action is executed on the referenced resource.

Defines the type of trigger and the cascading strategy for it

Defines the cascading strategy.

If 'update' is specified, the referencing property of the referencing resource is set to null.

If 'delete' is specified, the referencing resource is deleted.

If not specified, the referenced resource cannot be deleted
without deleting the referencing resource first.

Defines what happens when the specified action is executed on the referenced resource.

Defines the type of trigger and the cascading strategy for it

Defines the cascading strategy.

If 'update' is specified, the referencing property of the referencing resource is set to null.

If 'delete' is specified, the referencing resource is deleted.

If not specified, the referenced resource cannot be deleted
without deleting the referencing resource first.

Defines what happens when the specified action is executed on the referenced resource.

Defines the type of trigger and the cascading strategy for it

Defines the cascading strategy.

If 'update' is specified, the referencing property of the referencing resource is set to null.

If 'delete' is specified, the referencing resource is deleted.

If not specified, the referenced resource cannot be deleted
without deleting the referencing resource first.

Defines what happens when the specified action is executed on the referenced resource.

Defines the type of trigger and the cascading strategy for it

Defines the cascading strategy.

If 'update' is specified, the referencing property of the referencing resource is set to null.

If 'delete' is specified, the referencing resource is deleted.

If not specified, the referenced resource cannot be deleted
without deleting the referencing resource first.

Whether to enable position column for the instances of this resource. This is used for keeping an ordered list to enable custom sorting of the data using drag and drop features.

Group resources by fields when handling resource positions

URL to use if not otherwise specified.

Name of the field used when accessing singular entities.

A definition of how versioning should happen for instances of this resource.

Setting this to `true` is the same as using an object with the property `data` set to `true`.

Overrides for 'query' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Overrides for 'get' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Overrides for 'count' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Overrides for 'create' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Overrides for 'patch' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Overrides for 'update' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Overrides for 'delete' requests.

The query parameters to use in the request.

HTTP method to use for this type of request.

URL to use for this type of request.

Delete a resource.

The type of the resource to delete.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Delete all instances of a resource.
> **Warning!**
>
> Use this action with caution to avoid losing precious data!

The type of the resource to delete.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Delete several instances of a resource.

The type of the resource to delete.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Get a single resource.

The type of the resource to get.

The view to use for the resource.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

A definition of how versioning works for instances of this resource

If set to `false`, edits are still tracked, but exactly what changed is lost.

Get the complete history of a resource.

The type of the resource to get.

The type of request to make.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Hooks that are triggered upon calling a resource action.

Patch a resource.

The type of the resource to patch.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Query a list of resources.

The type of the resource to query.

The view to use for the resource.

If only the resources created by the authenticated app member should be included

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

This describes how a user is subscribed to a resource.

If true, the user is subscribed to any create actions for the resource type

If true, the user is subscribed to any update actions for the resource type

If true, the user is subscribed to any delete actions for the resource type

A mapping of resource IDs to individual resource subscriptions

The subscription status of a user for a single resource.

If true, the user is subscribed to update actions on this particular resource.

If true, the user will be notified when this particular resource is deleted.

Get the status of whether or not the user is subscriped to notifications for resource modifications.

The type of the resource to get the subscription state for.

The resource action type to get the subscription state for.

Subscribe to notifications on resource modifications.

The type of the resource to subscribe to.

The resource action type to subscribe to.

Toggle whether or not to receive notifications on resource modifications.

The type of the resource to toggle the subscription state for.

The resource action type to toggle the subscription state for.

Unsubscribe from notifications on resource modifications.

The type of the resource to unsubscribe from.

The resource action type to unsubscribe from.

Update a resource.

The type of the resource to update.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Update the position of a resource.

The type of the resource to update.

A remapper that results in either an object containing each property of the query string, or a string that gets passed through as-is.

remapper that results in the request body to send.

If not specified, the raw input data is used.

By default requests will be proxied through the Appsemble API.

This allows to protect user data and ensures
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) is enabled. This behavior can be
disabled by setting this to `false`

The name of the schema to validate against before submitting data.

The headers to be set for the outgoing request

Content type for the outgoing request

Alternative views of a resource that are modified using remappers and support different sets of roles.

A custom view for a resource.

The list of roles that are allowed to use this view.

The modified view.

The SSL secret of an app.

The public SSL certificate chain in PEM format.

The SSL private key in PEM format.

A single sign on configuration which is exposed to users.

The URL users will be redirected to in the login process.

A user readable name for the configuration.

A Font Awesome icon.

A SCIM patch operation

Patch operations to apply to the resource

A SCIM patch single replace operation

A SCIM patch bulk replace operation

An app’s SCIM configuration.

Whether or not SCIM is enabled for the app.

The secret SCIM token

The definition of a user according to the SCIM documentation.

A unique identifier for the user (generally maps to the Azure AD user principal name)

Read-only metadata maintained by the service provider

A user's email. By default, one of these should be of type 'work' and have 'primary' set to true. Value contains actual address

This describes the permissions that unauthenticated users have.

The name of the role to inherit from.

Note that this role must exist.

Specific permissions within the app, which unauthenticated users should have

The default role to apply to members.

How the `default` role gets applied to users.

The following values are allowed:
- `everyone`: Every authenticated user gets the default role.
- `organization`: Every authenticated user gets the default role if they are in the same organization as the app.
- `invite`: The app member has to be invited to the app with a specific role.

> **Important**: When [OAuth2](../guides/oauth2) or [SAML2.0](../guides/saml) is used in the
> app, you must set the policy to `everyone`. This will specifically allow every configured
> authentication method on the secrets page to be used as login method. If you do not want other
> Appsemble user accounts to be able to log in, you must `disable` the `appsemble login` options
> (including the Appsemble OAuth2 option) in the secrets page. If this option is enabled, any
> Appsemble user account is able to log in to the app and will receive the default role.

The default role to apply to members.

This must match with one of the roles defined within the security definition.

This describes how the app is secured.

This property defines the app roles that are available within the app.

This describes the permissions that unauthenticated users have.

The name of the role to inherit from.

Note that this role must exist.

Specific permissions within the app, which unauthenticated users should have

This describes a security role.

The description of the role.

The default page to redirect users with this role to.

The name of the role to inherit from.

Note that this role must exist and can not inherit itself via this field or the `inherits` field
of the referenced role.

Specific permissions within the app, which this role should have

The `share` action can be used to display a prompt that allows the user to share something with others, primarily via social media.

Depending on whether the user’s browser supports a native share function it will either display a
native dialog for sharing links, or display a more limited fallback in a dialog.

The url that is being shared.

The title that should be shared.

The main body that should be shared.

The `static` action returns static data defined in the action definition.

This is useful for example for stubbing data.

The static value to return.

Append data to an existing array in storage.
      If the storage entry is a single object, it turns it into an array to append the data on.

For example:
```yaml
type: storage.append
key: temp
value: { root }
storage: localStorage
remapBefore:
  object.from:
    text:
      This is a new data item
    value:
      1
```

The key of the storage entry.

The data to write on top of the storage entry.

indexedDB localStorage sessionStorage appStorage

The mechanism used to store the data.

Delete the item that is stored at the specified key.

For example:
```yaml
type: storage.delete
key: temp
storage: localStorage
```

The key of the storage entry to remove.

The mechanism used to remove the data from.

Read data from the app’s local storage.

For example:
```yaml
type: storage.read
key: temp
storage: localStorage
```

The key of the storage entry.

The mechanism used to read the data from.

Subtract last item from a storage entry.

If the entry consists of only one item, turns it into a singular object.

If the entry is a single item, the entry is removed entirely.

For example:
```yaml
type: storage.subtract
key: temp
storage: localStorage
```

The key of the storage entry.

The mechanism used to read the data from.

Update an existing item in storage, or update an item inside a stored array.

For example:
```yaml
type: storage.update
key: temp
item: 1
value: { root }
storage: localStorage
remapBefore:
  object.from:
    text: { prop: text }
    value: { prop: value }
    newField: "New field"
```

The key of the storage entry.

The key of the item in an array to update.

The data to update the specified item with.

The mechanism used to store the data.

Write data to the app’s local storage.

For example:
```yaml
type: storage.write
key: temp
value: { root }
storage: localStorage
remapBefore:
  object.from:
    data:
      cool data
    value:
      1
```

The key of the storage entry.

The data to write to the storage entry.

Set an expiry for your data, only works with the localStorage

The mechanism used to store the data.

This describes what a sub page will look like in the app.

The name of the sub page.

The blocks that make up a page.

Shows a set of subpages as tabs at the top of the page.

Each of the available tabs for the tabs page.

Generate tabs dynamically

Whether or not the page name should be displayed in the *app bar*.

The name of the page when displayed in the navigation menu.

  Context property `name` can be used to access the name of the page.

Whether or not the page should be displayed in navigational menus.

  By default all pages without parameters are added to navigational menus. Set to `true` to hide the
  page from menus.

The type of navigation displayed on the page.

This overrides the navigation property of the app itself. Defaults to `left-menu` if navigation or
App navigation are not set.

Set to `bottom` to use a navigation pane at the bottom of the screen instead of the default side
menu. Set to `hidden` to display no navigational menus at all.

An optional icon from the fontawesome icon set

This will be displayed in the navigation menu.

Page parameters can be used for linking to a page that should display a single resource.

This defined as a list of strings representing the properties to pass through. More often than not
passing `id` through is sufficient, depending on the block.

A Remapper that resolves to a number to be visibile in the side-menu.

A generic theme definition.

The generic theme color of the app.

This is used for example in the URL bar on Android.

The background color of the PWA splash screen.

This defaults to the theme color.

The primary color used within the app.

This is used in various elements like the navbar.

The color used for links.

The color used for informational messages.

The color used for successful actions.

The color used for warning messages.

The color used for error messages.

The tileLayer to use for Leaflet maps.

The font to use in the app.

This action throws a new exception based on the data that is passed through.

This can be used to create a custom error that ends up in the error action handler.

Object representation of a training

Id of the training

Object which stores that a user has completed a certain training

The training that the user has completed.

The user who completed the training

An object representing a user

The id of the user.

    An email address that is linked to a user.

    Users may use any of their email addresses to login.

The email address that is registered

Wether or not the email address has been verified by the user.

An object representing the OAuth2 info of a user

The id of the user.

The full name of the user.

The email of the user.

Whether this email address has been verified.

The URL of the profile picture of the user.

The locale of the user.

The time zone of the user.

If the user is subscribed to the newsletter.

A webhook definition defines app specific callable endpoints that Appsemble can handle.

JSON schema definition of the payload.

The action to run when the webhook is triggered.

    OAuth2 login for apps.

    The authorization code flow is recommended. The password flow exists for legacy apps and will be
    removed in the future.

Login the user to the requesting app using OpenID.

Read the user profile, including the display name and profile picture.

Manage app resources on behalf of a user.

Used for logging in to the web interface

    OAuth2 login for client credentials.

    For example the Appsemble CLI uses this.

Register and update blocks, and publish new block versions.

Modify app resources on behalf of a user.

Read information about the user’s groups.

Read information about the user’s groups.

Used SCIM clients

Used for authenticating requests made using Appsemble studio interface.

Used for webhook calls

Appsemble developer documentation

Appsemble

Welcome to the Appsemble API.

The app studio can be found on
> https://appsemble.app:9999

The OpenAPI explorer can be found on
> https://appsemble.app:9999/api-explorer

Pin an app to an app collection

appCollectionId

The id of the app collection to pin the app to

appId

The id of the app to pin

The app was pinned to the app collection

Unpin an app from an app collection

appCollectionId

The id of the app collection to unpin the app from

appId

The id of the app to unpin

The app was unpinned from the app collection

Remove an app from an app collection

appCollectionId

The id of the app collection

appId

The id of the app

The app was removed from the app collection

Get a list of apps in an app collection

appCollectionId

The id of the app collection

language

The language to include the translations of, if available

A list of apps

Add an app to an app collection

appCollectionId

The id of the app collection

The app to add to the app collection

The app was added to the app collection

Get an app collection’s expert’s profile image

The id of the app collection

The app collection’s expert’s profile image

Get an app collection’s header image

The id of the app collection

The app collection’s header image

Get an app collection

The id of the app collection

An app collection

Update an app collection

The id of the app collection

The app collection to update

The updated app collection

Delete an app collection

The id of the app collection

The app collection was deleted

Get a list of app collections

A list of app collections

token

The token of the invite.

Respond to a given invitation.

The response of the invitation.

        If response is true, user will join the app. If response is false, the user declines the invite and the invite is removed.

The response has been processed.

The token of the invite.

Fetch information about an invite.

An invite response

appMemberId

The id of the member on which to perform the operation

Get an app member’s profile picture.

  This will return a 404 if the user has not uploaded one.

The profile picture of the app member.

The id of the app member on which to perform an operation

Patch the properties of an app member.

The member’s custom properties.

The updated app member

The id of the app member on which to perform an operation

Patch an app member.

The updated app member

The id of the app member on which to perform an operation

Delete an app member.

The app member was deleted successfully.

path

The path to the action to execute.

Proxy a GET request action

The proxied response

data

The data that was passed to the action

Proxy a DELETE request action

The proxied response

The data that was passed to the action

Proxy a PATCH request action

The proxied response

The data that was passed to the action

A `multipart/form-data` representation of a resource.

A list of assets that should be linked to the resource.

Proxy a POST request action

The proxied response

The data that was passed to the action

A `multipart/form-data` representation of a resource.

A list of assets that should be linked to the resource.

Proxy a PUT request action

The proxied response

The data that was passed to the action

A `multipart/form-data` representation of a resource.

A list of assets that should be linked to the resource.

Get the number of assets in the app.

The number of assets in the app.

Get a single asset

The asset that matches the given id.

Get the headers for a single asset

The headers of the asset that matches the given id.

Remove an existing asset

The asset was successfully deleted.

Get all of the app’s assets.

The assets associated with the app.

Upload a new asset.

The asset to upload.

The request body for creating an asset.

The binary data of the asset. This may include a filename.

The given name of the asset. Assets may be referenced by their name or ID in the API.

Whether the asset should be transferable when cloning the app they are in.

The asset that was created.

Delete multiple app assets.

An array of asset IDs to remove.

The app assets have been deleted successfully.

Broadcast a push notification to every subscriber of the app.

The data to include in the notification

The title of the notification. This defaults to the name of the app if not otherwise specified.

The content of the notification

The notification has been successfully broadcasted.

Get a list of app groups.

The list of all groups.

An app demo group

Fetch all demo members of an app.

The list of app demo members.

Get the app’s email settings.

The current app email settings

The name used for emails.

The hostname of the SMTP server.

Whether a password is set.

The username used to authenticate against the SMTP server.

The port used for the SMTP server.

Whether TLS is being used.

Export an app as a zip file

resources

Whether to include resources for an app.

assets

Whether to include assets in the export file

screenshots

Whether to include screenshots in the export file

readmes

Whether to include readmes in the export file

App exported successfully.

Get a list of app groups.

The list of all groups.

An app group

Create a new group.

The group to create.

The created group

The role of the user who created the group

Get the current app icon.

The icon of the app that matches the given id.

Delete the current app icon.

The icon has been successfully removed

Request to resend an invitation.

The email of the person to resend the invitation to.

The invite has been sent.

Get a list of invited app members.

The list of all invites.

Invite a new app member to an app.

The invite to create.

The email address of the user to invite.

The role to invite the user as.

The invited member

Revoke an app member invitation.

The email address to revoke the invite of.

The invitation has been successfully revoked.

Update the locked property an app.

Whether the app should be locked.

Lock status successfully changed

Delete the current app’s maskable icon.

The icon has been successfully removed

Get a list of groups that the app member is a member of.

The list of groups of the app member.

Link the app member to an unlinked authorization.

The external id of the of the external user.

The `externalId` maps to the following ids of the external login methods.
- Appsemble OAuth2 login: `UserId`
- App OAuth2 login: `sub`
- App SAML login: `nameId`

The secret that was used to get the external id.

      Get the app member information formatted as OpenID user info.

      See https://connect2id.com/products/server/docs/api/userinfo

OpenID compatible app member information

The subject (end-user) identifier.

The full name of the end-user

The URL of the profile page for the end-user.

The URL to the app member profile.

The end-user’s preferred email address.

True if the end-user’s email address has been verified, else false.

Custom app member properties.

Update the data of the currently logged in app member

The member’s profile picture.

The member’s custom properties.

The preferred locale of the user.

The patched app member

Fetch all members of an app.

The list of app members.

merge

Whether the language’s messages should be merged with its base language.

override

Whether the app’s language overrides should be included and merged.

Delete the app’s messages for this language.

The messages have successfully been deleted.

Get the app’s messages for this language.

The app messages for the selected language.

Get a list of all languages with messages.

The list of supported languages

Upload messages for the given language.

The translation was created.

Email quota for an app

Number of emails sent today

Maximum number of emails that can be sent today

Date and time when the quota resets

Fetch all ratings of an app.

The list of apps ratings.

Submit an app rating.

The submitted app rating.

Get a readme of an app.

The app readme

The app has successfully been reseeded.

Get a count of all resources of this app.

The count of all this app’s resources of this type.

Get the subscription status of a resource.

The subscription status of the resource that matches the given id.

$own

If the resources created by the authenticated app member should be included

Get a single app resource.

The resource that matches the given id.

Update an existing app resource.

The updated resource.

Patch an existing app resource.

The patched resource.

Delete an existing app resource.

The app resource has been deleted successfully.

Get the current subscription status of this resource.

The subscription status for this resource.

Get all resources of this app.

The list of all this app’s resources of this type.

Create a new resource for this app.

The resource to create

A `multipart/form-data` representation of a resource.

A list of assets that should be linked to the resource.

The resource that was created.

Update existing app resources.

The resources to update

A `multipart/form-data` representation of a resource.

A list of assets that should be linked to the resources.

The updated resources.

Delete multiple app resources.

An array of resource IDs to remove.

The app resources have been deleted successfully.

Get the known history of a resource

The resource that matches the given id.

Update the current position of the resource in the order.

The subscription status of the resource that matches the given id.

The updated position

Delete all app seed resources.

The app resources have been deleted successfully.

A list of the SAML secrets for the app.

A list of the SAML secrets for the app.

Get the SAML entity ID metadata

SCIM user

SCIM user

The SCIM Schema

The SCIM Schema

SCIM user

userId

The ID of the member to perform the operation on

SCIM user

SCIM user

SCIM user

SCIM user

Integrated SCIM user schema

SCIM user

Get a screenshot of an app.

The app screenshot

Delete an existing screenshot.

The screenshot has been successfully deleted.

Add one or multiple screenshots of an app.

Screenshots to showcase in the store

The language for which the screenshots will be uploaded

The screenshots have been successfully created.

The ID of the newly created screenshot.

            Get a partial app OAuth2 secret

            Only public facing values are output on this endpoint.

            Get a partial app OAuth2 secret

            Only public facing values are output on this endpoint.

The updated OAuth2 secret.

The deleted OAuth2 secret.

A list of the OAuth2 secrets for the app.

A list of the OAuth2 secrets for the app.

The deleted app OAuth2 secrets.

The updated SAML secret.

The deleted SAML secret.

A list of the SAML secrets for the app.

A list of the SAML secrets for the app.

The deleted app saml secrets.

Get app SCIM secret configuration

The app SCIM configuration

Update app SCIM secret configuration

The app SCIM configuration

The updated app service secret.

The deleted app service secret.

The created app service secret.

The list of app service secrets.

The deleted app service secrets.

Get the SSL certificate of an app

The SSL secret of the app.

Update the app’s SSL secret

The updated SSL secret.

The requested webhook secret.

The updated app webhook secret.

The deleted app webhook secret.

The created app webhook secret.

The list of app webhook secrets.

snapshotId

The ID of the snapshot

The ID of the snapshot.

Get a single snapshot made of the app.

The snapshot

The ID of the snapshot.

The app definition.

The creation date of the snapshot.

Get a list of snapshots made of the app.

The available snapshots

The ID of the snapshot.

The creation date of the snapshot.

Get the app style for a block.

The stylesheet associated with this block for this app.

Upload a block stylesheet for this app.

The new app block stylesheet.

If this is true, the app lock is ignored.

The block style has been updated successfully.

Get the core style for this app.

The core stylesheet associated with this app.

Get the shared style for this app.

The shared stylesheet associated with this app.

Fetch all subscription settings of an app.

The subscription settings.

Subscribe to an app’s push notifications

A serialized PushSubscription object

The subscription has successfully been registered.

Subscribe to an app’s push notifications. If value isn’t set it will toggle between subscribing and unsubscribing.

The subscription has successfully been updated.

The updated app variable.

The deleted app variable.

The list of app variables.

The created app variable.

The deleted app variables.

Call a webhook defined in the app

The webhook was called successfully.

language

The language to include the translations of, if available

Get a single app

The app that matches the given id.

Update parts of an existing app

Whether the locked property should be ignored.

The original YAML definition used to define the app.

The app icon.

The app icon.

The custom style to apply to the core app.

The custom style to apply to all parts of app.

Screenshots to showcase in the store

Readmes to showcase in the store

Custom app logic as a JavaScript string

Appsemble SDK interfaces implementations

Whether the Appsemble login method should be shown.

Whether the Appsemble OAuth2 login method should be shown.

Whether new users should be able to register themselves.

The name used for emails.

The hostname of the SMTP server.

The password to use for SMTP authentication. This gets encrypted when stored.

The username used to authenticate against the SMTP server.

The port used for the SMTP server.

Whether TLS is being used.

The updated app.

Delete an existing app

The app was successfully deleted.

Login using the Appsemble studio.

Logged in successfully.

Register a new app account using an email address and a password.

The user account to register.

The account’s profile picture.

The member’s custom properties.

The account that was created.

Resend the verification code for a registered email.

The verification email was sent if an account was found in the database.

Request a reset token for resetting passwords.

The request has been received and an email was sent if it exists.

Reset a password using a password reset token.

The password has been reset.

Verify the email address of a registered user.

The user account to register.

The account was successfully verified.

Create a new app

dryRun

Validate whether an app could be created without actually creating one. Must be set to ‘true’.

The original YAML definition used to define the app.

The app icon.

The app icon.

The background color to use for the maskable icon.

The custom style to apply to the core app.

The custom style to apply to all parts of app.

Screenshots to showcase in the store

Readmes to showcase in the store

Custom app logic as a JavaScript string

Appsemble SDK interfaces implementations

The app that was created.

language

The language to include the translations of, if available

Get all publically available apps.

The list of all public apps.

Fetch a list of all available templates.

The list of all available templates.

The name of the template.

The description of the template.

Whether this template supports pre-made resources

Register a new app using a template.

The template to use for app creation.

The ID of the template.

Include example resources.

Include example assets.

Include example variables.

Include example secrets.

Login using the Appsemble studio.

Logged in successfully.

Register a new studio account using an email address and a password.

The user account to register.

The account that was created.

Reset a password using a password reset token.

The password has been reset.

Update password

Password changed.

Resend the verification code for a registered email.

The verification email was sent if an account was found in the database.

Request a reset token for resetting passwords.

The request has been received and an email was sent if it exists.

Verify the email address of a registered user.

The user account to register.

The account was successfully verified.

Create an account using an OAuth2 authorization.

The OAuth2 client credentials

An access token response.

asd

Refresh an access token using the Appsemble studio

The refresh token to use for refreshing the session.

The token has been refreshed successfully.

Get a single block

The latest version of the block that matches the given id.

Retrieves all available versions of a block.

A list of versions of a block.

Retrieve a string list of all versions of a block.

String list of all versions of a block.

Retrieve a single block version.

Delete a single block version.

Block version has successfully been deleted

Get the icon of a block version.

The icon that represents the block.

The language to get messages for.

Get internationalized messages for a block.

A key/value mapping of block messages.

A key/value mapping of block messages.

A translated block message.

filename

The file name of the block asset to download

Download a single block asset

The asset that has been requested.

Publish a block.

The new block version to publish.

Get all block’s latest definitions.

The list of all latest block versions.

Retrieve the logs related to a companion container

appId

Id of the app which defines the companion container

container

Name of the companion container to fetch the logs for

Logs of the container running in a specific app

Check whether or not the API is healthy

An indication the server is healthy.

Get the Appsemble messages for this language.

The app messages for the selected language.

Get a list of all languages with messages.

The list of supported languages

token

The token of the invite.

Respond to a given invitation.

The response of the invitation.

        If response is true, user will join the organization. If response is false, the user declines the invite and the invite is removed.

The response has been processed.

The token of the invite.

Fetch information about an invite.

An invite response

Get a list of app collections for an organization

organizationId

The id of the organization

A list of app collections

Create an app collection

The app collection to create

name expertName expertProfileImage headerImage

The created app collection

Import an app from a zip file

App imported successfully

language

The language to include the translations of, if available

Get a list of an organization’s apps. Private apps are excluded unless the user is in the organization.

The list of this organization’s apps.

Get a list of an organization’s blocks.

The list of this organization’s blocks.

Get the organization icon.

The icon that represents the organization.

Request to resend an invitation.

The email of the person to resend the invitation to.

The invite has been sent.

Get a list of invited organization members.

The list of all invites.

Member AppTranslator AppContentsExplorer AppContentsManager AppMemberManager AppGroupManager AppGroupMembersManager AppManager AppCollectionManager BlockManager Maintainer Owner

Invite a new member to the organization that matches the given id.

The member to invite.

The newly invited member.

Revoke a member invitation.

The email address to revoke the invite of.

The invitation has been successfully revoked.

organizationMemberId

The ID of the member

Set the role of the member within the organization.

The role to set.

The member’s role has been successfully updated.

The ID of the member to remove

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

The member has been successfully removed.

Get a list of organization members.

The list of all members.

Get a single organization.

Update an organization

The organization icon.

Delete an organization.

successfully deleted organization

Fetch the list of organizations.

The list of of organizations

Create a new organization.

The organization to create

The organization icon.

Check the SSL certificate status for the given domain names.

A mapping of domain name to their SSL status

token

The token of the invite.

Respond to a given invitation.

The response of the invitation.

        If response is true, user will join the app. If response is false, the user declines the invite and the invite is removed.

The response has been processed.

The token of the invite.

Fetch information about an invite.

An invite response

Set the role of a member within a group.

The role to set.

The member’s role has been successfully updated.

Get a certain group member from a group

The specified group member

Remove a member from a group.

The group member has been removed successfully.

Request to resend an invitation.

The email of the person to resend the invitation to.

The invite has been sent.

groupId

The ID of the group

Get a list of invited group members.

The list of all invites.

Invite a new user to a group.

The group invite to create.

The email address of the user to invite.

The role to invite the user as.

The invited member

Revoke a group member invitation.

The email address to revoke the invite of.

The invitation has been successfully revoked.

The ID of the group

Fetch the members of a group and their roles within the group.

The list of all members.

The ID of the group

Fetch an existing group.

The requested group

Update an existing group.

The group to update.

The updated group

Delete an existing group.

The group has successfully been deleted.

Get a list of timezones supported by the API

A list of timezones supported by the API

Fetch all completed trainings

An array of training IDs that the user has completed

Delete all completed trainings from user

Trainings successfully reset

Sets the status of this training to "completed" for this user

trainingId

The ID of the training to complete

Training successfully set to "completed"

Fetch all training ids stored on the server

An array of all training Id's

Get the accounts that have been linked to an app and the user

A list of linked accounts

Get the account that have been linked to the app and the user

A linked account

Get the account that have been linked to the app and the user

The member’s profile picture.

A linked account

language

The language to include the translations of, if available

Get all apps from organizations that the user is in.

The list of all apps the user is in.

Create a new OAuth2 consent.

Verify if the user has previously agreed to the requested OAuth2 consent.

Get a list of the current user’s OAuth2 authorizations.

An access token response.

Unlink a linked account from the logged in user.

The account was unlinked successfully.

clientId

The client id of the OAuth2 client credentials on which to perform an operation

Revoke the client credentials

The client credentials have been revoked successfully.

Register new OAuth2 client credentials for the authenticated user.

The OAuth2 client credentials

The newly created client credentials

Get a list of client credentials for the authenticated user

A list of client credentials entities.

List email addresses registered to logged in user's account.

The email address has been added successfully.

Register a new email to logged in user's account.

The email address has been added successfully.

Remove an existing email to logged in user's account.

The email address has been removed successfully.

Fetch the logged in user's organizations.

The organizations the logged in user is a member of.

Unsubscribe a user from the newsletter

Unsubscribed successfully

Invalid or missing admin API secret

Fetch the logged in user's profile.

The user's profile.

Update the logged in user's profile.

The user's profile.

Get a list of active and verified users subscribed to the appsemble newsletter

List of subscribed users

Invalid or missing admin API secret

account

Operations related to app accounts

app-member

Operations related to app members

app

Operations related to apps

action

Operations related to actions

app-collection

Operations related to app collections

app-definition

Operations related to the app definitions

asset

Operations related to assets

auth

Operations related to authentication

authorization

Operations related to authorizations

block

Operations related to blocks

client-credentials

Operations related to client credentials

common

Operations shared between apps and the studio

current-member

Operations related to the currently logged in user

current-user

Operations related to the currently logged in user

demo-group

Operations related to demo groups

demo-member

Operations related to demo members

email

Operations related to emails

invite

Operations related to invites.

main

Operations related to the main api

member

Operations related to members

Operations related to oauth2

organization

Operations related to organizations

rating

Operations related to ratings

readme

Operations related to readmes

resource

Operations related to the resources

saml

Operations related to saml

scim

Operations related to scim

screenshot

Operations related to screenshots

secret

Operations related to secrets

service

Operations related to service secrets

snapshot

Operations related to snapshots

ssl

Operations related to ssl

subscription

Operations related to subscriptions

group-member

Operations related to group members

group

Operations related to groups

template

Operations related to templates

training

Operations related to trainings

translation

Operations related to translations

user

Operations related to users.

variable

Operations related to app variables.

version

Operations related to versions.

webhook

Operations related to webhooks.

Provide a JSON object that satisfies the schema "AppDefinition". Here are the required top‑level fields: none (all optional). Return only the valid JSON object.