From cc732a3b12a174e225a3ec7527f3fe13b12fefb6 Mon Sep 17 00:00:00 2001 From: shopwareBot Date: Tue, 31 Mar 2026 10:35:19 +0000 Subject: [PATCH] [create-pull-request] automated change --- adminapi.json | 4526 +++++++++++++++++++++++++------------------------ 1 file changed, 2268 insertions(+), 2258 deletions(-) diff --git a/adminapi.json b/adminapi.json index 1ed4538..fb933f0 100644 --- a/adminapi.json +++ b/adminapi.json @@ -74132,6 +74132,246 @@ } } }, + "/_action/number-range/reserve/{type}/{saleschannel}": { + "get": { + "tags": [ + "Document Management" + ], + "summary": "Reserve or preview a number-range / document number.", + "description": "This endpoint provides functionality to reserve or preview a document number which can be used to create a new document using the `/_action/order/{orderId}/document/{documentTypeName}` endpoint.\n\nThe number generated by the endpoint will be reserved and the number pointer will be incremented with every call. For preview purposes, you can add the `?preview=1` parameter to the request. In that case, the number will not be incremented.", + "operationId": "numberRangeReserve", + "parameters": [ + { + "name": "type", + "in": "path", + "description": "`technicalName` of the document type (e.g. `document_invoice`). Available types can be fetched with the `/api/document-type endpoint`.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "saleschannel", + "in": "path", + "description": "Sales channel for the number range. Number ranges can be defined per sales channel, so you can pass a sales channel ID here.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "preview", + "in": "query", + "description": "If this parameter has a true value, the number will not actually be incremented, but only previewed.", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "The generated number", + "content": { + "application/json": { + "schema": { + "properties": { + "number": { + "description": "The generated (or previewed) document number.", + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "400": { + "description": "Number range not found" + } + } + } + }, + "/_action/system-config": { + "get": { + "tags": [ + "System Config" + ], + "summary": "Get configuration values", + "description": "Returns the configuration values for the given domain and optional sales channel.", + "operationId": "getConfigurationValues", + "parameters": [ + { + "name": "domain", + "in": "query", + "description": "The configuration domain.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "salesChannelId", + "in": "query", + "description": "The sales channel ID to scope the configuration to.", + "schema": { + "type": "string" + } + }, + { + "name": "inherit", + "in": "query", + "description": "Whether to include inherited (global) values.", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "responses": { + "200": { + "description": "Returns the configuration values as a key-value object." + } + } + }, + "post": { + "tags": [ + "System Config" + ], + "summary": "Save configuration values", + "description": "Saves the given configuration key-value pairs for the given sales channel.", + "operationId": "saveConfiguration", + "parameters": [ + { + "name": "salesChannelId", + "in": "query", + "description": "The sales channel ID to scope the configuration to.", + "schema": { + "type": "string" + } + }, + { + "name": "silent", + "in": "query", + "description": "If true, the HTTP cache will not be invalidated. Use this for internal configuration values that do not affect the storefront.", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "description": "Key-value pairs of configuration values to save.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + }, + "responses": { + "204": { + "description": "Configuration saved successfully." + } + } + } + }, + "/_action/system-config/check": { + "get": { + "tags": [ + "System Config" + ], + "summary": "Check configuration", + "description": "Checks if a configuration domain exists.", + "operationId": "checkConfiguration", + "parameters": [ + { + "name": "domain", + "in": "query", + "description": "The configuration domain to check.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Returns whether the configuration domain exists." + } + } + } + }, + "/_action/system-config/schema": { + "get": { + "tags": [ + "System Config" + ], + "summary": "Get configuration schema", + "description": "Returns the configuration schema for the given domain.", + "operationId": "getConfiguration", + "parameters": [ + { + "name": "domain", + "in": "query", + "description": "The configuration domain.", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Returns the configuration schema." + } + } + } + }, + "/_action/system-config/batch": { + "post": { + "tags": [ + "System Config" + ], + "summary": "Batch save configuration values", + "description": "Saves configuration values for multiple sales channels at once. The request body is keyed by sales channel ID (use \"null\" for global scope).", + "operationId": "batchSaveConfiguration", + "parameters": [ + { + "name": "silent", + "in": "query", + "description": "If true, the HTTP cache will not be invalidated. Use this for internal configuration values that do not affect the storefront.", + "schema": { + "type": "boolean", + "default": false + } + } + ], + "requestBody": { + "description": "Object keyed by sales channel ID, each containing key-value pairs of configuration values.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, + "responses": { + "204": { + "description": "Configuration saved successfully." + } + } + } + }, "/_action/index": { "post": { "tags": [ @@ -74165,19 +74405,19 @@ } } }, - "/_action/order_delivery/{orderDeliveryId}/state/{transition}": { + "/_action/order_transaction/{orderTransactionId}/state/{transition}": { "post": { "tags": [ "Order Management" ], - "summary": "Transition an order delivery to a new state", - "description": "Changes the order delivery state and informs the customer via email if configured.", - "operationId": "orderDeliveryStateTransition", + "summary": "Transition an order transaction to a new state", + "description": "Changes the order transaction state and informs the customer via email if configured.", + "operationId": "orderTransactionStateTransition", "parameters": [ { - "name": "orderDeliveryId", + "name": "orderTransactionId", "in": "path", - "description": "Identifier of the order delivery.", + "description": "Identifier of the order transaction.", "required": true, "schema": { "type": "string", @@ -74187,7 +74427,7 @@ { "name": "transition", "in": "path", - "description": "The `action_name` of the `state_machine_transition`. For example `process` if the order state should change from open to in progress.\n\nNote: If you choose a transition which is not possible, you will get an error that lists possible transition for the actual state.", + "description": "The `action_name` of the `state_machine_transition`. For example `process` if the order state should change from open to in progress.\n\nNote: If you choose a transition that is not available, you will get an error that lists possible transitions for the current state.", "required": true, "schema": { "type": "string" @@ -74201,7 +74441,7 @@ "schema": { "properties": { "sendMail": { - "description": "Controls if a mail should be send to the customer." + "description": "Controls if a mail should be sent to the customer." }, "documentIds": { "description": "A list of document identifiers that should be attached", @@ -74220,7 +74460,7 @@ } }, "stateFieldName": { - "description": "This is the state column within the order delivery database table. There should be no need to change it from the default.", + "description": "This is the state column within the order transaction database table. There should be no need to change it from the default.", "type": "string", "default": "stateId" }, @@ -74236,474 +74476,209 @@ }, "responses": { "200": { - "description": "Todo: Use ref of `state_machine_transition` here" + "description": "Returns information about the transition that was made. `#/components/schemas/StateMachineTransition`" } } } }, - "/oauth/token": { - "post": { + "/_action/cache": { + "delete": { "tags": [ - "Authorization & Authentication" + "System Operations" ], - "summary": "Fetch an access token", - "description": "Fetch a access token that can be used to perform authenticated requests. For more information take a look at the [Authentication documentation](https://shopware.stoplight.io/docs/admin-api/docs/concepts/authentication-authorisation.md).", - "operationId": "token", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "oneOf": [ - { - "$ref": "#/components/schemas/OAuthPasswordGrant" - }, - { - "$ref": "#/components/schemas/OAuthRefreshTokenGrant" - }, - { - "$ref": "#/components/schemas/OAuthClientCredentialsGrant" - } - ] - } + "summary": "Clear caches", + "description": "The cache is immediately cleared synchronously for all used adapters.", + "operationId": "clearCache", + "responses": { + "204": { + "description": "Returns a no content response indicating that the cache has been cleared." + } + } + } + }, + "/_action/cache-delayed": { + "delete": { + "tags": [ + "System Operations" + ], + "summary": "Clear all invalidated caches", + "description": "Directly triggers invalidation of all cache tags that were marked for invalidation.", + "operationId": "clearCacheDelayed", + "parameters": [ + { + "name": "refreshOpenSearch", + "in": "query", + "required": false, + "description": "This parameter indicates that in addition to invalidating the delayed caches, the opensearch indices will also be refreshed, which should lead to a clean state on the next read requests. When OpenSearch is not used this parameter will be ignored.", + "schema": { + "type": "boolean", + "default": false } } - }, + ], + "responses": { + "204": { + "description": "Returns a no content response indicating that the cache has been cleared." + } + } + } + }, + "/_info/flow-actions.json": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Get actions for flow builder", + "description": "Get a list of action for flow builder.", + "operationId": "flow-actions", "responses": { "200": { - "description": "Authorized successfully.", + "description": "Returns a list of action for flow builder.", "content": { "application/json": { "schema": { - "required": [ - "token_type", - "expires_in", - "access_token" - ], - "properties": { - "token_type": { - "description": "Type of the token.", - "type": "string" - }, - "expires_in": { - "description": "Token lifetime in seconds.", - "type": "integer" - }, - "access_token": { - "description": "The access token that can be used for subsequent requests", - "type": "string" - }, - "refresh_token": { - "description": "The refresh token that can be used to refresh the access token. This field is not returned on grant type `refresh_token`.", - "type": "string" - } - }, - "type": "object" + "$ref": "#/components/schemas/flowBuilderActionsResponse" } } } - }, - "400": { - "$ref": "#/components/responses/400" } } } }, - "/oauth/sso/config": { + "/_action/index-products": { + "post": { + "tags": [ + "System Operations" + ], + "summary": "Send product indexing message", + "description": "Dispatches a product indexing message to the message bus, with the provided ids", + "operationId": "productIndexing", + "responses": { + "204": { + "description": "Returns an empty response indicating that the message dispatched." + } + } + } + }, + "/_info/queue.json": { "get": { "tags": [ - "Experimental", - "SSO Login configuration" + "System Info & Health Check" ], - "summary": "Experimental: Loads SSO login configuration.", - "description": "Experimental: Loads the SSO login configuration to configure the forward to the Shopware SSO login page.", + "summary": "Get message queue statistics (deprecated)", + "description": "Returns increment-based message queue statistics.\n\n**Deprecated:** This endpoint is deprecated and will be removed in v6.8.0. Use `GET /_info/message-stats.json` instead for accurate message processing statistics.", + "operationId": "queue", + "deprecated": true, "responses": { "200": { - "description": "Experimental: Returns the configuration for the SSO login page forward.", + "description": "Message queue statistics returned.", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "useDefault": { - "description": "Experimental: Indicates which login is used. Default or SSO.", - "type": "boolean" + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Fully qualified class name of the message." + }, + "size": { + "type": "integer", + "description": "Number of pending messages of this type." + } }, - "url": { - "description": "Experimental: Contains the return url for the Shopware SSO login.", - "type": "string" - } + "required": [ + "name", + "size" + ] } - } + }, + "example": [ + { + "name": "Shopware\\Core\\Content\\Product\\DataAbstractionLayer\\ProductIndexingMessage", + "size": 150 + }, + { + "name": "Shopware\\Core\\Content\\Media\\Message\\GenerateThumbnailsMessage", + "size": 25 + } + ] } } } - }, - "operationId": "loadSsoLoginConfig" + } } }, - "/oauth/sso/code": { + "/_info/version": { "get": { "tags": [ - "Experimental", - "SSO Login callback" + "System Info & Health Check" ], - "summary": "Experimental: Callback for SSO login", - "description": "Experimental: Logs in the user into the Shopware shop and forwards to the admin", + "summary": "Get the Shopware version", + "description": "Get the version of the Shopware instance", + "operationId": "infoShopwareVersion", "responses": { "200": { - "description": "Authorisation process continues", + "description": "Returns the version of the Shopware instance.", "content": { "application/json": { "schema": { + "properties": { + "version": { + "description": "The Shopware version.", + "type": "string" + } + }, "type": "object" } } } - }, - "302": { - "description": "Experimental: Forwards to the Shopware admin" - } - }, - "operationId": "callBackWithCode" - } - }, - "/oauth/sso/auth": { - "get": { - "tags": [ - "Experimental", - "SSO Login forward" - ], - "summary": "Experimental: Redirect to SSO login", - "description": "Experimental: Creates a redirection to the SSO login page", - "operationId": "ssoAuth", - "responses": { - "302": { - "description": "Experimental: Forwards to SSO login Page" } } } }, - "/_info/is-sso": { - "get": { + "/_action/order/document/download": { + "post": { "tags": [ - "Experimental", - "Is SSO environment" + "Document Management" ], - "summary": "Experimental: Is SSO environment", - "description": "Experimental: Returns a boolean which indicates the it is a SSO environment or not", - "operationId": "isSso", + "summary": "Download a documents", + "description": "Download a multiple documents in one pdf file.", + "operationId": "downloadDocuments", + "requestBody": { + "description": "documentIds", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + } + } + } + }, "responses": { "200": { - "description": "Experimental: Returns if it is a SSO environment or not" + "description": "The documents.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } } } } }, - "/_action/sso/invite-user": { + "/_action/order/document/{documentTypeName}/create": { "post": { "tags": [ - "Experimental", - "Invite a new SSO user" - ], - "summary": "Experimental: Invite a new SSO user", - "description": "Experimental: Invite a new SSO user and sends a e-mail with the invite", - "operationId": "inviteUser", - "responses": { - "200": { - "description": "Experimental: Invite a new SSO user and sends a e-mail with the invite" - } - } - } - }, - "/_info/message-stats.json": { - "get": { - "summary": "Get statistics message queue", - "description": "Get statistics for recently processed messages in the message queue", - "operationId": "getMessageStats", - "tags": [ - "System Info & Health Check" - ], - "responses": { - "200": { - "description": "Statistics received", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "enabled" - ], - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether message queue statistics are enabled in configuration" - }, - "stats": { - "type": [ - "object", - "null" - ], - "properties": { - "totalMessagesProcessed": { - "type": "integer" - }, - "processedSince": { - "type": "string", - "format": "date-time" - }, - "averageTimeInQueue": { - "type": "number", - "format": "float" - }, - "messageTypeStats": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "count": { - "type": "integer" - } - } - } - } - } - } - } - } - } - } - } - } - } - }, - "/consents": { - "get": { - "tags": [ - "Consent Management", - "Experimental" - ], - "summary": "List all consents for current user", - "description": "Returns a list of all available consents with their current status for the authenticated admin user. Each consent includes its name, identifier, and current state (requested, accepted, or revoked). Experimental API, not part of our backwards compatibility promise, thus this API can introduce breaking changes at any time.", - "operationId": "fetchConsents", - "responses": { - "200": { - "description": "List of consents with their status", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/ConsentState" - }, - "example": { - "product_analytics": { - "name": "product_analytics", - "scopeName": "admin_user", - "identifier": "userId-12345", - "status": "accepted", - "actor": "userId-12345", - "updatedAt": "2024-01-15T10:20:30Z" - }, - "backend_data": { - "name": "backend_data", - "scopeName": "system", - "identifier": "system", - "status": "requested", - "actor": null, - "updatedAt": null - } - } - } - } - } - }, - "401": { - "description": "Unauthorized - User not logged in or invalid session" - } - } - } - }, - "/consents/accept": { - "post": { - "tags": [ - "Consent Management", - "Experimental" - ], - "summary": "Accept a consent", - "description": "Marks the specified consent as accepted for the authenticated admin user. Experimental API, not part of our backwards compatibility promise, thus this API can introduce breaking changes at any time.", - "operationId": "acceptConsent", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "consent": { - "type": "string", - "description": "The name of the consent to accept" - } - }, - "required": [ - "consent" - ], - "example": { - "consent": "product_analytics" - } - } - } - } - }, - "responses": { - "200": { - "description": "Consent status changed successfully. Returns the updated consent status.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConsentState" - } - } - } - }, - "404": { - "description": "Bad request - Consent not found or consent property was empty" - }, - "401": { - "description": "Unauthorized - User not logged in or invalid session" - } - } - } - }, - "/consents/revoke": { - "post": { - "tags": [ - "Consent Management", - "Experimental" - ], - "summary": "Revoke a consent", - "description": "Marks the specified consent as revoked for the authenticated admin user. Experimental API, not part of our backwards compatibility promise, thus this API can introduce breaking changes at any time.", - "operationId": "revokeConsent", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "consent": { - "type": "string", - "description": "The name of the consent to accept" - } - }, - "required": [ - "consent" - ], - "example": { - "consent": "product_analytics" - } - } - } - } - }, - "responses": { - "200": { - "description": "Consent status changed successfully. Returns the updated consent status.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConsentState" - } - } - } - }, - "404": { - "description": "Bad request - Consent not found or consent property was empty" - }, - "401": { - "description": "Unauthorized - User not logged in or invalid session" - } - } - } - }, - "/_action/cache_info": { - "get": { - "tags": [ - "System Operations" - ], - "summary": "Get cache information", - "description": "Get information about the cache configuration", - "operationId": "info", - "responses": { - "200": { - "description": "Information about the cache state.", - "content": { - "application/json": { - "schema": { - "properties": { - "environment": { - "description": "The active environment.", - "type": "string" - }, - "httpCache": { - "description": "State of the HTTP cache.", - "type": "boolean" - }, - "cacheAdapter": { - "description": "The active cache adapter.", - "type": "string" - } - }, - "type": "object" - } - } - } - } - } - } - }, - "/_action/order/document/download": { - "post": { - "tags": [ - "Document Management" - ], - "summary": "Download a documents", - "description": "Download a multiple documents in one pdf file.", - "operationId": "downloadDocuments", - "requestBody": { - "description": "documentIds", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - } - } - } - }, - "responses": { - "200": { - "description": "The documents.", - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - } - } - } - } - } - }, - "/_action/order/document/{documentTypeName}/create": { - "post": { - "tags": [ - "Document Management" + "Document Management" ], "summary": "Create documents for orders", "description": "Creates documents for orders. Documents can for example be an invoice or a delivery note.", @@ -74851,294 +74826,153 @@ } } }, - "/_info/routes": { - "get": { - "summary": "Get API routes", - "operationId": "getRoutes", - "tags": [ - "System Info & Health Check" - ], - "responses": { - "200": { - "description": "Successful operation", - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "endpoints" - ], - "properties": { - "endpoints": { - "type": "array", - "items": { - "type": "object", - "required": [ - "methods", - "path" - ], - "properties": { - "methods": { - "type": "array", - "items": { - "type": "string" - } - }, - "path": { - "type": "string" - } - } - } - } - } - } - } - } - } - } - } - }, - "/_info/health-check": { - "get": { + "/_action/container_cache": { + "delete": { "tags": [ - "System Info & Health Check" + "System Operations" ], - "summary": "Check that the Application is running", - "operationId": "healthCheck", + "summary": "Clear container caches", + "description": "The container cache is immediately cleared synchronously.", + "operationId": "clearContainerCache", "responses": { - "200": { - "description": "Returns empty response" - }, - "500": { - "description": "Application is not working properly" + "204": { + "description": "Returns a no content response indicating that the container cache is cleared." } } } }, - "/_info/system-health-check": { + "/_action/document/{documentId}/{deepLinkCode}": { "get": { "tags": [ - "System Info & Health Check" + "Document Management" ], - "summary": "Perform a detailed system health check", - "operationId": "systemHealthCheck", + "summary": "Download a document", + "description": "Download a document by its identifier and deep link code.", + "operationId": "downloadDocument", "parameters": [ { - "name": "verbose", + "name": "documentId", + "in": "path", + "description": "Identifier of the document to be downloaded.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + { + "name": "deepLinkCode", + "in": "path", + "description": "A unique hash code which was generated when the document was created.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "download", "in": "query", - "required": false, + "description": "This parameter controls the `Content-Disposition` header. If set to `true` the header will be set to `attachment` else `inline`.", "schema": { "type": "boolean", "default": false - }, - "description": "Include detailed information in the response" + } } ], "responses": { "200": { - "description": "Returns the system health check results", + "description": "The document.", "content": { - "application/json": { + "application/octet-stream": { "schema": { - "type": "object", - "properties": { - "checks": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "healthy": { - "type": "boolean" - }, - "status": { - "type": "string" - }, - "message": { - "type": "string" - }, - "extra": { - "type": "array", - "items": { - "type": "object", - "additionalProperties": true - } - } - } - } - } - } + "type": "string", + "format": "binary" } } } - }, - "500": { - "description": "Application is not working properly" } } } }, - "/_action/mail-template/send": { + "/_action/document/{documentId}/upload": { "post": { "tags": [ - "Mail Operations" + "Document Management" + ], + "summary": "Upload a file for a document", + "description": "Uploads a file for a document. This prevents the document from being dynamically generated and delivers the uploaded file instead, when the document is downloaded.\n\nNote:\n* The document is required to be `static`\n* A document can only have one media file\n\nThe are two methods of providing a file to this route:\n * Use a typical file upload and provide the file in the request\n * Fetch the file from an url. This only works if the `shopware.media.enable_url_upload_feature` variable is set to true in the shop environment.\nTo use file upload via url, the content type has to be `application/json` and the parameter `url` has to be provided.", + "operationId": "uploadToDocument", + "parameters": [ + { + "name": "documentId", + "in": "path", + "description": "Identifier of the document the new file should be added to.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + { + "name": "fileName", + "in": "query", + "description": "Name of the uploaded file.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "extension", + "in": "query", + "description": "Extension of the uploaded file. For example `pdf`", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Send a mail", - "description": "Generates a mail from a mail template and sends it to the customer.\n\nTake a look at the `salesChannel` entity for possible values. For example `{{ salesChannel.name }}` can be used.", - "operationId": "send", "requestBody": { - "required": true, "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + }, "application/json": { "schema": { "required": [ - "recipients", - "salesChannelId", - "contentHtml", - "contentPlain", - "subject", - "senderName" + "url" ], "properties": { - "recipients": { - "description": "A list of recipients with name and mail address.", - "type": "object", - "example": { - "test1@example.com": "Test user 1", - "test2@example.com": "Test user 2" + "url": { + "description": "The url of the document that will be downloaded.", + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "responses": { + "200": { + "description": "Document uploaded successful", + "content": { + "application/json": { + "schema": { + "properties": { + "documentId": { + "description": "Identifier of the document.", + "type": "string", + "pattern": "^[0-9a-f]{32}$" }, - "additionalProperties": { - "description": "Name of the recipient.", + "documentDeepLink": { + "description": "A unique hash code which is required to open the document.", "type": "string" } }, - "salesChannelId": { - "description": "Identifier of the sales channel from which the mail should be send.", - "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "contentHtml": { - "description": "The content of the mail in HTML format.", - "type": "string" - }, - "contentPlain": { - "description": "The content of the mail as plain text.", - "type": "string" - }, - "subject": { - "description": "Subject of the mail.", - "type": "string" - }, - "senderName": { - "description": "Name of the sender.", - "type": "string" - }, - "senderEmail": { - "description": "Mail address of the sender. If not set, `core.basicInformation.email` or `core.mailerSettings.senderAddress` will be used from the shop configuration.", - "type": "string" - }, - "mediaIds": { - "description": "List of media identifiers which should be attached to the mail.", - "type": "array", - "items": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - }, - "binAttachments": { - "description": "A list of binary attachments which should be added to the mail.", - "required": [ - "content", - "fileName", - "mimeType" - ], - "type": "array", - "items": { - "properties": { - "content": { - "description": "Binary content of the attachment.", - "type": "string" - }, - "fileName": { - "description": "File name of the attachment.", - "type": "string" - }, - "mimeType": { - "description": "Mime type of the attachment.", - "type": "string" - } - }, - "type": "object" - } - }, - "recipientsBcc": { - "description": "A list of recipients with name and mail address to be set in BCC.", - "type": "object", - "example": { - "test1@example.com": "Test user 1", - "test2@example.com": "Test user 2" - }, - "additionalProperties": { - "description": "Name of the recipient.", - "type": "string" - } - }, - "recipientsCc": { - "description": "A list of recipients with name and mail address to be set in CC.", - "type": "object", - "example": { - "test1@example.com": "Test user 1", - "test2@example.com": "Test user 2" - }, - "additionalProperties": { - "description": "Name of the recipient.", - "type": "string" - } - }, - "replyTo": { - "description": "A list of mail addresses with name and mail address to be set in reply to.", - "type": "object", - "example": { - "test1@example.com": "Test user 1", - "test2@example.com": "Test user 2" - }, - "additionalProperties": { - "description": "Name of the recipient.", - "type": "string" - } - }, - "returnPath": { - "description": "A list of mail addresses with name and mail address to be set in return path.", - "type": "object", - "example": { - "test1@example.com": "Test user 1", - "test2@example.com": "Test user 2" - }, - "additionalProperties": { - "description": "Name of the recipient.", - "type": "string" - } - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "The mail was sent successful", - "content": { - "application/json": { - "schema": { - "properties": { - "size": { - "description": "Length of the email message", - "type": "integer" - } - }, "type": "object" } } @@ -75147,91 +74981,49 @@ } } }, - "/_action/mail-template/validate": { + "/_action/indexing": { "post": { "tags": [ - "Mail Operations" + "System Operations" ], - "summary": "Validate a mail content", - "description": "Validates if content for a mail can be rendered without sending an email.", - "operationId": "validate", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "required": [ - "contentHtml", - "contentPlain" - ], - "properties": { - "contentHtml": { - "description": "The content of the mail in HTML format.", - "type": "string" - }, - "contentPlain": { - "description": "The content of the mail as plain text.", - "type": "string" - } - }, - "type": "object" - } - } - } - }, + "summary": "Run indexer", + "description": "Runs all registered indexer in the shop asynchronously.", + "operationId": "indexing", "responses": { - "204": { - "description": "Returns a no content response indicating the mail content was rendered successfully." + "200": { + "description": "Returns an empty response indicating that the indexing process started." } } } }, - "/_action/mail-template/build": { + "/_action/indexing/{indexer}": { "post": { "tags": [ - "Mail Operations" + "System Operations" + ], + "summary": "Iterate an indexer", + "description": "Starts a defined indexer with an offset.\n\nfor the next request. `finish: true` in the response indicates that the indexer is finished", + "operationId": "iterate", + "parameters": [ + { + "name": "indexer", + "in": "path", + "description": "Name of the indexer to iterate.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + } ], - "summary": "Preview a mail template", - "description": "Generates a preview of a mail template.", - "operationId": "build", "requestBody": { - "required": true, "content": { "application/json": { "schema": { - "required": [ - "mailTemplateType", - "mailTemplate" - ], "properties": { - "mailTemplateType": { - "description": "Only the property `templateData` is used. It provides additional variables to the templating engine.", - "properties": { - "templateData": { - "description": "An associative array that is handed over to the templating engine and can be used as variables in the mail content.", - "type": "object", - "example": { - "order": { - "orderNumber": 5000, - "customerName": "Example Customer" - }, - "messageOfTheDay": "An apple a day keeps the doctor away!" - }, - "additionalProperties": true - } - }, - "type": "object" - }, - "mailTemplate": { - "description": "The content of the mail as plain text.", - "properties": { - "contentHtml": { - "description": "The content of mail mail template in html format.", - "type": "string", - "example": "Hello {{ order.customerName }}, this is example mail content, the current date is {{ 'now'|date('d/m/Y') }}" - } - }, - "type": "object" + "offset": { + "description": "The offset for the iteration.", + "type": "integer" } }, "type": "object" @@ -75241,11 +75033,21 @@ }, "responses": { "200": { - "description": "The rendered preview of the mail template.", + "description": "Returns information about the iteration.", "content": { "application/json": { "schema": { - "type": "string" + "properties": { + "finish": { + "description": "Indicates if the indexing process finished.", + "type": "boolean" + }, + "offset": { + "description": "Offset to be used for the next iteration.", + "type": "integer" + } + }, + "type": "object" } } } @@ -75286,50 +75088,35 @@ } } }, - "/_info/openapi3.json": { - "get": { - "tags": [ - "System Info & Health Check" - ], - "summary": "Get OpenAPI Specification", - "description": "Get information about the admin API in OpenAPI format.", - "operationId": "api-info", - "parameters": [ - { - "name": "type", - "in": "query", - "description": "Type of the api", - "schema": { - "type": "string", - "enum": [ - "jsonapi", - "json" - ] - } - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/OpenApi3" - } - } - } - }, - "/_info/events.json": { + "/_action/cache_info": { "get": { "tags": [ - "System Info & Health Check" + "System Operations" ], - "summary": "Get Business events", - "description": "Get a list of about the business events.", - "operationId": "business-events", + "summary": "Get cache information", + "description": "Get information about the cache configuration", + "operationId": "info", "responses": { "200": { - "description": "Returns a list of about the business events.", + "description": "Information about the cache state.", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/businessEventsResponse" + "properties": { + "environment": { + "description": "The active environment.", + "type": "string" + }, + "httpCache": { + "description": "State of the HTTP cache.", + "type": "boolean" + }, + "cacheAdapter": { + "description": "The active cache adapter.", + "type": "string" + } + }, + "type": "object" } } } @@ -75337,21 +75124,6 @@ } } }, - "/_action/index-products": { - "post": { - "tags": [ - "System Operations" - ], - "summary": "Send product indexing message", - "description": "Dispatches a product indexing message to the message bus, with the provided ids", - "operationId": "productIndexing", - "responses": { - "204": { - "description": "Returns an empty response indicating that the message dispatched." - } - } - } - }, "/_action/user/logout": { "post": { "tags": [ @@ -75373,40 +75145,25 @@ } } }, - "/_action/container_cache": { - "delete": { - "tags": [ - "System Operations" - ], - "summary": "Clear container caches", - "description": "The container cache is immediately cleared synchronously.", - "operationId": "clearContainerCache", - "responses": { - "204": { - "description": "Returns a no content response indicating that the container cache is cleared." - } - } - } - }, - "/_action/message-queue/consume": { + "/_action/validation/email": { "post": { "tags": [ - "System Operations" + "Email support validation" ], - "summary": "Consume messages from the message queue.", - "description": "This route can be used to consume messages from the message queue. It is intended to be used if\nno cronjob is configured to consume messages regularly.", - "operationId": "consumeMessages", + "summary": "Email support.", + "description": "Checks a given email string.", + "operationId": "supportsEmail", "requestBody": { "required": true, "content": { "application/json": { "schema": { "required": [ - "receiver" + "email" ], "properties": { - "receiver": { - "description": "The name of the transport in the messenger that should be processed.\nSee the [Symfony Messenger documentation](https://symfony.com/doc/current/messenger.html) for more information", + "email": { + "description": "The email to be verified.", "type": "string" } }, @@ -75416,140 +75173,207 @@ } }, "responses": { - "200": { - "description": "Returns information about handled messages", + "204": { + "description": "Email is supported" + }, + "400": { + "description": "Invalid request payload. The argument 'email' may be missing.", "content": { "application/json": { "schema": { "properties": { - "handledMessages": { - "description": "The number of messages processed.", - "type": "integer" + "errors": { + "description": "Contains the error message.", + "type": "array" } }, "type": "object" + }, + "example": { + "errors": [ + { + "code": "0", + "status": "400", + "title": "Unprocessable Content", + "detail": "This value should not be blank." + } + ] } } } - } - } - } - }, - "/_action/sync": { - "post": { - "tags": [ - "Bulk Operations" - ], - "summary": "Bulk edit entities", - "description": "Starts a sync process for the list of provided actions. This can be upserts and deletes on different entities to an asynchronous process in the background. You can control the behaviour with the `indexing-behavior` header.", - "operationId": "sync", - "parameters": [ - { - "name": "fail-on-error", - "in": "header", - "description": "To continue upcoming actions on errors, set the `fail-on-error` header to `false`.", - "schema": { - "type": "boolean", - "default": true - } }, - { - "name": "indexing-behavior", - "in": "header", - "description": "Controls the indexing behavior.\n - `disable-indexing`: Data indexing is completely disabled", - "schema": { - "type": "string", - "enum": [ - "use-queue-indexing", - "disable-indexing" - ] - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "required": [ - "action", - "entity", - "payload" - ], + "422": { + "description": "Email address is not supported.", + "content": { + "application/json": { + "schema": { "properties": { - "action": { - "description": "The action indicates what should happen with the provided payload.\n * `upsert`: The Sync API does not differ between create and update operations,\n but always performs an upsert operation. During an upsert, the system checks whether the entity already exists in the\n system and updates it if an identifier has been passed, otherwise a new entity is created with this identifier.\n * `delete`: Deletes entities with the provided identifiers", - "type": "string", - "enum": [ - "upsert", - "delete" - ] - }, - "entity": { - "description": "The entity that should be processed with the payload.", - "type": "string", - "example": "product" - }, - "payload": { - "description": "Contains a list of changesets for an entity. If the action type is `delete`,\n a list of identifiers can be provided.", - "type": "array", - "items": { - "type": "object" - } - }, - "criteria": { - "description": "Only for delete operations: Instead of providing IDs in the payload, the filter by which should be deleted can be provided directly.", - "type": "array", - "items": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleFilter" - }, - { - "$ref": "#/components/schemas/EqualsFilter" - }, - { - "$ref": "#/components/schemas/MultiNotFilter" - }, - { - "$ref": "#/components/schemas/RangeFilter" - } - ] - } + "errors": { + "description": "Contains the validation error.", + "type": "array" } }, "type": "object" + }, + "example": { + "errors": [ + { + "code": "0", + "status": "422", + "title": "Unprocessable Content", + "detail": "This value is not a supported email address." + } + ] } } } } - }, + } + } + }, + "/consents": { + "get": { + "tags": [ + "Consent Management", + "Experimental" + ], + "summary": "List all consents for current user", + "description": "Returns a list of all available consents with their current status for the authenticated admin user. Each consent includes its name, identifier, and current state (requested, accepted, or revoked). Experimental API, not part of our backwards compatibility promise, thus this API can introduce breaking changes at any time.", + "operationId": "fetchConsents", "responses": { "200": { - "description": "Returns a sync result containing information about the updated entities", + "description": "List of consents with their status", "content": { "application/json": { "schema": { - "properties": { - "data": { - "description": "Object with information about updated entities", - "type": "object" - }, - "notFound": { - "description": "Object with information about not found entities", - "type": "object" + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ConsentState" + }, + "example": { + "product_analytics": { + "name": "product_analytics", + "scopeName": "admin_user", + "identifier": "userId-12345", + "status": "accepted", + "actor": "userId-12345", + "updatedAt": "2024-01-15T10:20:30Z" }, - "deleted": { - "description": "Object with information about deleted entities", - "type": "object" + "backend_data": { + "name": "backend_data", + "scopeName": "system", + "identifier": "system", + "status": "requested", + "actor": null, + "updatedAt": null } - }, - "type": "object" + } } } } + }, + "401": { + "description": "Unauthorized - User not logged in or invalid session" + } + } + } + }, + "/consents/accept": { + "post": { + "tags": [ + "Consent Management", + "Experimental" + ], + "summary": "Accept a consent", + "description": "Marks the specified consent as accepted for the authenticated admin user. Experimental API, not part of our backwards compatibility promise, thus this API can introduce breaking changes at any time.", + "operationId": "acceptConsent", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "description": "The name of the consent to accept" + } + }, + "required": [ + "consent" + ], + "example": { + "consent": "product_analytics" + } + } + } + } + }, + "responses": { + "200": { + "description": "Consent status changed successfully. Returns the updated consent status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsentState" + } + } + } + }, + "404": { + "description": "Bad request - Consent not found or consent property was empty" + }, + "401": { + "description": "Unauthorized - User not logged in or invalid session" + } + } + } + }, + "/consents/revoke": { + "post": { + "tags": [ + "Consent Management", + "Experimental" + ], + "summary": "Revoke a consent", + "description": "Marks the specified consent as revoked for the authenticated admin user. Experimental API, not part of our backwards compatibility promise, thus this API can introduce breaking changes at any time.", + "operationId": "revokeConsent", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "description": "The name of the consent to accept" + } + }, + "required": [ + "consent" + ], + "example": { + "consent": "product_analytics" + } + } + } + } + }, + "responses": { + "200": { + "description": "Consent status changed successfully. Returns the updated consent status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsentState" + } + } + } + }, + "404": { + "description": "Bad request - Consent not found or consent property was empty" + }, + "401": { + "description": "Unauthorized - User not logged in or invalid session" } } } @@ -76015,91 +75839,214 @@ } } }, - "/_action/document/{documentId}/{deepLinkCode}": { - "get": { + "/_action/order/{orderId}/order-address": { + "post": { "tags": [ - "Document Management" + "Order address" ], - "summary": "Download a document", - "description": "Download a document by its identifier and deep link code.", - "operationId": "downloadDocument", + "summary": "Update order addresses", + "description": "Endpoint which takes a list of mapping objects as payload and updates the order addresses accordingly", + "operationId": "updateOrderAddresses", "parameters": [ { - "name": "documentId", + "name": "orderId", "in": "path", - "description": "Identifier of the document to be downloaded.", + "description": "Identifier of the order.", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-f]{32}$" } - }, - { - "name": "deepLinkCode", - "in": "path", - "description": "A unique hash code which was generated when the document was created.", - "required": true, - "schema": { - "type": "string" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "mapping": { + "type": "array", + "items": { + "type": "object", + "properties": { + "customerAddressId": { + "type": "string", + "description": "The ID of the customer address" + }, + "type": { + "type": "string", + "description": "The type of the address" + }, + "deliveryId": { + "description": "The ID of the delivery (optional)", + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "customerAddressId", + "type" + ] + }, + "description": "The mapping of order addresses" + } + } + } } }, + "required": true + }, + "responses": { + "204": { + "description": "Returns a no content response indicating that the update has been made." + } + } + } + }, + "/app-system/privileges/requested": { + "get": { + "tags": [ + "App System" + ], + "summary": "Get requested privileges for all apps", + "description": "Returns the list of requested privileges for all apps. Requires admin scope and `acl_role:read` permission to read.", + "operationId": "getRequestedPrivileges", + "security": [ { - "name": "download", - "in": "query", - "description": "This parameter controls the `Content-Disposition` header. If set to `true` the header will be set to `attachment` else `inline`.", - "schema": { - "type": "boolean", - "default": false - } + "oAuth": [ + "admin" + ] } ], "responses": { "200": { - "description": "The document.", + "description": "A JSON object containing requested privileges.", "content": { - "application/octet-stream": { + "application/json": { "schema": { - "type": "string", - "format": "binary" + "type": "object", + "properties": { + "privileges": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "example": { + "privileges": { + "SwagAnalytics": [ + "customer:read", + "order:read" + ], + "SwagExample": [ + "product:write" + ] + } } } } + }, + "400": { + "description": "Malformed request." + }, + "401": { + "description": "Unauthorized Access." + }, + "403": { + "description": "Forbidden. Not a valid integration source." } } } }, - "/_action/document/{documentId}/upload": { - "post": { + "/app-system/{appName}/privileges/accepted": { + "get": { "tags": [ - "Document Management" + "App System" ], - "summary": "Upload a file for a document", - "description": "Uploads a file for a document. This prevents the document from being dynamically generated and delivers the uploaded file instead, when the document is downloaded.\n\nNote:\n* The document is required to be `static`\n* A document can only have one media file\n\nThe are two methods of providing a file to this route:\n * Use a typical file upload and provide the file in the request\n * Fetch the file from an url. This only works if the `shopware.media.enable_url_upload_feature` variable is set to true in the shop environment.\nTo use file upload via url, the content type has to be `application/json` and the parameter `url` has to be provided.", - "operationId": "uploadToDocument", + "summary": "Get accepted privileges for an app", + "description": "Returns the list of accepted privileges for the current integration. Requires admin scope with an integration.", + "operationId": "getAcceptedPrivileges", "parameters": [ { - "name": "documentId", + "name": "appName", "in": "path", - "description": "Identifier of the document the new file should be added to.", "required": true, "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" + "type": "string" } - }, + } + ], + "security": [ { - "name": "fileName", - "in": "query", - "description": "Name of the uploaded file.", - "required": true, - "schema": { - "type": "string" + "oAuth": [ + "admin" + ] + } + ], + "responses": { + "200": { + "description": "A JSON object containing accepted privileges.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "privileges": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + } + }, + "example": { + "privileges": { + "customer:read": true, + "order:read": true + } + } + } } }, + "400": { + "description": "Malformed request." + }, + "401": { + "description": "Unauthorized Access." + }, + "403": { + "description": "Forbidden. Not a valid integration source." + }, + "404": { + "description": "App not found." + } + } + } + }, + "/app-system/{appName}/privileges": { + "patch": { + "tags": [ + "App System" + ], + "summary": "Accept or revoke privileges for an app", + "description": "Accepts or revokes specified privileges for the given app.", + "operationId": "managePrivileges", + "parameters": [ { - "name": "extension", - "in": "query", - "description": "Extension of the uploaded file. For example `pdf`", + "name": "appName", + "in": "path", "required": true, "schema": { "type": "string" @@ -76107,251 +76054,279 @@ } ], "requestBody": { + "required": true, "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - }, "application/json": { "schema": { - "required": [ - "url" - ], + "type": "object", "properties": { - "url": { - "description": "The url of the document that will be downloaded.", - "type": "string" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Document uploaded successful", - "content": { - "application/json": { - "schema": { - "properties": { - "documentId": { - "description": "Identifier of the document.", - "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "documentDeepLink": { - "description": "A unique hash code which is required to open the document.", + "accept": { + "type": "array", + "items": { "type": "string" } }, - "type": "object" + "revoke": { + "type": "array", + "items": { + "type": "string" + } + } } + }, + "example": { + "accept": [ + "customer:read", + "order:read" + ], + "revoke": [ + "product:write" + ] } } } - } + }, + "responses": { + "204": { + "description": "Returns no content if privileges were managed successfully." + }, + "400": { + "description": "Malformed request." + }, + "401": { + "description": "Unauthorized Access." + }, + "403": { + "description": "Forbidden. Not a valid integration source." + }, + "404": { + "description": "App not found." + } + }, + "security": [ + { + "oAuth": [ + "admin" + ] + } + ] } }, - "/_action/cache": { - "delete": { + "/_action/app-system/secret/rotate": { + "post": { "tags": [ - "System Operations" + "App System" ], - "summary": "Clear caches", - "description": "The cache is immediately cleared synchronously for all used adapters.", - "operationId": "clearCache", + "summary": "Initiate secret rotation for the calling app", + "description": "Initiates an app secret rotation for the calling app. Needs to be called with an integration token belonging to an app. Note that the secret rotation will only be scheduled and then handled asynchronously.", + "operationId": "appSecretRotation", "responses": { - "204": { - "description": "Returns a no content response indicating that the cache has been cleared." + "202": { + "description": "Returns \"Accepted\" when secret rotation was scheduled." + }, + "400": { + "description": "Malformed request, e.g. when requested with non app integration source." + }, + "401": { + "description": "Unauthorized Access." + }, + "403": { + "description": "Forbidden. Not a valid integration source." + }, + "404": { + "description": "App not found." } - } + }, + "security": [ + { + "oAuth": [ + "admin" + ] + } + ] } }, - "/_action/cache-delayed": { - "delete": { + "/app-system/shop/verify": { + "get": { "tags": [ - "System Operations" + "App System", + "Public" ], - "summary": "Clear all invalidated caches", - "description": "Directly triggers invalidation of all cache tags that were marked for invalidation.", - "operationId": "clearCacheDelayed", + "summary": "Verify a shop's APP_URL", + "description": "Used to verify that a shop's APP_URL points to its self. The passed run ID and token are used to query the cache. It returns 204 no content if the given token can be verified using the run id.", + "operationId": "verifyAppUrl", "parameters": [ { - "name": "refreshOpenSearch", + "name": "runId", "in": "query", - "required": false, - "description": "This parameter indicates that in addition to invalidating the delayed caches, the opensearch indices will also be refreshed, which should lead to a clean state on the next read requests. When OpenSearch is not used this parameter will be ignored.", + "description": "A unique identifier used to look up the token", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string" + } + }, + { + "name": "token", + "in": "query", + "description": "A unique identifier", + "required": true, + "schema": { + "type": "string" } } ], "responses": { "204": { - "description": "Returns a no content response indicating that the cache has been cleared." + "description": "An empty response signalling successful verification." + }, + "400": { + "description": "Malformed request or unsuccessful verification." } } } }, - "/_action/order_transaction/{orderTransactionId}/state/{transition}": { + "/_action/sync": { "post": { "tags": [ - "Order Management" + "Bulk Operations" ], - "summary": "Transition an order transaction to a new state", - "description": "Changes the order transaction state and informs the customer via email if configured.", - "operationId": "orderTransactionStateTransition", + "summary": "Bulk edit entities", + "description": "Starts a sync process for the list of provided actions. This can be upserts and deletes on different entities to an asynchronous process in the background. You can control the behaviour with the `indexing-behavior` header.", + "operationId": "sync", "parameters": [ { - "name": "orderTransactionId", - "in": "path", - "description": "Identifier of the order transaction.", - "required": true, + "name": "fail-on-error", + "in": "header", + "description": "To continue upcoming actions on errors, set the `fail-on-error` header to `false`.", "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" + "type": "boolean", + "default": true } }, { - "name": "transition", - "in": "path", - "description": "The `action_name` of the `state_machine_transition`. For example `process` if the order state should change from open to in progress.\n\nNote: If you choose a transition that is not available, you will get an error that lists possible transitions for the current state.", - "required": true, + "name": "indexing-behavior", + "in": "header", + "description": "Controls the indexing behavior.\n - `disable-indexing`: Data indexing is completely disabled", "schema": { - "type": "string" + "type": "string", + "enum": [ + "use-queue-indexing", + "disable-indexing" + ] } } ], "requestBody": { - "required": false, + "required": true, "content": { "application/json": { "schema": { - "properties": { - "sendMail": { - "description": "Controls if a mail should be sent to the customer." - }, - "documentIds": { - "description": "A list of document identifiers that should be attached", - "type": "array", - "items": { + "type": "array", + "items": { + "required": [ + "action", + "entity", + "payload" + ], + "properties": { + "action": { + "description": "The action indicates what should happen with the provided payload.\n * `upsert`: The Sync API does not differ between create and update operations,\n but always performs an upsert operation. During an upsert, the system checks whether the entity already exists in the\n system and updates it if an identifier has been passed, otherwise a new entity is created with this identifier.\n * `delete`: Deletes entities with the provided identifiers", "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - }, - "mediaIds": { - "description": "A list of media identifiers that should be attached", - "type": "array", - "items": { + "enum": [ + "upsert", + "delete" + ] + }, + "entity": { + "description": "The entity that should be processed with the payload.", "type": "string", - "pattern": "^[0-9a-f]{32}$" + "example": "product" + }, + "payload": { + "description": "Contains a list of changesets for an entity. If the action type is `delete`,\n a list of identifiers can be provided.", + "type": "array", + "items": { + "type": "object" + } + }, + "criteria": { + "description": "Only for delete operations: Instead of providing IDs in the payload, the filter by which should be deleted can be provided directly.", + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleFilter" + }, + { + "$ref": "#/components/schemas/EqualsFilter" + }, + { + "$ref": "#/components/schemas/MultiNotFilter" + }, + { + "$ref": "#/components/schemas/RangeFilter" + } + ] + } } }, - "stateFieldName": { - "description": "This is the state column within the order transaction database table. There should be no need to change it from the default.", - "type": "string", - "default": "stateId" - }, - "internalComment": { - "description": "An optional internal comment that will be saved with the state transition.", - "type": "string" - } - }, - "type": "object" + "type": "object" + } } } } }, "responses": { "200": { - "description": "Returns information about the transition that was made. `#/components/schemas/StateMachineTransition`" - } - } - } - }, - "/_action/cleanup": { - "delete": { - "tags": [ - "System Operations" - ], - "summary": "Clear old cache folders", - "description": "Removes cache folders that are not needed anymore.", - "operationId": "clearOldCacheFolders", - "responses": { - "204": { - "description": "Returns a no content response indicating that the cleanup finished." - } - } - } - }, - "/_action/indexing": { - "post": { - "tags": [ - "System Operations" - ], - "summary": "Run indexer", - "description": "Runs all registered indexer in the shop asynchronously.", - "operationId": "indexing", - "responses": { - "200": { - "description": "Returns an empty response indicating that the indexing process started." + "description": "Returns a sync result containing information about the updated entities", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "description": "Object with information about updated entities", + "type": "object" + }, + "notFound": { + "description": "Object with information about not found entities", + "type": "object" + }, + "deleted": { + "description": "Object with information about deleted entities", + "type": "object" + } + }, + "type": "object" + } + } + } } } } }, - "/_action/indexing/{indexer}": { - "post": { + "/oauth/sso/config": { + "get": { "tags": [ - "System Operations" - ], - "summary": "Iterate an indexer", - "description": "Starts a defined indexer with an offset.\n\nfor the next request. `finish: true` in the response indicates that the indexer is finished", - "operationId": "iterate", - "parameters": [ - { - "name": "indexer", - "in": "path", - "description": "Name of the indexer to iterate.", - "required": true, - "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - } + "Authorization & Authentication", + "SSO Login configuration" ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "offset": { - "description": "The offset for the iteration.", - "type": "integer" - } - }, - "type": "object" - } - } - } - }, + "summary": "Loads configuration for the admin login", + "description": "Loads the configuration for the admin login. This configuration is used to load and configure the default or Single Sign On (SSO) login for the admin.", + "operationId": "loadSsoLoginConfig", "responses": { "200": { - "description": "Returns information about the iteration.", + "description": "Config loaded successfully.", "content": { "application/json": { "schema": { "properties": { - "finish": { - "description": "Indicates if the indexing process finished.", + "useDefault": { + "description": "Experimental: Indicates which login is used. Default or SSO.", "type": "boolean" }, - "offset": { - "description": "Offset to be used for the next iteration.", - "type": "integer" + "url": { + "description": "Experimental: Contains the return url for the Shopware SSO login.", + "type": "string" } }, "type": "object" @@ -76362,232 +76337,159 @@ } } }, - "/_action/state-machine/{entityName}/{entityId}/state": { + "/oauth/sso/code": { "get": { "tags": [ - "State Machine" - ], - "summary": "Get available transitions for an entity", - "description": "Retrieves the available state transitions for the specified entity.", - "operationId": "getEntityState", - "parameters": [ - { - "name": "entityName", - "in": "path", - "description": "Name of the entity.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "entityId", - "in": "path", - "description": "Identifier of the entity.", - "required": true, - "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - }, - { - "name": "stateFieldName", - "in": "query", - "description": "This is the state column within the order delivery database table. There should be no need to change it from the default.", - "required": false, - "schema": { - "type": "string", - "default": "stateId" - } - } + "Authorization & Authentication", + "SSO Login callback" ], + "summary": "Callback function. Fetch an authorization code", + "description": "Fetch an authorization code log in the user.", + "operationId": "callBackWithCode", "responses": { + "302": { + "description": "Experimental: Forwards to the Shopware admin" + }, "200": { - "description": "Available transitions for the current state.", + "description": "Authorisation process continues", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "transitions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the transition." - }, - "technicalName": { - "type": "string", - "description": "The technical name of the transition." - }, - "actionName": { - "type": "string", - "description": "The action name of the transition." - }, - "fromStateName": { - "type": "string", - "description": "The technical name of the state the transition starts from." - }, - "toStateName": { - "type": "string", - "description": "The technical name of the state the transition goes to." - }, - "url": { - "type": "string", - "description": "The URL to trigger the transition." - } - }, - "required": [ - "name", - "technicalName", - "actionName", - "fromStateName", - "toStateName", - "url" - ] - } - } - }, - "required": [ - "transitions" - ] + "type": "object" } } } - }, - "400": { - "description": "Unable to read the entity or entity field." - }, - "403": { - "description": "Forbidden. Missing privileges to access the entity." } } } }, - "/_action/state-machine/{entityName}/{entityId}/state/{transition}": { - "post": { + "/oauth/sso/auth": { + "get": { "tags": [ - "State Machine" + "Experimental", + "SSO Login forward" ], - "summary": "Transition an entity to a new state", - "description": "Changes the entity state by applying the given transition.", - "operationId": "transitionEntityState", - "parameters": [ - { - "name": "entityName", - "in": "path", - "description": "Name of the entity.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "entityId", - "in": "path", - "description": "Identifier of the entity.", - "required": true, - "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - }, - { - "name": "transition", - "in": "path", - "description": "The `action_name` of the `state_machine_transition`.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "stateFieldName", - "in": "query", - "description": "This is the state column within the order delivery database table. There should be no need to change it from the default.", - "required": false, - "schema": { - "type": "string", - "default": "stateId" - } + "summary": "Experimental: Redirect to SSO login", + "description": "Experimental: Creates a redirection to the SSO login page", + "operationId": "ssoAuth", + "responses": { + "302": { + "description": "Experimental: Forwards to SSO login Page" } + } + } + }, + "/_info/is-sso": { + "get": { + "tags": [ + "Experimental", + "Is SSO environment" ], - "requestBody": { - "description": "Optional internal comment for the state transition.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "internalComment": { - "type": "string", - "description": "An optional internal comment that will be saved with the state transition." - } - } - } - } - } - }, + "summary": "Experimental: Is SSO environment", + "description": "Experimental: Returns a boolean which indicates the it is a SSO environment or not", + "operationId": "isSso", "responses": { "200": { - "description": "State transition applied successfully." - }, - "400": { - "description": "Unable to read the entity or entity field, or invalid transition." - }, - "403": { - "description": "Forbidden. Missing privileges to access the entity." + "description": "Experimental: Returns if it is a SSO environment or not" } } } }, - "/_proxy/generate-imitate-customer-token": { + "/_action/sso/invite-user": { "post": { "tags": [ - "Customer impersonation" + "Experimental", + "Invite a new SSO user" ], - "summary": "Generate a customer impersonation token", - "description": "Generates a customer impersonation token for the given customer and sales channel.\n\nThe token can be used to authenticate as the customer in the sales channel.", - "operationId": "generateImitateCustomerToken", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "required": [ - "customerId", - "salesChannelId" - ], - "properties": { - "customerId": { - "description": "ID of the customer", - "type": "string" - }, - "salesChannelId": { - "description": "ID of the sales channel", - "type": "string" + "summary": "Experimental: Invite a new SSO user", + "description": "Experimental: Invite a new SSO user and sends a e-mail with the invite", + "operationId": "inviteUser", + "responses": { + "200": { + "description": "Experimental: Invite a new SSO user and sends a e-mail with the invite" + } + } + } + }, + "/_info/message-stats.json": { + "get": { + "summary": "Get statistics message queue", + "description": "Get statistics for recently processed messages in the message queue", + "operationId": "getMessageStats", + "tags": [ + "System Info & Health Check" + ], + "responses": { + "200": { + "description": "Statistics received", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether message queue statistics are enabled in configuration" + }, + "stats": { + "type": [ + "object", + "null" + ], + "properties": { + "totalMessagesProcessed": { + "type": "integer" + }, + "processedSince": { + "type": "string", + "format": "date-time" + }, + "averageTimeInQueue": { + "type": "number", + "format": "float" + }, + "messageTypeStats": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "count": { + "type": "integer" + } + } + } + } + } + } } - }, - "type": "object" + } } } } - }, + } + } + }, + "/_info/events.json": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Get Business events", + "description": "Get a list of about the business events.", + "operationId": "business-events", "responses": { "200": { - "description": "The generated customer impersonation token.", + "description": "Returns a list of about the business events.", "content": { "application/json": { "schema": { - "properties": { - "token": { - "description": "The generated customer impersonation token", - "type": "string" - } - }, - "type": "object" + "$ref": "#/components/schemas/businessEventsResponse" } } } @@ -76651,370 +76553,350 @@ } } }, - "/_action/increment/{pool}": { - "post": { + "/_info/routes": { + "get": { + "summary": "Get API routes", + "operationId": "getRoutes", "tags": [ - "Increment Storage" - ], - "summary": "Increment a value in the specified pool", - "description": "Increments a value by key in the specified increment pool. This operation increments the counter for the given key and returns a success response.", - "operationId": "incrementValue", - "parameters": [ - { - "name": "pool", - "in": "path", - "description": "The name of the increment pool (e.g., 'user_activity', 'message_queue').", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "cluster", - "in": "query", - "description": "Optional cluster identifier for the increment operation.", - "required": false, - "schema": { - "type": "string" - } - } + "System Info & Health Check" ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "key" - ], - "properties": { - "key": { - "type": "string", - "description": "The key to increment in the pool." - } - } - } - } - } - }, "responses": { "200": { - "description": "Successfully incremented the value", + "description": "Successful operation", "content": { "application/json": { "schema": { "type": "object", + "required": [ + "endpoints" + ], "properties": { - "success": { - "type": "boolean", - "example": true + "endpoints": { + "type": "array", + "items": { + "type": "object", + "required": [ + "methods", + "path" + ], + "properties": { + "methods": { + "type": "array", + "items": { + "type": "string" + } + }, + "path": { + "type": "string" + } + } + } } } } } } - }, - "400": { - "description": "Bad request - key parameter missing or cluster parameter missing" } } - }, - "get": { + } + }, + "/oauth/token": { + "post": { "tags": [ - "Increment Storage" + "Authorization & Authentication" ], - "summary": "List increment values from pool", - "description": "Retrieves a list of increment values from the specified pool with pagination support.", - "operationId": "getIncrementValues", - "parameters": [ - { - "name": "pool", - "in": "path", - "description": "The name of the increment pool to list values from.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "cluster", - "in": "query", - "description": "Cluster identifier for the increment operation.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "limit", - "in": "query", - "description": "Maximum number of items to return.", - "required": false, - "schema": { - "type": "integer", - "default": 5, - "minimum": 1 - } - }, - { - "name": "offset", - "in": "query", - "description": "Number of items to skip for pagination.", - "required": false, - "schema": { - "type": "integer", - "default": 0, - "minimum": 0 + "summary": "Fetch an access token", + "description": "Fetch a access token that can be used to perform authenticated requests. For more information take a look at the [Authentication documentation](https://shopware.stoplight.io/docs/admin-api/docs/concepts/authentication-authorisation.md).", + "operationId": "token", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/OAuthPasswordGrant" + }, + { + "$ref": "#/components/schemas/OAuthRefreshTokenGrant" + }, + { + "$ref": "#/components/schemas/OAuthClientCredentialsGrant" + } + ] + } } } - ], + }, "responses": { "200": { - "description": "List of increment values", + "description": "Authorized successfully.", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "key": { - "type": "string", - "description": "The increment key" - }, - "count": { - "type": "integer", - "description": "The current count value" - } + "required": [ + "token_type", + "expires_in", + "access_token" + ], + "properties": { + "token_type": { + "description": "Type of the token.", + "type": "string" + }, + "expires_in": { + "description": "Token lifetime in seconds.", + "type": "integer" + }, + "access_token": { + "description": "The access token that can be used for subsequent requests", + "type": "string" + }, + "refresh_token": { + "description": "The refresh token that can be used to refresh the access token. This field is not returned on grant type `refresh_token`.", + "type": "string" } - } + }, + "type": "object" } } } }, "400": { - "description": "Bad request - cluster parameter missing" + "$ref": "#/components/responses/400" } } } }, - "/_action/decrement/{pool}": { + "/_action/order_delivery/{orderDeliveryId}/state/{transition}": { "post": { "tags": [ - "Increment Storage" + "Order Management" ], - "summary": "Decrement a value in the specified pool", - "description": "Decrements a value by key in the specified increment pool. This operation decrements the counter for the given key and returns a success response.", - "operationId": "decrementValue", + "summary": "Transition an order delivery to a new state", + "description": "Changes the order delivery state and informs the customer via email if configured.", + "operationId": "orderDeliveryStateTransition", "parameters": [ { - "name": "pool", + "name": "orderDeliveryId", "in": "path", - "description": "The name of the increment pool.", + "description": "Identifier of the order delivery.", "required": true, "schema": { - "type": "string" + "type": "string", + "pattern": "^[0-9a-f]{32}$" } }, { - "name": "cluster", - "in": "query", - "description": "Optional cluster identifier for the decrement operation.", - "required": false, + "name": "transition", + "in": "path", + "description": "The `action_name` of the `state_machine_transition`. For example `process` if the order state should change from open to in progress.\n\nNote: If you choose a transition which is not possible, you will get an error that lists possible transition for the actual state.", + "required": true, "schema": { "type": "string" } } ], "requestBody": { - "required": true, + "required": false, "content": { "application/json": { "schema": { - "type": "object", - "required": [ - "key" - ], "properties": { - "key": { + "sendMail": { + "description": "Controls if a mail should be send to the customer." + }, + "documentIds": { + "description": "A list of document identifiers that should be attached", + "type": "array", + "items": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + "mediaIds": { + "description": "A list of media identifiers that should be attached", + "type": "array", + "items": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + "stateFieldName": { + "description": "This is the state column within the order delivery database table. There should be no need to change it from the default.", "type": "string", - "description": "The key to decrement in the pool." + "default": "stateId" + }, + "internalComment": { + "description": "An optional internal comment that will be saved with the state transition.", + "type": "string" } - } + }, + "type": "object" } } } }, "responses": { "200": { - "description": "Successfully decremented the value", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "example": true - } - } - } - } - } - }, - "400": { - "description": "Bad request - key parameter missing or cluster parameter missing" + "description": "Todo: Use ref of `state_machine_transition` here" } } } }, - "/_action/reset-increment/{pool}": { + "/_action/message-queue/consume": { "post": { "tags": [ - "Increment Storage" - ], - "summary": "Reset increment values in pool", - "description": "Resets increment values in the specified pool. Can reset all values or a specific key if provided.", - "operationId": "resetIncrementValues", - "parameters": [ - { - "name": "pool", - "in": "path", - "description": "The name of the increment pool to reset.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "cluster", - "in": "query", - "description": "Cluster identifier for the reset operation.", - "required": true, - "schema": { - "type": "string" - } - } + "System Operations" ], + "summary": "Consume messages from the message queue.", + "description": "This route can be used to consume messages from the message queue. It is intended to be used if\nno cronjob is configured to consume messages regularly.", + "operationId": "consumeMessages", "requestBody": { - "required": false, + "required": true, "content": { "application/json": { "schema": { - "type": "object", + "required": [ + "receiver" + ], "properties": { - "key": { - "type": "string", - "description": "Optional specific key to reset. If not provided, all values in the pool will be reset." + "receiver": { + "description": "The name of the transport in the messenger that should be processed.\nSee the [Symfony Messenger documentation](https://symfony.com/doc/current/messenger.html) for more information", + "type": "string" } - } + }, + "type": "object" } } } }, "responses": { "200": { - "description": "Successfully reset the increment values", + "description": "Returns information about handled messages", "content": { "application/json": { "schema": { - "type": "object", "properties": { - "success": { - "type": "boolean", - "example": true + "handledMessages": { + "description": "The number of messages processed.", + "type": "integer" } - } + }, + "type": "object" } } } + } + } + } + }, + "/_info/health-check": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Check that the Application is running", + "operationId": "healthCheck", + "responses": { + "200": { + "description": "Returns empty response" }, - "400": { - "description": "Bad request - cluster parameter missing" + "500": { + "description": "Application is not working properly" } } } }, - "/_action/delete-increment/{pool}": { - "delete": { + "/_info/system-health-check": { + "get": { "tags": [ - "Increment Storage" + "System Info & Health Check" ], - "summary": "Delete increment keys from pool", - "description": "Deletes specific increment keys from the specified pool.", - "operationId": "deleteIncrementKeys", + "summary": "Perform a detailed system health check", + "operationId": "systemHealthCheck", "parameters": [ { - "name": "pool", - "in": "path", - "description": "The name of the increment pool to delete keys from.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "cluster", + "name": "verbose", "in": "query", - "description": "Cluster identifier for the delete operation.", - "required": true, + "required": false, "schema": { - "type": "string" - } + "type": "boolean", + "default": false + }, + "description": "Include detailed information in the response" } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "keys" - ], - "properties": { - "keys": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of keys to delete from the pool." + "responses": { + "200": { + "description": "Returns the system health check results", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "checks": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "healthy": { + "type": "boolean" + }, + "status": { + "type": "string" + }, + "message": { + "type": "string" + }, + "extra": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + } + } + } + } } } } } - } - }, - "responses": { - "204": { - "description": "Successfully deleted the increment keys" }, - "400": { - "description": "Bad request - invalid keys parameter or cluster parameter missing" + "500": { + "description": "Application is not working properly" } } } }, - "/_action/validation/email": { + "/_proxy/generate-imitate-customer-token": { "post": { "tags": [ - "Email support validation" + "Customer impersonation" ], - "summary": "Email support.", - "description": "Checks a given email string.", - "operationId": "supportsEmail", + "summary": "Generate a customer impersonation token", + "description": "Generates a customer impersonation token for the given customer and sales channel.\n\nThe token can be used to authenticate as the customer in the sales channel.", + "operationId": "generateImitateCustomerToken", "requestBody": { "required": true, "content": { "application/json": { "schema": { "required": [ - "email" + "customerId", + "salesChannelId" ], "properties": { - "email": { - "description": "The email to be verified.", + "customerId": { + "description": "ID of the customer", + "type": "string" + }, + "salesChannelId": { + "description": "ID of the sales channel", "type": "string" } }, @@ -77024,57 +76906,18 @@ } }, "responses": { - "204": { - "description": "Email is supported" - }, - "400": { - "description": "Invalid request payload. The argument 'email' may be missing.", - "content": { - "application/json": { - "schema": { - "properties": { - "errors": { - "description": "Contains the error message.", - "type": "array" - } - }, - "type": "object" - }, - "example": { - "errors": [ - { - "code": "0", - "status": "400", - "title": "Unprocessable Content", - "detail": "This value should not be blank." - } - ] - } - } - } - }, - "422": { - "description": "Email address is not supported.", + "200": { + "description": "The generated customer impersonation token.", "content": { "application/json": { "schema": { "properties": { - "errors": { - "description": "Contains the validation error.", - "type": "array" + "token": { + "description": "The generated customer impersonation token", + "type": "string" } }, "type": "object" - }, - "example": { - "errors": [ - { - "code": "0", - "status": "422", - "title": "Unprocessable Content", - "detail": "This value is not a supported email address." - } - ] } } } @@ -77082,328 +76925,305 @@ } } }, - "/_action/order/{orderId}/order-address": { + "/_action/mail-template/send": { "post": { "tags": [ - "Order address" - ], - "summary": "Update order addresses", - "description": "Endpoint which takes a list of mapping objects as payload and updates the order addresses accordingly", - "operationId": "updateOrderAddresses", - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "Identifier of the order.", - "required": true, - "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - } - } + "Mail Operations" ], + "summary": "Send a mail", + "description": "Generates a mail from a mail template and sends it to the customer.\n\nTake a look at the `salesChannel` entity for possible values. For example `{{ salesChannel.name }}` can be used.", + "operationId": "send", "requestBody": { + "required": true, "content": { "application/json": { "schema": { - "type": "object", + "required": [ + "recipients", + "salesChannelId", + "contentHtml", + "contentPlain", + "subject", + "senderName" + ], "properties": { - "mapping": { - "type": "array", - "items": { - "type": "object", - "properties": { - "customerAddressId": { - "type": "string", - "description": "The ID of the customer address" - }, - "type": { - "type": "string", - "description": "The type of the address" + "recipients": { + "description": "A list of recipients with name and mail address.", + "type": "object", + "example": { + "test1@example.com": "Test user 1", + "test2@example.com": "Test user 2" + }, + "additionalProperties": { + "description": "Name of the recipient.", + "type": "string" + } + }, + "salesChannelId": { + "description": "Identifier of the sales channel from which the mail should be send.", + "type": "string", + "pattern": "^[0-9a-f]{32}$" + }, + "contentHtml": { + "description": "The content of the mail in HTML format.", + "type": "string" + }, + "contentPlain": { + "description": "The content of the mail as plain text.", + "type": "string" + }, + "subject": { + "description": "Subject of the mail.", + "type": "string" + }, + "senderName": { + "description": "Name of the sender.", + "type": "string" + }, + "senderEmail": { + "description": "Mail address of the sender. If not set, `core.basicInformation.email` or `core.mailerSettings.senderAddress` will be used from the shop configuration.", + "type": "string" + }, + "mediaIds": { + "description": "List of media identifiers which should be attached to the mail.", + "type": "array", + "items": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + "binAttachments": { + "description": "A list of binary attachments which should be added to the mail.", + "required": [ + "content", + "fileName", + "mimeType" + ], + "type": "array", + "items": { + "properties": { + "content": { + "description": "Binary content of the attachment.", + "type": "string" }, - "deliveryId": { - "description": "The ID of the delivery (optional)", - "oneOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] + "fileName": { + "description": "File name of the attachment.", + "type": "string" + }, + "mimeType": { + "description": "Mime type of the attachment.", + "type": "string" } }, - "required": [ - "customerAddressId", - "type" - ] + "type": "object" + } + }, + "recipientsBcc": { + "description": "A list of recipients with name and mail address to be set in BCC.", + "type": "object", + "example": { + "test1@example.com": "Test user 1", + "test2@example.com": "Test user 2" }, - "description": "The mapping of order addresses" + "additionalProperties": { + "description": "Name of the recipient.", + "type": "string" + } + }, + "recipientsCc": { + "description": "A list of recipients with name and mail address to be set in CC.", + "type": "object", + "example": { + "test1@example.com": "Test user 1", + "test2@example.com": "Test user 2" + }, + "additionalProperties": { + "description": "Name of the recipient.", + "type": "string" + } + }, + "replyTo": { + "description": "A list of mail addresses with name and mail address to be set in reply to.", + "type": "object", + "example": { + "test1@example.com": "Test user 1", + "test2@example.com": "Test user 2" + }, + "additionalProperties": { + "description": "Name of the recipient.", + "type": "string" + } + }, + "returnPath": { + "description": "A list of mail addresses with name and mail address to be set in return path.", + "type": "object", + "example": { + "test1@example.com": "Test user 1", + "test2@example.com": "Test user 2" + }, + "additionalProperties": { + "description": "Name of the recipient.", + "type": "string" + } } - } + }, + "type": "object" } } - }, - "required": true - }, - "responses": { - "204": { - "description": "Returns a no content response indicating that the update has been made." - } - } - } - }, - "/_action/number-range/reserve/{type}/{saleschannel}": { - "get": { - "tags": [ - "Document Management" - ], - "summary": "Reserve or preview a number-range / document number.", - "description": "This endpoint provides functionality to reserve or preview a document number which can be used to create a new document using the `/_action/order/{orderId}/document/{documentTypeName}` endpoint.\n\nThe number generated by the endpoint will be reserved and the number pointer will be incremented with every call. For preview purposes, you can add the `?preview=1` parameter to the request. In that case, the number will not be incremented.", - "operationId": "numberRangeReserve", - "parameters": [ - { - "name": "type", - "in": "path", - "description": "`technicalName` of the document type (e.g. `document_invoice`). Available types can be fetched with the `/api/document-type endpoint`.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "saleschannel", - "in": "path", - "description": "Sales channel for the number range. Number ranges can be defined per sales channel, so you can pass a sales channel ID here.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "preview", - "in": "query", - "description": "If this parameter has a true value, the number will not actually be incremented, but only previewed.", - "required": false, - "schema": { - "type": "boolean" - } } - ], + }, "responses": { "200": { - "description": "The generated number", + "description": "The mail was sent successful", "content": { "application/json": { "schema": { "properties": { - "number": { - "description": "The generated (or previewed) document number.", - "type": "string" + "size": { + "description": "Length of the email message", + "type": "integer" } }, "type": "object" } } } - }, - "400": { - "description": "Number range not found" } } } }, - "/_info/version": { - "get": { + "/_action/mail-template/validate": { + "post": { "tags": [ - "System Info & Health Check" + "Mail Operations" ], - "summary": "Get the Shopware version", - "description": "Get the version of the Shopware instance", - "operationId": "infoShopwareVersion", - "responses": { - "200": { - "description": "Returns the version of the Shopware instance.", - "content": { - "application/json": { - "schema": { - "properties": { - "version": { - "description": "The Shopware version.", - "type": "string" - } + "summary": "Validate a mail content", + "description": "Validates if content for a mail can be rendered without sending an email.", + "operationId": "validate", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "required": [ + "contentHtml", + "contentPlain" + ], + "properties": { + "contentHtml": { + "description": "The content of the mail in HTML format.", + "type": "string" }, - "type": "object" - } + "contentPlain": { + "description": "The content of the mail as plain text.", + "type": "string" + } + }, + "type": "object" } } } - } - } - }, - "/_info/flow-actions.json": { - "get": { - "tags": [ - "System Info & Health Check" - ], - "summary": "Get actions for flow builder", - "description": "Get a list of action for flow builder.", - "operationId": "flow-actions", + }, "responses": { - "200": { - "description": "Returns a list of action for flow builder.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/flowBuilderActionsResponse" - } - } - } + "204": { + "description": "Returns a no content response indicating the mail content was rendered successfully." } } } }, - "/app-system/privileges/requested": { - "get": { + "/_action/mail-template/build": { + "post": { "tags": [ - "App System" - ], - "summary": "Get requested privileges for all apps", - "description": "Returns the list of requested privileges for all apps. Requires admin scope and `acl_role:read` permission to read.", - "operationId": "getRequestedPrivileges", - "security": [ - { - "oAuth": [ - "admin" - ] - } + "Mail Operations" ], - "responses": { - "200": { - "description": "A JSON object containing requested privileges.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "privileges": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } + "summary": "Preview a mail template", + "description": "Generates a preview of a mail template.", + "operationId": "build", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "required": [ + "mailTemplateType", + "mailTemplate" + ], + "properties": { + "mailTemplateType": { + "description": "Only the property `templateData` is used. It provides additional variables to the templating engine.", + "properties": { + "templateData": { + "description": "An associative array that is handed over to the templating engine and can be used as variables in the mail content.", + "type": "object", + "example": { + "order": { + "orderNumber": 5000, + "customerName": "Example Customer" + }, + "messageOfTheDay": "An apple a day keeps the doctor away!" + }, + "additionalProperties": true } - } + }, + "type": "object" + }, + "mailTemplate": { + "description": "The content of the mail as plain text.", + "properties": { + "contentHtml": { + "description": "The content of mail mail template in html format.", + "type": "string", + "example": "Hello {{ order.customerName }}, this is example mail content, the current date is {{ 'now'|date('d/m/Y') }}" + } + }, + "type": "object" } }, - "example": { - "privileges": { - "SwagAnalytics": [ - "customer:read", - "order:read" - ], - "SwagExample": [ - "product:write" - ] - } - } + "type": "object" } } - }, - "400": { - "description": "Malformed request." - }, - "401": { - "description": "Unauthorized Access." - }, - "403": { - "description": "Forbidden. Not a valid integration source." - } - } - } - }, - "/app-system/{appName}/privileges/accepted": { - "get": { - "tags": [ - "App System" - ], - "summary": "Get accepted privileges for an app", - "description": "Returns the list of accepted privileges for the current integration. Requires admin scope with an integration.", - "operationId": "getAcceptedPrivileges", - "parameters": [ - { - "name": "appName", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "security": [ - { - "oAuth": [ - "admin" - ] } - ], + }, "responses": { "200": { - "description": "A JSON object containing accepted privileges.", + "description": "The rendered preview of the mail template.", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "privileges": { - "type": "object", - "additionalProperties": { - "type": "boolean" - } - } - } - }, - "example": { - "privileges": { - "customer:read": true, - "order:read": true - } + "type": "string" } } } - }, - "400": { - "description": "Malformed request." - }, - "401": { - "description": "Unauthorized Access." - }, - "403": { - "description": "Forbidden. Not a valid integration source." - }, - "404": { - "description": "App not found." } } } }, - "/app-system/{appName}/privileges": { - "patch": { + "/_action/increment/{pool}": { + "post": { "tags": [ - "App System" + "Increment Storage" ], - "summary": "Accept or revoke privileges for an app", - "description": "Accepts or revokes specified privileges for the given app.", - "operationId": "managePrivileges", + "summary": "Increment a value in the specified pool", + "description": "Increments a value by key in the specified increment pool. This operation increments the counter for the given key and returns a success response.", + "operationId": "incrementValue", "parameters": [ { - "name": "appName", + "name": "pool", "in": "path", + "description": "The name of the increment pool (e.g., 'user_activity', 'message_queue').", "required": true, "schema": { "type": "string" } + }, + { + "name": "cluster", + "in": "query", + "description": "Optional cluster identifier for the increment operation.", + "required": false, + "schema": { + "type": "string" + } } ], "requestBody": { @@ -77412,350 +77232,302 @@ "application/json": { "schema": { "type": "object", + "required": [ + "key" + ], "properties": { - "accept": { - "type": "array", - "items": { - "type": "string" - } - }, - "revoke": { - "type": "array", - "items": { - "type": "string" - } + "key": { + "type": "string", + "description": "The key to increment in the pool." } } - }, - "example": { - "accept": [ - "customer:read", - "order:read" - ], - "revoke": [ - "product:write" - ] } } } }, - "responses": { - "204": { - "description": "Returns no content if privileges were managed successfully." - }, - "400": { - "description": "Malformed request." - }, - "401": { - "description": "Unauthorized Access." - }, - "403": { - "description": "Forbidden. Not a valid integration source." - }, - "404": { - "description": "App not found." - } - }, - "security": [ - { - "oAuth": [ - "admin" - ] - } - ] - } - }, - "/_action/app-system/secret/rotate": { - "post": { - "tags": [ - "App System" - ], - "summary": "Initiate secret rotation for the calling app", - "description": "Initiates an app secret rotation for the calling app. Needs to be called with an integration token belonging to an app. Note that the secret rotation will only be scheduled and then handled asynchronously.", - "operationId": "appSecretRotation", - "responses": { - "202": { - "description": "Returns \"Accepted\" when secret rotation was scheduled." - }, - "400": { - "description": "Malformed request, e.g. when requested with non app integration source." - }, - "401": { - "description": "Unauthorized Access." - }, - "403": { - "description": "Forbidden. Not a valid integration source." - }, - "404": { - "description": "App not found." - } - }, - "security": [ - { - "oAuth": [ - "admin" - ] - } - ] - } - }, - "/app-system/shop/verify": { - "get": { - "tags": [ - "App System", - "Public" - ], - "summary": "Verify a shop's APP_URL", - "description": "Used to verify that a shop's APP_URL points to its self. The passed run ID and token are used to query the cache. It returns 204 no content if the given token can be verified using the run id.", - "operationId": "verifyAppUrl", - "parameters": [ - { - "name": "runId", - "in": "query", - "description": "A unique identifier used to look up the token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "A unique identifier", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "description": "An empty response signalling successful verification." - }, - "400": { - "description": "Malformed request or unsuccessful verification." - } - } - } - }, - "/_info/queue.json": { - "get": { - "tags": [ - "System Info & Health Check" - ], - "summary": "Get message queue statistics (deprecated)", - "description": "Returns increment-based message queue statistics.\n\n**Deprecated:** This endpoint is deprecated and will be removed in v6.8.0. Use `GET /_info/message-stats.json` instead for accurate message processing statistics.", - "operationId": "queue", - "deprecated": true, "responses": { "200": { - "description": "Message queue statistics returned.", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Fully qualified class name of the message." - }, - "size": { - "type": "integer", - "description": "Number of pending messages of this type." - } - }, - "required": [ - "name", - "size" - ] - } - }, - "example": [ - { - "name": "Shopware\\Core\\Content\\Product\\DataAbstractionLayer\\ProductIndexingMessage", - "size": 150 - }, - { - "name": "Shopware\\Core\\Content\\Media\\Message\\GenerateThumbnailsMessage", - "size": 25 + "description": "Successfully incremented the value", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + } } - ] + } } } + }, + "400": { + "description": "Bad request - key parameter missing or cluster parameter missing" } } - } - }, - "/_action/system-config": { + }, "get": { "tags": [ - "System Config" + "Increment Storage" ], - "summary": "Get configuration values", - "description": "Returns the configuration values for the given domain and optional sales channel.", - "operationId": "getConfigurationValues", + "summary": "List increment values from pool", + "description": "Retrieves a list of increment values from the specified pool with pagination support.", + "operationId": "getIncrementValues", "parameters": [ { - "name": "domain", - "in": "query", - "description": "The configuration domain.", + "name": "pool", + "in": "path", + "description": "The name of the increment pool to list values from.", "required": true, "schema": { "type": "string" } }, { - "name": "salesChannelId", + "name": "cluster", "in": "query", - "description": "The sales channel ID to scope the configuration to.", + "description": "Cluster identifier for the increment operation.", + "required": true, "schema": { "type": "string" } }, { - "name": "inherit", + "name": "limit", "in": "query", - "description": "Whether to include inherited (global) values.", + "description": "Maximum number of items to return.", + "required": false, "schema": { - "type": "boolean", - "default": false + "type": "integer", + "default": 5, + "minimum": 1 + } + }, + { + "name": "offset", + "in": "query", + "description": "Number of items to skip for pagination.", + "required": false, + "schema": { + "type": "integer", + "default": 0, + "minimum": 0 } } ], "responses": { "200": { - "description": "Returns the configuration values as a key-value object." + "description": "List of increment values", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "The increment key" + }, + "count": { + "type": "integer", + "description": "The current count value" + } + } + } + } + } + } + }, + "400": { + "description": "Bad request - cluster parameter missing" } } - }, + } + }, + "/_action/decrement/{pool}": { "post": { "tags": [ - "System Config" + "Increment Storage" ], - "summary": "Save configuration values", - "description": "Saves the given configuration key-value pairs for the given sales channel.", - "operationId": "saveConfiguration", + "summary": "Decrement a value in the specified pool", + "description": "Decrements a value by key in the specified increment pool. This operation decrements the counter for the given key and returns a success response.", + "operationId": "decrementValue", "parameters": [ { - "name": "salesChannelId", - "in": "query", - "description": "The sales channel ID to scope the configuration to.", + "name": "pool", + "in": "path", + "description": "The name of the increment pool.", + "required": true, "schema": { "type": "string" } }, { - "name": "silent", + "name": "cluster", "in": "query", - "description": "If true, the HTTP cache will not be invalidated. Use this for internal configuration values that do not affect the storefront.", + "description": "Optional cluster identifier for the decrement operation.", + "required": false, "schema": { - "type": "boolean", - "default": false + "type": "string" } } ], "requestBody": { - "description": "Key-value pairs of configuration values to save.", "required": true, "content": { "application/json": { "schema": { "type": "object", - "additionalProperties": true + "required": [ + "key" + ], + "properties": { + "key": { + "type": "string", + "description": "The key to decrement in the pool." + } + } } } } }, "responses": { - "204": { - "description": "Configuration saved successfully." + "200": { + "description": "Successfully decremented the value", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + } + } + } + } + } + }, + "400": { + "description": "Bad request - key parameter missing or cluster parameter missing" } } } }, - "/_action/system-config/check": { - "get": { + "/_action/reset-increment/{pool}": { + "post": { "tags": [ - "System Config" + "Increment Storage" ], - "summary": "Check configuration", - "description": "Checks if a configuration domain exists.", - "operationId": "checkConfiguration", + "summary": "Reset increment values in pool", + "description": "Resets increment values in the specified pool. Can reset all values or a specific key if provided.", + "operationId": "resetIncrementValues", "parameters": [ { - "name": "domain", - "in": "query", - "description": "The configuration domain to check.", + "name": "pool", + "in": "path", + "description": "The name of the increment pool to reset.", "required": true, "schema": { "type": "string" } - } - ], - "responses": { - "200": { - "description": "Returns whether the configuration domain exists." - } - } - } - }, - "/_action/system-config/schema": { - "get": { - "tags": [ - "System Config" - ], - "summary": "Get configuration schema", - "description": "Returns the configuration schema for the given domain.", - "operationId": "getConfiguration", - "parameters": [ + }, { - "name": "domain", + "name": "cluster", "in": "query", - "description": "The configuration domain.", + "description": "Cluster identifier for the reset operation.", "required": true, "schema": { "type": "string" } } ], + "requestBody": { + "required": false, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Optional specific key to reset. If not provided, all values in the pool will be reset." + } + } + } + } + } + }, "responses": { "200": { - "description": "Returns the configuration schema." + "description": "Successfully reset the increment values", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + } + } + } + } + } + }, + "400": { + "description": "Bad request - cluster parameter missing" } } } }, - "/_action/system-config/batch": { - "post": { + "/_action/delete-increment/{pool}": { + "delete": { "tags": [ - "System Config" + "Increment Storage" ], - "summary": "Batch save configuration values", - "description": "Saves configuration values for multiple sales channels at once. The request body is keyed by sales channel ID (use \"null\" for global scope).", - "operationId": "batchSaveConfiguration", + "summary": "Delete increment keys from pool", + "description": "Deletes specific increment keys from the specified pool.", + "operationId": "deleteIncrementKeys", "parameters": [ { - "name": "silent", + "name": "pool", + "in": "path", + "description": "The name of the increment pool to delete keys from.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "cluster", "in": "query", - "description": "If true, the HTTP cache will not be invalidated. Use this for internal configuration values that do not affect the storefront.", + "description": "Cluster identifier for the delete operation.", + "required": true, "schema": { - "type": "boolean", - "default": false + "type": "string" } } ], "requestBody": { - "description": "Object keyed by sales channel ID, each containing key-value pairs of configuration values.", "required": true, "content": { "application/json": { "schema": { "type": "object", - "additionalProperties": { - "type": "object", - "additionalProperties": true + "required": [ + "keys" + ], + "properties": { + "keys": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Array of keys to delete from the pool." + } } } } @@ -77763,7 +77535,25 @@ }, "responses": { "204": { - "description": "Configuration saved successfully." + "description": "Successfully deleted the increment keys" + }, + "400": { + "description": "Bad request - invalid keys parameter or cluster parameter missing" + } + } + } + }, + "/_action/cleanup": { + "delete": { + "tags": [ + "System Operations" + ], + "summary": "Clear old cache folders", + "description": "Removes cache folders that are not needed anymore.", + "operationId": "clearOldCacheFolders", + "responses": { + "204": { + "description": "Returns a no content response indicating that the cleanup finished." } } } @@ -77876,6 +77666,216 @@ } } }, + "/_action/state-machine/{entityName}/{entityId}/state": { + "get": { + "tags": [ + "State Machine" + ], + "summary": "Get available transitions for an entity", + "description": "Retrieves the available state transitions for the specified entity.", + "operationId": "getEntityState", + "parameters": [ + { + "name": "entityName", + "in": "path", + "description": "Name of the entity.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "entityId", + "in": "path", + "description": "Identifier of the entity.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + { + "name": "stateFieldName", + "in": "query", + "description": "This is the state column within the order delivery database table. There should be no need to change it from the default.", + "required": false, + "schema": { + "type": "string", + "default": "stateId" + } + } + ], + "responses": { + "200": { + "description": "Available transitions for the current state.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "transitions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the transition." + }, + "technicalName": { + "type": "string", + "description": "The technical name of the transition." + }, + "actionName": { + "type": "string", + "description": "The action name of the transition." + }, + "fromStateName": { + "type": "string", + "description": "The technical name of the state the transition starts from." + }, + "toStateName": { + "type": "string", + "description": "The technical name of the state the transition goes to." + }, + "url": { + "type": "string", + "description": "The URL to trigger the transition." + } + }, + "required": [ + "name", + "technicalName", + "actionName", + "fromStateName", + "toStateName", + "url" + ] + } + } + }, + "required": [ + "transitions" + ] + } + } + } + }, + "400": { + "description": "Unable to read the entity or entity field." + }, + "403": { + "description": "Forbidden. Missing privileges to access the entity." + } + } + } + }, + "/_action/state-machine/{entityName}/{entityId}/state/{transition}": { + "post": { + "tags": [ + "State Machine" + ], + "summary": "Transition an entity to a new state", + "description": "Changes the entity state by applying the given transition.", + "operationId": "transitionEntityState", + "parameters": [ + { + "name": "entityName", + "in": "path", + "description": "Name of the entity.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "entityId", + "in": "path", + "description": "Identifier of the entity.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + { + "name": "transition", + "in": "path", + "description": "The `action_name` of the `state_machine_transition`.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "stateFieldName", + "in": "query", + "description": "This is the state column within the order delivery database table. There should be no need to change it from the default.", + "required": false, + "schema": { + "type": "string", + "default": "stateId" + } + } + ], + "requestBody": { + "description": "Optional internal comment for the state transition.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "internalComment": { + "type": "string", + "description": "An optional internal comment that will be saved with the state transition." + } + } + } + } + } + }, + "responses": { + "200": { + "description": "State transition applied successfully." + }, + "400": { + "description": "Unable to read the entity or entity field, or invalid transition." + }, + "403": { + "description": "Forbidden. Missing privileges to access the entity." + } + } + } + }, + "/_info/openapi3.json": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Get OpenAPI Specification", + "description": "Get information about the admin API in OpenAPI format.", + "operationId": "api-info", + "parameters": [ + { + "name": "type", + "in": "query", + "description": "Type of the api", + "schema": { + "type": "string", + "enum": [ + "jsonapi", + "json" + ] + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/OpenApi3" + } + } + } + }, "/_action/theme/{themeId}": { "patch": { "tags": [ @@ -88949,6 +88949,9 @@ "description": "Technical name of document type.", "type": "string" }, + "customFields": { + "type": "object" + }, "createdAt": { "type": "string", "format": "date-time", @@ -88959,9 +88962,6 @@ "format": "date-time", "readOnly": true }, - "customFields": { - "type": "object" - }, "translated": { "type": "object" }, @@ -89089,6 +89089,10 @@ "description": "Technical name of document type.", "type": "string" }, + "customFields": { + "type": "object", + "description": "Additional fields that offer a possibility to add own fields for the different program-areas." + }, "createdAt": { "type": "string", "format": "date-time", @@ -89099,10 +89103,6 @@ "format": "date-time", "readOnly": true }, - "customFields": { - "type": "object", - "description": "Additional fields that offer a possibility to add own fields for the different program-areas." - }, "translated": { "type": "object", "description": "Contains the translations of all translated fields." @@ -108296,7 +108296,12 @@ "visibility": { "description": "An integer value to signify the product's visibility in any sales channel. `10` indicates `Hide in listings and search`, `20` indicates `Hide in listings` and `30` indicates `Visible` everywhere.", "type": "integer", - "format": "int64" + "format": "int64", + "enum": [ + 10, + 20, + 30 + ] }, "createdAt": { "type": "string", @@ -108408,7 +108413,12 @@ "visibility": { "description": "An integer value to signify the product's visibility in any sales channel. `10` indicates `Hide in listings and search`, `20` indicates `Hide in listings` and `30` indicates `Visible` everywhere.", "type": "integer", - "format": "int64" + "format": "int64", + "enum": [ + 10, + 20, + 30 + ] }, "createdAt": { "type": "string", @@ -120830,87 +120840,75 @@ ], "additionalProperties": false }, - "Price": { + "flowBuilderActionsResponse": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the flow action" + }, + "requirements": { + "type": "array", + "description": "When requirement fit with aware from `events.json` actions will be shown", + "items": { + "type": "string" + } + }, + "extensions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Extensions data of event" + } + } + } + }, + "MeasurementUnits": { "type": "object", - "description": "Price object", + "description": "Configuration of the measurement system", "properties": { - "currencyId": { + "system": { "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "gross": { - "description": "", - "type": "number" - }, - "net": { - "description": "", - "type": "number" - }, - "linked": { - "description": "", - "type": "boolean" + "enum": [ + "metric", + "imperial" + ], + "default": "metric", + "description": "The measurement system used in the store. 'metric' for metric system, 'imperial' for imperial system." }, - "listPrice": { - "description": "", + "units": { "type": "object", + "description": "Units used in the measurement system.", "properties": { - "currencyId": { + "length": { "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "gross": { - "description": "", - "type": "number" - }, - "net": { - "description": "", - "type": "number" + "enum": [ + "mm", + "cm", + "m", + "in", + "ft" + ], + "default": "mm", + "description": "Unit of length." }, - "linked": { - "description": "", - "type": "boolean" - } - }, - "required": [ - "gross", - "net", - "linked" - ] - }, - "regulationPrice": { - "description": "", - "type": "object", - "properties": { - "currencyId": { + "weight": { "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "gross": { - "description": "", - "type": "number" - }, - "net": { - "description": "", - "type": "number" - }, - "linked": { - "description": "", - "type": "boolean" + "enum": [ + "g", + "kg", + "oz", + "lb" + ], + "default": "kg", + "description": "Unit of weight." } - }, - "required": [ - "gross", - "net", - "linked" - ] + } } - }, - "required": [ - "currencyId", - "gross", - "net", - "linked" - ] + } }, "OAuthScopes": { "description": "OAuth scopes that should be requested.", @@ -121036,32 +121034,6 @@ } ] }, - "flowBuilderActionsResponse": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name of the flow action" - }, - "requirements": { - "type": "array", - "description": "When requirement fit with aware from `events.json` actions will be shown", - "items": { - "type": "string" - } - }, - "extensions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Extensions data of event" - } - } - } - }, "MediaId": { "type": "string", "pattern": "^[0-9a-f]{32}$", @@ -121095,6 +121067,40 @@ } } }, + "businessEventsResponse": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique name of the businessEventsResponse." + }, + "class": { + "type": "string", + "description": "Class name of business event." + }, + "data": { + "type": "object", + "description": "Internal field." + }, + "aware": { + "type": "array", + "description": "Parameter that indicates the areas in which the business event is supported.", + "items": { + "type": "string" + } + }, + "extensions": { + "type": "array", + "description": "Internal field.", + "items": { + "type": "string" + } + } + } + } + }, "Criteria": { "type": "object", "description": "Criteria to query entities.", @@ -121815,83 +121821,87 @@ "field" ] }, - "MeasurementUnits": { + "Price": { "type": "object", - "description": "Configuration of the measurement system", + "description": "Price object", "properties": { - "system": { + "currencyId": { "type": "string", - "enum": [ - "metric", - "imperial" - ], - "default": "metric", - "description": "The measurement system used in the store. 'metric' for metric system, 'imperial' for imperial system." + "pattern": "^[0-9a-f]{32}$" }, - "units": { + "gross": { + "description": "", + "type": "number" + }, + "net": { + "description": "", + "type": "number" + }, + "linked": { + "description": "", + "type": "boolean" + }, + "listPrice": { + "description": "", "type": "object", - "description": "Units used in the measurement system.", "properties": { - "length": { + "currencyId": { "type": "string", - "enum": [ - "mm", - "cm", - "m", - "in", - "ft" - ], - "default": "mm", - "description": "Unit of length." + "pattern": "^[0-9a-f]{32}$" }, - "weight": { - "type": "string", - "enum": [ - "g", - "kg", - "oz", - "lb" - ], - "default": "kg", - "description": "Unit of weight." + "gross": { + "description": "", + "type": "number" + }, + "net": { + "description": "", + "type": "number" + }, + "linked": { + "description": "", + "type": "boolean" } - } - } - } - }, - "businessEventsResponse": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Unique name of the businessEventsResponse." - }, - "class": { - "type": "string", - "description": "Class name of business event." - }, - "data": { - "type": "object", - "description": "Internal field." }, - "aware": { - "type": "array", - "description": "Parameter that indicates the areas in which the business event is supported.", - "items": { - "type": "string" + "required": [ + "gross", + "net", + "linked" + ] + }, + "regulationPrice": { + "description": "", + "type": "object", + "properties": { + "currencyId": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + }, + "gross": { + "description": "", + "type": "number" + }, + "net": { + "description": "", + "type": "number" + }, + "linked": { + "description": "", + "type": "boolean" } }, - "extensions": { - "type": "array", - "description": "Internal field.", - "items": { - "type": "string" - } - } + "required": [ + "gross", + "net", + "linked" + ] } - } + }, + "required": [ + "currencyId", + "gross", + "net", + "linked" + ] }, "ConsentState": { "type": "object",