Extensions
The following schema describes the allowed and the required values. For more information about the individual attributes, see which information an Extension consists of.
- Schema documentation
- Example
- JSON Schema
- idstring (uuid)required
Globally unique identifier of the Extension
- contributorIdstring (uuid)required
Identifier of the contributor. Identical to the identifier of the customer/organization in the mStudio
- namestringrequired
Name of the Extension
- subTitleobjectrequired
A few words to promote your Extension.
- destring (≤ 40 characters)required
- enstring (≤ 40 characters)
- descriptionstringrequired
Short description of the Extension. It should explain the Extension concisely.
- detailedDescriptionsobject
Detailed description of the Extension in different languages
- deobjectrequired
Detailed description of the Extension in german
- markdownstring (≥ 1 characters)required
A markdown text description
- plainstring (≥ 1 characters)
A plain text description
- enobject
Detailed description of the Extension in english
- markdownstring (≥ 1 characters)required
A markdown text description
- plainstring (≥ 1 characters)
A plain text description
- contextstring (one of: project, customer)required
Defines, whether the Extension may be added to a project or an organization
- scopesarray of stringrequired
Permissions, the Extension requires
- Array[
- *string
]
- backendobjectrequired
- extensionAddedToContextobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension is added to an Extension context. May contain placeholders
- extensionInstanceUpdatedobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension Instance is updated. May contain placeholders
- extensionInstanceSecretRotatedobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension Instance secret is rotated. May contain placeholders
- extensionInstanceRemovedFromContextobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension Instance is removed from a context. May contain placeholders
- Array[
- *object
- indexobject
- namestring
The name the frontend will have in the list of Extension Frontends
- urlstring (uri)required
The URL that the user is directed to when they open the Extension in the mStudio. May contain placeholders
- emailstring (email)required
Email address that may be used for support requests
- phonestring (phone)
Phone number that may be used for support requests
- inheritedboolean
Weather the provided support information was inherited from the conrtributor
Tags that describe the Extension
- Array[
- *string
Weather this Extension has been published
Weather verification of the Extension has been requested
Weather the Extension has been verified
The fileId of the the Logo
weather the extension is functional
- Array[
- *object
- idstring (uuid)required
The fileId of the asset
- indexintegerrequired
The index of the asset. Does not have to be successive. Can be used to order the assets.
- assetTypestring (one of: image, video)required
- Array[
- *object
- secretIdstring (uuid)
- usableUntilstring (date-time)
This is a map of anchros to urls. The key of the map is the anchor of a frontend fragment.
- *object
The URL of the frontend fragment and additional properties for display in the mStudio.
- additionalPropertiesobject
- *string
Some Information needed for the mStudio like the icon.
- urlstring (uri)
- amountOfInstancesinteger
The amount of instances for this extension. Accurate for the Contributor. Publicly rounded to the next lower hundred.
- Array[
- *object
- priceInCentsintegerrequired
Price of the extension in Cents.
- variantKeystringrequired
Identifier of the pricing variant.
- namestring
Name of the pricing variant.
- descriptionstring
description of the provided services
- isBookingStoppedboolean
Weather the Variant can be installed
Requested Changes which have to be revied by a Mittwald Employee.
- contextstring (one of: project, customer)
- scopesarray of string
- Array[
- *string
]
- backendobjectrequired
- extensionAddedToContextobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension is added to an Extension context. May contain placeholders
- extensionInstanceUpdatedobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension Instance is updated. May contain placeholders
- extensionInstanceSecretRotatedobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension Instance secret is rotated. May contain placeholders
- extensionInstanceRemovedFromContextobjectrequired
- urlstring (≥ 1 characters, uri)required
The URL that the mStudio calls when the Extension Instance is removed from a context. May contain placeholders
id: f0f86186-0a5a-45b2-aa33-502777496347
contributorId: f0f86186-0a5a-45b2-aa33-502777496347
name: Example Extension
subTitle:
de: Erweitere das mStudio
en: Extend the mStudio
description: An example Extension to show which information is needed to create an Extension
detailedDescriptions:
de:
markdown: |-
# Ein Beispiel
Dies ist eine Beispiel Extension-Beschreibung.
## Weitere Informationen
Hier könnten **weitere** Informationen stehen.
plain: Eine ausführliche Beispiel Extension-Beschreibung. Diese enthält keine
Formatierungen.
en:
markdown: |-
# An example
This is an example Extension description.
## Further information
Here could be **further** information.
plain: string
context: project
scopes:
- project:read
webhookUrls:
backend:
extensionAddedToContext:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/added
extensionInstanceUpdated:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/updated
extensionInstanceSecretRotated:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/secret-rotated
extensionInstanceRemovedFromContext:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/removed
externalFrontends:
- index:
name: Example
url: https://example.org/:extensionInstanceId
support:
email: email@mittwald.example
phone: +49 170 123456
inherited: true
tags:
- mail
published: true
verificationRequested: true
verified: true
logoRefId: 9b2af58a-2625-41eb-adc6-bb6f7be9b90a
functional: true
assets:
- id: 709049e1-f283-4ef8-a35b-1b2f672852b0
index: 1
assetType: image
secrets:
- secretId: 6b87abc1-f0fd-4518-a21e-7c8bca3c7c25
usableUntil: 2025-10-14T00:31:16.593Z
frontendFragments:
string:
additionalProperties:
string: string
url: The URL of the frontend fragment.
extensionStatistics:
amountOfInstances: "42"
pricing:
- priceInCents: "5000"
variantKey: string
name: string
description: string
isBookingStopped: true
requestedChanges:
context: project
scopes:
- string
webhookUrls:
backend:
extensionAddedToContext:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/added
extensionInstanceUpdated:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/updated
extensionInstanceSecretRotated:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/secret-rotated
extensionInstanceRemovedFromContext:
url: https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/removed
{
"type": "object",
"required": [
"id",
"name",
"contributorId",
"context",
"createdAt",
"description",
"scopes",
"assets",
"logoRefId",
"published",
"statistics",
"subTitle",
"support",
"tags"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "Globally unique identifier of the Extension"
},
"contributorId": {
"type": "string",
"format": "uuid",
"description": "Identifier of the contributor. Identical to the identifier of the customer/organization in the mStudio"
},
"name": {
"type": "string",
"description": "Name of the Extension",
"example": "Example Extension"
},
"subTitle": {
"type": "object",
"description": "A few words to promote your Extension.",
"required": [
"de"
],
"properties": {
"de": {
"type": "string",
"maxLength": 40,
"example": "Erweitere das mStudio"
},
"en": {
"type": "string",
"maxLength": 40,
"example": "Extend the mStudio"
}
}
},
"description": {
"type": "string",
"description": "Short description of the Extension. It should explain the Extension concisely.",
"example": "An example Extension to show which information is needed to create an Extension"
},
"detailedDescriptions": {
"type": "object",
"description": "Detailed description of the Extension in different languages",
"required": [
"de"
],
"properties": {
"de": {
"type": "object",
"description": "Detailed description of the Extension in german",
"required": [
"markdown"
],
"properties": {
"markdown": {
"type": "string",
"description": "A markdown text description",
"minLength": 1,
"example": "# Ein Beispiel\nDies ist eine Beispiel Extension-Beschreibung.\n## Weitere Informationen\nHier könnten **weitere** Informationen stehen."
},
"plain": {
"type": "string",
"description": "A plain text description",
"minLength": 1,
"example": "Eine ausführliche Beispiel Extension-Beschreibung. Diese enthält keine Formatierungen."
}
}
},
"en": {
"type": "object",
"description": "Detailed description of the Extension in english",
"required": [
"markdown"
],
"properties": {
"markdown": {
"type": "string",
"description": "A markdown text description",
"minLength": 1,
"example": "# An example\nThis is an example Extension description.\n## Further information\nHere could be **further** information."
},
"plain": {
"type": "string",
"description": "A plain text description",
"minLength": 1,
"exmple": "A detailed example Extension description. This does not contain any formatting."
}
}
}
}
},
"context": {
"type": "string",
"enum": [
"project",
"customer"
],
"description": "Defines, whether the Extension may be added to a project or an organization"
},
"scopes": {
"type": "array",
"items": {
"type": "string",
"example": "project:read"
},
"description": "Permissions, the Extension requires"
},
"webhookUrls": {
"type": "object",
"required": [
"backend"
],
"properties": {
"backend": {
"type": "object",
"required": [
"extensionAddedToContext",
"extensionInstanceRemovedFromContext",
"extensionInstanceSecretRotated",
"extensionInstanceUpdated"
],
"properties": {
"extensionAddedToContext": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension is added to an Extension context. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/added"
}
}
},
"extensionInstanceUpdated": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension Instance is updated. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/updated"
}
}
},
"extensionInstanceSecretRotated": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension Instance secret is rotated. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/secret-rotated"
}
}
},
"extensionInstanceRemovedFromContext": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension Instance is removed from a context. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/removed"
}
}
}
}
}
}
},
"externalFrontends": {
"type": "array",
"items": {
"type": "object",
"properties": {
"index": {
"type": "object",
"required": [
"url"
],
"properties": {
"name": {
"type": "string",
"description": "The name the frontend will have in the list of Extension Frontends",
"example": "Example"
},
"url": {
"type": "string",
"format": "uri",
"description": "The URL that the user is directed to when they open the Extension in the mStudio. May contain placeholders",
"example": "https://example.org/:extensionInstanceId"
}
}
}
}
}
},
"support": {
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Email address that may be used for support requests"
},
"phone": {
"type": "string",
"format": "phone",
"description": "Phone number that may be used for support requests",
"example": "+49 170 123456"
},
"inherited": {
"type": "boolean",
"description": "Weather the provided support information was inherited from the conrtributor",
"example": false
}
}
},
"tags": {
"type": "array",
"items": {
"type": "string",
"example": "mail"
},
"description": "Tags that describe the Extension"
},
"published": {
"type": "boolean",
"description": "Weather this Extension has been published"
},
"verificationRequested": {
"type": "boolean",
"description": "Weather verification of the Extension has been requested"
},
"verified": {
"type": "boolean",
"description": "Weather the Extension has been verified"
},
"logoRefId": {
"type": "string",
"format": "uuid",
"description": "The fileId of the the Logo",
"example": "9b2af58a-2625-41eb-adc6-bb6f7be9b90a"
},
"functional": {
"type": "boolean",
"description": "weather the extension is functional"
},
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"index",
"assetType"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "The fileId of the asset",
"example": "709049e1-f283-4ef8-a35b-1b2f672852b0"
},
"index": {
"type": "integer",
"description": "The index of the asset. Does not have to be successive. Can be used to order the assets.",
"example": 1
},
"assetType": {
"type": "string",
"enum": [
"image",
"video"
],
"example": "image"
}
}
}
},
"secrets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"secretId": {
"type": "string",
"format": "uuid",
"example": "6b87abc1-f0fd-4518-a21e-7c8bca3c7c25"
},
"usableUntil": {
"type": "string",
"format": "date-time"
}
}
}
},
"frontendFragments": {
"type": "object",
"description": "This is a map of anchros to urls. The key of the map is the anchor of a frontend fragment.",
"additionalProperties": {
"description": "The URL of the frontend fragment and additional properties for display in the mStudio.",
"type": "object",
"properties": {
"additionalProperties": {
"type": "object",
"additionalProperties": {
"type": "string",
"description": "Some Information needed for the mStudio like the icon."
}
},
"url": {
"type": "string",
"format": "uri",
"example": "The URL of the frontend fragment."
}
}
}
},
"extensionStatistics": {
"type": "object",
"properties": {
"amountOfInstances": {
"type": "integer",
"example": "42",
"description": "The amount of instances for this extension. Accurate for the Contributor. Publicly rounded to the next lower hundred."
}
}
},
"pricing": {
"type": "array",
"items": {
"type": "object",
"required": [
"priceInCents",
"variantKey"
],
"properties": {
"priceInCents": {
"type": "integer",
"example": "5000",
"description": "Price of the extension in Cents."
},
"variantKey": {
"type": "string",
"description": "Identifier of the pricing variant."
},
"name": {
"type": "string",
"description": "Name of the pricing variant."
},
"description": {
"type": "string",
"description": "description of the provided services"
},
"isBookingStopped": {
"type": "boolean",
"description": "Weather the Variant can be installed",
"example": false
}
}
}
},
"requestedChanges": {
"type": "object",
"properties": {
"context": {
"type": "string",
"enum": [
"project",
"customer"
]
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"webhookUrls": {
"type": "object",
"required": [
"backend"
],
"properties": {
"backend": {
"type": "object",
"required": [
"extensionAddedToContext",
"extensionInstanceRemovedFromContext",
"extensionInstanceSecretRotated",
"extensionInstanceUpdated"
],
"properties": {
"extensionAddedToContext": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension is added to an Extension context. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/added"
}
}
},
"extensionInstanceUpdated": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension Instance is updated. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/updated"
}
}
},
"extensionInstanceSecretRotated": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension Instance secret is rotated. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/secret-rotated"
}
}
},
"extensionInstanceRemovedFromContext": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"minLength": 1,
"description": "The URL that the mStudio calls when the Extension Instance is removed from a context. May contain placeholders",
"example": "https://example.org/api/v1/extensions/:contextId/:extensionInstanceId/removed"
}
}
}
}
}
}
}
},
"description": "Requested Changes which have to be revied by a Mittwald Employee."
}
}
}