From 261b74e24cdd62988dd13206ca1340beb3612403 Mon Sep 17 00:00:00 2001 From: shopwareBot Date: Tue, 28 Apr 2026 10:54:36 +0000 Subject: [PATCH] [create-pull-request] automated change --- adminapi.json | 5448 +++++++++++++++++++++++++------------------------ 1 file changed, 2736 insertions(+), 2712 deletions(-) diff --git a/adminapi.json b/adminapi.json index 3b6cf90..281b511 100644 --- a/adminapi.json +++ b/adminapi.json @@ -75228,25 +75228,377 @@ } } }, - "/_action/validation/email": { + "/_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 + } + ] + } + } + } + } + } + }, + "/_action/cache": { + "delete": { + "tags": [ + "System Operations" + ], + "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." + } + } + } + }, + "/oauth/token": { "post": { "tags": [ - "Email support validation" + "Authorization & Authentication" ], - "summary": "Email support.", - "description": "Checks a given email string.", - "operationId": "supportsEmail", + "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": "Authorized successfully.", + "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" + } + } + } + }, + "400": { + "$ref": "#/components/responses/400" + } + } + } + }, + "/oauth/sso/config": { + "get": { + "tags": [ + "Experimental", + "SSO Login configuration" + ], + "summary": "Experimental: Loads SSO login configuration.", + "description": "Experimental: Loads the SSO login configuration to configure the forward to the Shopware SSO login page.", + "responses": { + "200": { + "description": "Experimental: Returns the configuration for the SSO login page forward.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "useDefault": { + "description": "Experimental: Indicates which login is used. Default or SSO.", + "type": "boolean" + }, + "url": { + "description": "Experimental: Contains the return url for the Shopware SSO login.", + "type": "string" + } + } + } + } + } + } + }, + "operationId": "loadSsoLoginConfig" + } + }, + "/oauth/sso/code": { + "get": { + "tags": [ + "Experimental", + "SSO Login callback" + ], + "summary": "Experimental: Callback for SSO login", + "description": "Experimental: Logs in the user into the Shopware shop and forwards to the admin", + "responses": { + "200": { + "description": "Authorisation process continues", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "302": { + "description": "Experimental: Forwards to the Shopware admin" + } + }, + "operationId": "callBackWithCode" + } + }, + "/_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" + } + } + } + } + } + } + } + } + } + } + } + }, + "/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": { + "tags": [ + "Experimental", + "Is SSO environment" + ], + "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": "Experimental: Returns if it is a SSO environment or not" + } + } + } + }, + "/_action/sso/invite-user": { + "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" + } + } + } + }, + "/_action/index": { + "post": { + "tags": [ + "System Operations" + ], + "summary": "Run indexer", + "description": "Runs all registered indexer in the shop asynchronously.", + "operationId": "index", + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "skip": { + "description": "Array of indexers/updaters to be skipped.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "type": "object" + } + } + } + }, + "responses": { + "204": { + "description": "Returns a no content response indicating that the indexing progress startet." + } + } + } + }, + "/_proxy/generate-imitate-customer-token": { + "post": { + "tags": [ + "Customer impersonation" + ], + "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" } }, @@ -75256,57 +75608,386 @@ } }, "responses": { - "204": { - "description": "Email is supported" - }, - "400": { - "description": "Invalid request payload. The argument 'email' may be missing.", + "200": { + "description": "The generated customer impersonation token.", "content": { "application/json": { "schema": { "properties": { - "errors": { - "description": "Contains the error message.", - "type": "array" + "token": { + "description": "The generated customer impersonation token", + "type": "string" } }, "type": "object" - }, - "example": { - "errors": [ - { - "code": "0", - "status": "400", - "title": "Unprocessable Content", - "detail": "This value should not be blank." - } - ] } } } + } + } + } + }, + "/_action/order_transaction/{orderTransactionId}/state/{transition}": { + "post": { + "tags": [ + "Order Management" + ], + "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": "orderTransactionId", + "in": "path", + "description": "Identifier of the order transaction.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } }, - "422": { - "description": "Email address is not supported.", + { + "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, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": false, + "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": "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 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" + } + } + } + }, + "responses": { + "200": { + "description": "Returns information about the transition that was made. `#/components/schemas/StateMachineTransition`" + } + } + } + }, + "/_info/health-check": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Check that the Application is running", + "operationId": "healthCheck", + "responses": { + "200": { + "description": "Returns empty response" + }, + "500": { + "description": "Application is not working properly" + } + } + } + }, + "/_info/system-health-check": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Perform a detailed system health check", + "operationId": "systemHealthCheck", + "parameters": [ + { + "name": "verbose", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false + }, + "description": "Include detailed information in the response" + } + ], + "responses": { + "200": { + "description": "Returns the system health check results", "content": { "application/json": { "schema": { + "type": "object", "properties": { - "errors": { - "description": "Contains the validation error.", - "type": "array" + "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": "object" + } + } + } + } + }, + "500": { + "description": "Application is not working properly" + } + } + } + }, + "/_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/order_transaction_capture_refund/{refundId}": { + "post": { + "tags": [ + "Order Management" + ], + "summary": "Refund an order transaction capture", + "description": "Refunds an order transaction capture.", + "operationId": "orderTransactionCaptureRefund", + "parameters": [ + { + "name": "refundId", + "in": "path", + "description": "Identifier of the order transaction capture refund.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + } + ], + "responses": { + "204": { + "description": "Refund was successful" + }, + "400": { + "description": "Something went wrong, while processing the refund" + }, + "404": { + "description": "Refund with id not found" + } + } + } + }, + "/_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": "Returns a list of about the business events.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/businessEventsResponse" + } + } + } + } + } + } + }, + "/_action/document/{documentId}/{deepLinkCode}": { + "get": { + "tags": [ + "Document Management" + ], + "summary": "Download a document", + "description": "Download a document by its identifier and deep link code.", + "operationId": "downloadDocument", + "parameters": [ + { + "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", + "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 + } + } + ], + "responses": { + "200": { + "description": "The document.", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + } + }, + "/_action/document/{documentId}/upload": { + "post": { + "tags": [ + "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" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + }, + "application/json": { + "schema": { + "required": [ + "url" + ], + "properties": { + "url": { + "description": "The url of the document that will be downloaded.", + "type": "string" + } }, - "example": { - "errors": [ - { - "code": "0", - "status": "422", - "title": "Unprocessable Content", - "detail": "This value is not a supported email address." + "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.", + "type": "string" } - ] + }, + "type": "object" } } } @@ -75422,794 +76103,222 @@ } } }, - "/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": [ - { - "oAuth": [ - "admin" - ] - } - ], - "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" - } - } - } - } - }, - "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." - } - } - } - }, - "/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.", - "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": "appName", - "in": "path", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "accept": { - "type": "array", - "items": { - "type": "string" - } - }, - "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/app-system/secret/rotate": { + "/_action/scheduled-task/run": { "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/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" + "System Operations" ], + "summary": "Run scheduled tasks.", + "description": "Starts the scheduled task worker to handle the next scheduled tasks.", + "operationId": "runScheduledTasks", "responses": { "200": { - "description": "Statistics received", + "description": "Returns a success message indicating a successful run.", "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" - } - } - } - } - } - } - } - } - } - } - } - } - } - }, - "/_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 + "message": { + "description": "Success message", + "type": "string" + } + }, + "type": "object" } } } } - }, - "responses": { - "204": { - "description": "Configuration saved successfully." - } } } }, - "/_action/mail-template/send": { - "post": { + "/_action/scheduled-task/min-run-interval": { + "get": { "tags": [ - "Mail Operations" + "System 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": { - "required": [ - "recipients", - "salesChannelId", - "contentHtml", - "contentPlain", - "subject", - "senderName" - ], - "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" - }, - "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" - }, - "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.", + "summary": "Get the minimum schedules task interval", + "description": "Fetches the smallest interval that a scheduled task uses.", + "operationId": "getMinRunInterval", + "responses": { + "200": { + "description": "Returns the minimum interval.", + "content": { + "application/json": { + "schema": { + "properties": { + "minRunInterval": { + "description": "Minimal interval in seconds.", "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" + "type": "object" + } } } } - }, + } + } + }, + "/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": "The mail was sent successful", + "description": "List of consents with their status", "content": { "application/json": { "schema": { - "properties": { - "size": { - "description": "Length of the email message", - "type": "integer" - } + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/ConsentState" }, - "type": "object" + "example": { + "product_analytics": { + "name": "product_analytics", + "scopeName": "admin_user", + "identifier": "userId-12345", + "status": "accepted", + "actor": "userId-12345", + "updatedAt": "2024-01-15T10:20:30Z", + "acceptedUntil": "2024-01-15T10:20:30Z", + "acceptedRevision": "2026-02-01", + "latestRevision": "2026-02-01" + }, + "backend_data": { + "name": "backend_data", + "scopeName": "system", + "identifier": "system", + "status": "unset", + "actor": null, + "updatedAt": null, + "acceptedUntil": null, + "acceptedRevision": null, + "latestRevision": null + } + } } } } + }, + "401": { + "description": "Unauthorized - User not logged in or invalid session" } } } }, - "/_action/mail-template/validate": { + "/consents/accept": { "post": { "tags": [ - "Mail Operations" + "Consent Management", + "Experimental" ], - "summary": "Validate a mail content", - "description": "Validates if content for a mail can be rendered without sending an email.", - "operationId": "validate", + "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": { - "required": true, "content": { "application/json": { "schema": { - "required": [ - "contentHtml", - "contentPlain" - ], + "type": "object", "properties": { - "contentHtml": { - "description": "The content of the mail in HTML format.", - "type": "string" + "consent": { + "type": "string", + "description": "The name of the consent to accept" }, - "contentPlain": { - "description": "The content of the mail as plain text.", - "type": "string" + "revision": { + "type": [ + "string", + "null" + ], + "description": "Optional accepted revision. Only the consent definition's latest revision is accepted. When omitted, the latest revision is used automatically." } }, - "type": "object" + "required": [ + "consent" + ], + "example": { + "consent": "product_analytics", + "revision": "2026-02-01" + } } } } }, "responses": { - "204": { - "description": "Returns a no content response indicating the mail content was rendered successfully." + "200": { + "description": "Consent status changed successfully. Returns the updated consent status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConsentState" + } + } + } + }, + "400": { + "description": "Bad request - Consent revision is invalid for current acceptance" + }, + "404": { + "description": "Bad request - Consent not found or consent property was empty" + }, + "401": { + "description": "Unauthorized - User not logged in or invalid session" } } } }, - "/_action/mail-template/build": { + "/consents/revoke": { "post": { "tags": [ - "Mail Operations" + "Consent Management", + "Experimental" ], - "summary": "Preview a mail template", - "description": "Generates a preview of a mail template.", - "operationId": "build", + "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": { - "required": true, "content": { "application/json": { "schema": { - "required": [ - "mailTemplateType", - "mailTemplate" - ], + "type": "object", "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" + "consent": { + "type": "string", + "description": "The name of the consent to accept" } }, - "type": "object" + "required": [ + "consent" + ], + "example": { + "consent": "product_analytics" + } } } } }, "responses": { "200": { - "description": "The rendered preview of the mail template.", + "description": "Consent status changed successfully. Returns the updated consent status.", "content": { "application/json": { "schema": { - "type": "string" + "$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" } } } @@ -76556,361 +76665,109 @@ } }, "responses": { - "201": { - "description": "Thumbnails attached successfully", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "mediaId": { - "description": "ID of the media entity the thumbnails were attached to.", - "$ref": "#/components/schemas/MediaId" - }, - "thumbnailsCreated": { - "type": "integer" - } - } - } - } - } - }, - "400": { - "description": "Media is not an external media entity or path is missing" - }, - "404": { - "description": "Media entity not found" - } - } - }, - "delete": { - "tags": [ - "Asset Management" - ], - "summary": "Delete all external thumbnails from media", - "description": "Removes all externally stored thumbnail entries from the given media entity. Only works on external media (media with an HTTP/HTTPS path). Used to replace outdated thumbnails with new ones.", - "operationId": "deleteExternalThumbnails", - "parameters": [ - { - "name": "mediaId", - "in": "path", - "description": "ID of the external media entity the thumbnails will be deleted from..", - "required": true, - "schema": { - "$ref": "#/components/schemas/MediaId" - } - } - ], - "responses": { - "200": { - "description": "Thumbnails deleted successfully", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "mediaId": { - "description": "ID of the media entity the thumbnails were deleted from.", - "$ref": "#/components/schemas/MediaId" - } - } - } - } - } - }, - "400": { - "description": "Media is not an external media entity or path is missing" - }, - "404": { - "description": "Media entity not found" - } - } - } - }, - "/_action/media/{mediaId}/video-cover": { - "post": { - "tags": [ - "Asset Management" - ], - "summary": "Assign or remove a video cover image", - "description": "Assigns an image as a cover for a video media entity, or removes the cover if `coverMediaId` is null.", - "operationId": "assignVideoCover", - "parameters": [ - { - "name": "mediaId", - "in": "path", - "required": true, - "description": "ID of the video media entity", - "schema": { - "$ref": "#/components/schemas/MediaId" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "coverMediaId": { - "type": [ - "string", - "null" - ], - "pattern": "^[0-9a-f]{32}$", - "description": "ID of the image media entity to use as cover. Set to null to remove the cover." - } - } - } - } - } - }, - "responses": { - "204": { - "description": "Video cover assigned or removed successfully" - }, - "400": { - "description": "Invalid request" - } - } - } - }, - "/_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." - } - } - } - }, - "/_action/indexing/{indexer}": { - "post": { - "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}$" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "offset": { - "description": "The offset for the iteration.", - "type": "integer" - } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Returns information about the iteration.", + "201": { + "description": "Thumbnails attached successfully", "content": { "application/json": { "schema": { + "type": "object", "properties": { - "finish": { - "description": "Indicates if the indexing process finished.", - "type": "boolean" + "mediaId": { + "description": "ID of the media entity the thumbnails were attached to.", + "$ref": "#/components/schemas/MediaId" }, - "offset": { - "description": "Offset to be used for the next iteration.", + "thumbnailsCreated": { "type": "integer" } - }, - "type": "object" + } } } } + }, + "400": { + "description": "Media is not an external media entity or path is missing" + }, + "404": { + "description": "Media entity not found" } } - } - }, - "/_action/state-machine/{entityName}/{entityId}/state": { - "get": { + }, + "delete": { "tags": [ - "State Machine" + "Asset Management" ], - "summary": "Get available transitions for an entity", - "description": "Retrieves the available state transitions for the specified entity.", - "operationId": "getEntityState", + "summary": "Delete all external thumbnails from media", + "description": "Removes all externally stored thumbnail entries from the given media entity. Only works on external media (media with an HTTP/HTTPS path). Used to replace outdated thumbnails with new ones.", + "operationId": "deleteExternalThumbnails", "parameters": [ { - "name": "entityName", - "in": "path", - "description": "Name of the entity.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "entityId", + "name": "mediaId", "in": "path", - "description": "Identifier of the entity.", + "description": "ID of the external media entity the thumbnails will be deleted from..", "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" + "$ref": "#/components/schemas/MediaId" } } ], "responses": { "200": { - "description": "Available transitions for the current state.", + "description": "Thumbnails deleted successfully", "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" - ] - } + "mediaId": { + "description": "ID of the media entity the thumbnails were deleted from.", + "$ref": "#/components/schemas/MediaId" } - }, - "required": [ - "transitions" - ] + } } } } }, "400": { - "description": "Unable to read the entity or entity field." + "description": "Media is not an external media entity or path is missing" }, - "403": { - "description": "Forbidden. Missing privileges to access the entity." + "404": { + "description": "Media entity not found" } } } }, - "/_action/state-machine/{entityName}/{entityId}/state/{transition}": { + "/_action/media/{mediaId}/video-cover": { "post": { "tags": [ - "State Machine" + "Asset Management" ], - "summary": "Transition an entity to a new state", - "description": "Changes the entity state by applying the given transition.", - "operationId": "transitionEntityState", + "summary": "Assign or remove a video cover image", + "description": "Assigns an image as a cover for a video media entity, or removes the cover if `coverMediaId` is null.", + "operationId": "assignVideoCover", "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", + "name": "mediaId", "in": "path", - "description": "The `action_name` of the `state_machine_transition`.", "required": true, + "description": "ID of the video media entity", "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" + "$ref": "#/components/schemas/MediaId" } } ], "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." + "coverMediaId": { + "type": [ + "string", + "null" + ], + "pattern": "^[0-9a-f]{32}$", + "description": "ID of the image media entity to use as cover. Set to null to remove the cover." } } } @@ -76918,55 +76775,124 @@ } }, "responses": { - "200": { - "description": "State transition applied successfully." + "204": { + "description": "Video cover assigned or removed successfully" }, "400": { - "description": "Unable to read the entity or entity field, or invalid transition." - }, - "403": { - "description": "Forbidden. Missing privileges to access the entity." + "description": "Invalid request" } } } }, - "/_action/message-queue/consume": { + "/_action/sync": { "post": { "tags": [ - "System Operations" + "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" + ] + } + } ], - "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": true, "content": { "application/json": { "schema": { - "required": [ - "receiver" - ], - "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", - "type": "string" - } - }, - "type": "object" + "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", + "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" + } + ] + } + } + }, + "type": "object" + } } } } }, "responses": { "200": { - "description": "Returns information about handled messages", + "description": "Returns a sync result containing information about the updated entities", "content": { "application/json": { "schema": { "properties": { - "handledMessages": { - "description": "The number of messages processed.", - "type": "integer" + "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" @@ -76977,99 +76903,48 @@ } } }, - "/_action/order_delivery/{orderDeliveryId}/state/{transition}": { + "/_action/increment/{pool}": { "post": { "tags": [ - "Order Management" + "Increment Storage" ], - "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": "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": "orderDeliveryId", + "name": "pool", "in": "path", - "description": "Identifier of the order delivery.", + "description": "The name of the increment pool (e.g., 'user_activity', 'message_queue').", "required": true, "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" + "type": "string" } }, { - "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, + "name": "cluster", + "in": "query", + "description": "Optional cluster identifier for the increment operation.", + "required": false, "schema": { "type": "string" } } ], "requestBody": { - "required": false, + "required": true, "content": { "application/json": { "schema": { + "type": "object", + "required": [ + "key" + ], "properties": { - "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.", + "key": { "type": "string", - "default": "stateId" - }, - "internalComment": { - "description": "An optional internal comment that will be saved with the state transition.", - "type": "string" + "description": "The key to increment in the pool." } - }, - "type": "object" - } - } - } - }, - "responses": { - "200": { - "description": "Todo: Use ref of `state_machine_transition` here" - } - } - } - }, - "/_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}$" } } } @@ -77077,256 +76952,214 @@ }, "responses": { "200": { - "description": "The documents.", + "description": "Successfully incremented the value", "content": { - "application/octet-stream": { + "application/json": { "schema": { - "type": "string", - "format": "binary" + "type": "object", + "properties": { + "success": { + "type": "boolean", + "example": true + } + } } } } + }, + "400": { + "description": "Bad request - key parameter missing or cluster parameter missing" } } - } - }, - "/_action/order/document/{documentTypeName}/create": { - "post": { + }, + "get": { "tags": [ - "Document Management" + "Increment Storage" ], - "summary": "Create documents for orders", - "description": "Creates documents for orders. Documents can for example be an invoice or a delivery note.", - "operationId": "createDocuments", + "summary": "List increment values from pool", + "description": "Retrieves a list of increment values from the specified pool with pagination support.", + "operationId": "getIncrementValues", "parameters": [ { - "name": "documentTypeName", + "name": "pool", "in": "path", - "description": "The type of document to create", + "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 + } } ], - "requestBody": { - "description": "test", - "required": true, - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "required": [ - "orderId", - "type" - ], - "properties": { - "orderId": { - "description": "Identifier of the order.", - "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "type": { - "description": "Type of the document to be generated.", - "type": "string" - }, - "fileType": { - "description": "Type of document file to be generated.", - "type": "string", - "default": "pdf" - }, - "static": { - "description": "Indicate if the document should be static or not.", - "type": "boolean", - "default": false - }, - "referencedDocumentId": { - "description": "Identifier of the reverenced document.", - "type": "string", - "default": "null", - "pattern": "^[0-9a-f]{32}$" - }, - "config": { - "description": "Document specific configuration, like documentNumber, documentDate, documentComment.", - "type": "object" + "responses": { + "200": { + "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" + } } } } } } - } - }, - "responses": { - "200": { - "description": "Documents created successfully. The `api/_action/order/document/create` route can be used to download the document." + }, + "400": { + "description": "Bad request - cluster parameter missing" } } } }, - "/_action/order/{orderId}/state/{transition}": { + "/_action/decrement/{pool}": { "post": { "tags": [ - "Order Management" + "Increment Storage" ], - "summary": "Transition an order to a new state", - "description": "Changes the order state and informs the customer via email if configured.", - "operationId": "orderStateTransition", + "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": "orderId", + "name": "pool", "in": "path", - "description": "Identifier of the order.", + "description": "The name of the increment pool.", "required": true, "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" + "type": "string" } }, { - "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": "cluster", + "in": "query", + "description": "Optional cluster identifier for the decrement operation.", + "required": false, "schema": { "type": "string" } } ], "requestBody": { - "required": false, + "required": true, "content": { "application/json": { "schema": { + "type": "object", + "required": [ + "key" + ], "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": "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 database table. There should be no need to change it from the default.", + "key": { "type": "string", - "default": "stateId" - }, - "internalComment": { - "description": "An optional internal comment that will be saved with the state transition.", - "type": "string" + "description": "The key to decrement in the pool." } - }, - "type": "object" + } } } } }, "responses": { "200": { - "description": "Todo: Use ref of `state_machine_transition` here" + "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/sync": { + "/_action/reset-increment/{pool}": { "post": { "tags": [ - "Bulk Operations" + "Increment Storage" ], - "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", + "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": "fail-on-error", - "in": "header", - "description": "To continue upcoming actions on errors, set the `fail-on-error` header to `false`.", + "name": "pool", + "in": "path", + "description": "The name of the increment pool to reset.", + "required": true, "schema": { - "type": "boolean", - "default": true + "type": "string" } }, { - "name": "indexing-behavior", - "in": "header", - "description": "Controls the indexing behavior.\n - `disable-indexing`: Data indexing is completely disabled", + "name": "cluster", + "in": "query", + "description": "Cluster identifier for the reset operation.", + "required": true, "schema": { - "type": "string", - "enum": [ - "use-queue-indexing", - "disable-indexing" - ] + "type": "string" } } ], "requestBody": { - "required": true, + "required": false, "content": { "application/json": { "schema": { - "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", - "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" - } - ] - } - } - }, - "type": "object" + "type": "object", + "properties": { + "key": { + "type": "string", + "description": "Optional specific key to reset. If not provided, all values in the pool will be reset." + } } } } @@ -77334,320 +77167,446 @@ }, "responses": { "200": { - "description": "Returns a sync result containing information about the updated entities", + "description": "Successfully reset the increment values", "content": { "application/json": { "schema": { + "type": "object", "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" + "success": { + "type": "boolean", + "example": true } - }, - "type": "object" + } } } } + }, + "400": { + "description": "Bad request - cluster parameter missing" } } } }, - "/_action/order/{orderId}/order-address": { - "post": { + "/_action/delete-increment/{pool}": { + "delete": { "tags": [ - "Order address" + "Increment Storage" ], - "summary": "Update order addresses", - "description": "Endpoint which takes a list of mapping objects as payload and updates the order addresses accordingly", - "operationId": "updateOrderAddresses", + "summary": "Delete increment keys from pool", + "description": "Deletes specific increment keys from the specified pool.", + "operationId": "deleteIncrementKeys", "parameters": [ { - "name": "orderId", + "name": "pool", "in": "path", - "description": "Identifier of the order.", + "description": "The name of the increment pool to delete keys from.", "required": true, "schema": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" + "type": "string" + } + }, + { + "name": "cluster", + "in": "query", + "description": "Cluster identifier for the delete operation.", + "required": true, + "schema": { + "type": "string" } } ], "requestBody": { + "required": true, "content": { "application/json": { "schema": { "type": "object", + "required": [ + "keys" + ], "properties": { - "mapping": { + "keys": { "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" - ] + "type": "string" }, - "description": "The mapping of order addresses" + "description": "Array of keys to delete from the pool." } } } } - }, - "required": true + } }, "responses": { "204": { - "description": "Returns a no content response indicating that the update has been made." + "description": "Successfully deleted the increment keys" + }, + "400": { + "description": "Bad request - invalid keys parameter or cluster parameter missing" } } } }, - "/_action/user/logout": { - "post": { + "/app-system/privileges/requested": { + "get": { "tags": [ - "Authorization & Authentication" + "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" + ] + } ], - "summary": "Logout the current user", - "description": "Revokes all server-side refresh tokens for the currently authenticated administration user and returns a no content response.", - "operationId": "userLogout", "responses": { - "204": { - "description": "Tokens have been revoked successfully." + "200": { + "description": "A JSON object containing requested privileges.", + "content": { + "application/json": { + "schema": { + "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 - the access token is missing or invalid." + "description": "Unauthorized Access." }, "403": { - "description": "The authenticated source does not have a user ID associated." + "description": "Forbidden. Not a valid integration source." } } } }, - "/oauth/token": { - "post": { + "/app-system/{appName}/privileges/accepted": { + "get": { "tags": [ - "Authorization & Authentication" + "App System" ], - "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": "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": "Authorized successfully.", + "description": "A JSON object containing accepted privileges.", "content": { "application/json": { "schema": { - "required": [ - "token_type", - "expires_in", - "access_token" - ], + "type": "object", "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" + "privileges": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } } - }, - "type": "object" + } + }, + "example": { + "privileges": { + "customer:read": true, + "order:read": true + } } } } }, "400": { - "$ref": "#/components/responses/400" + "description": "Malformed request." + }, + "401": { + "description": "Unauthorized Access." + }, + "403": { + "description": "Forbidden. Not a valid integration source." + }, + "404": { + "description": "App not found." } } } }, - "/oauth/sso/config": { - "get": { + "/app-system/{appName}/privileges": { + "patch": { "tags": [ - "Experimental", - "SSO Login configuration" + "App System" ], - "summary": "Experimental: Loads SSO login configuration.", - "description": "Experimental: Loads the SSO login configuration to configure the forward to the Shopware SSO login page.", - "responses": { - "200": { - "description": "Experimental: Returns the configuration for the SSO login page forward.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "useDefault": { - "description": "Experimental: Indicates which login is used. Default or SSO.", - "type": "boolean" - }, - "url": { - "description": "Experimental: Contains the return url for the Shopware SSO login.", + "summary": "Accept or revoke privileges for an app", + "description": "Accepts or revokes specified privileges for the given app.", + "operationId": "managePrivileges", + "parameters": [ + { + "name": "appName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "accept": { + "type": "array", + "items": { + "type": "string" + } + }, + "revoke": { + "type": "array", + "items": { "type": "string" } } } + }, + "example": { + "accept": [ + "customer:read", + "order:read" + ], + "revoke": [ + "product:write" + ] } } } }, - "operationId": "loadSsoLoginConfig" + "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" + ] + } + ] } }, - "/oauth/sso/code": { + "/app-system/shop/verify": { "get": { "tags": [ - "Experimental", - "SSO Login callback" + "App System", + "Public" ], - "summary": "Experimental: Callback for SSO login", - "description": "Experimental: Logs in the user into the Shopware shop and forwards to the admin", - "responses": { - "200": { - "description": "Authorisation process continues", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } + "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" } }, - "302": { - "description": "Experimental: Forwards to the Shopware admin" + { + "name": "token", + "in": "query", + "description": "A unique identifier", + "required": true, + "schema": { + "type": "string" + } } - }, - "operationId": "callBackWithCode" - } - }, - "/_action/scheduled-task/run": { - "post": { - "tags": [ - "System Operations" ], - "summary": "Run scheduled tasks.", - "description": "Starts the scheduled task worker to handle the next scheduled tasks.", - "operationId": "runScheduledTasks", "responses": { - "200": { - "description": "Returns a success message indicating a successful run.", - "content": { - "application/json": { - "schema": { - "properties": { - "message": { - "description": "Success message", - "type": "string" - } - }, - "type": "object" - } - } - } + "204": { + "description": "An empty response signalling successful verification." + }, + "400": { + "description": "Malformed request or unsuccessful verification." } } } }, - "/_action/scheduled-task/min-run-interval": { - "get": { + "/_action/order/{orderId}/order-address": { + "post": { "tags": [ - "System Operations" + "Order address" ], - "summary": "Get the minimum schedules task interval", - "description": "Fetches the smallest interval that a scheduled task uses.", - "operationId": "getMinRunInterval", - "responses": { - "200": { - "description": "Returns the minimum interval.", - "content": { - "application/json": { - "schema": { - "properties": { - "minRunInterval": { - "description": "Minimal interval in seconds.", - "type": "string" - } - }, - "type": "object" + "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}$" + } + } + ], + "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." } } } }, - "/_action/order_transaction/{orderTransactionId}/state/{transition}": { + "/_action/order_delivery/{orderDeliveryId}/state/{transition}": { "post": { "tags": [ "Order Management" ], - "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": "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": "orderTransactionId", + "name": "orderDeliveryId", "in": "path", - "description": "Identifier of the order transaction.", + "description": "Identifier of the order delivery.", "required": true, "schema": { "type": "string", @@ -77657,7 +77616,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 that is not available, you will get an error that lists possible transitions for the current 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 which is not possible, you will get an error that lists possible transition for the actual state.", "required": true, "schema": { "type": "string" @@ -77671,7 +77630,7 @@ "schema": { "properties": { "sendMail": { - "description": "Controls if a mail should be sent to the customer." + "description": "Controls if a mail should be send to the customer." }, "documentIds": { "description": "A list of document identifiers that should be attached", @@ -77690,7 +77649,7 @@ } }, "stateFieldName": { - "description": "This is the state column within the order transaction database table. There should be no need to change it from the default.", + "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", "default": "stateId" }, @@ -77706,322 +77665,189 @@ }, "responses": { "200": { - "description": "Returns information about the transition that was made. `#/components/schemas/StateMachineTransition`" + "description": "Todo: Use ref of `state_machine_transition` here" } } } }, - "/_info/openapi3.json": { + "/_action/state-machine/{entityName}/{entityId}/state": { "get": { "tags": [ - "System Info & Health Check" + "State Machine" ], - "summary": "Get OpenAPI Specification", - "description": "Get information about the admin API in OpenAPI format.", - "operationId": "api-info", + "summary": "Get available transitions for an entity", + "description": "Retrieves the available state transitions for the specified entity.", + "operationId": "getEntityState", "parameters": [ { - "name": "type", - "in": "query", - "description": "Type of the api", + "name": "entityName", + "in": "path", + "description": "Name of the entity.", + "required": true, "schema": { - "type": "string", - "enum": [ - "jsonapi", - "json" - ] + "type": "string" } - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/OpenApi3" - } - } - } - }, - "/_action/order_transaction_capture_refund/{refundId}": { - "post": { - "tags": [ - "Order Management" - ], - "summary": "Refund an order transaction capture", - "description": "Refunds an order transaction capture.", - "operationId": "orderTransactionCaptureRefund", - "parameters": [ + }, { - "name": "refundId", + "name": "entityId", "in": "path", - "description": "Identifier of the order transaction capture refund.", + "description": "Identifier of the entity.", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-f]{32}$" } - } - ], - "responses": { - "204": { - "description": "Refund was successful" - }, - "400": { - "description": "Something went wrong, while processing the refund" }, - "404": { - "description": "Refund with id not found" - } - } - } - }, - "/_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/index": { - "post": { - "tags": [ - "System Operations" - ], - "summary": "Run indexer", - "description": "Runs all registered indexer in the shop asynchronously.", - "operationId": "index", - "requestBody": { - "content": { - "application/json": { - "schema": { - "properties": { - "skip": { - "description": "Array of indexers/updaters to be skipped.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "type": "object" - } - } - } - }, - "responses": { - "204": { - "description": "Returns a no content response indicating that the indexing progress startet." - } - } - } - }, - "/_action/cache": { - "delete": { - "tags": [ - "System Operations" - ], - "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", + "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, - "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 + "type": "string", + "default": "stateId" } } ], - "responses": { - "204": { - "description": "Returns a no content response indicating that the cache has been cleared." - } - } - } - }, - "/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": { - "tags": [ - "Experimental", - "Is SSO environment" - ], - "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": "Experimental: Returns if it is a SSO environment or not" - } - } - } - }, - "/_action/sso/invite-user": { - "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" - } - } - } - }, - "/_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.", + "description": "Available transitions for the current state.", "content": { "application/json": { "schema": { + "type": "object", "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" + "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" + ] + } } }, - "type": "object" + "required": [ + "transitions" + ] } } } + }, + "400": { + "description": "Unable to read the entity or entity field." + }, + "403": { + "description": "Forbidden. Missing privileges to access the entity." } } } }, - "/_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 - } - ] - } - } - } - } - } - }, - "/_info/version": { - "get": { + "/_action/state-machine/{entityName}/{entityId}/state/{transition}": { + "post": { "tags": [ - "System Info & Health Check" + "State Machine" ], - "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" - } - }, - "type": "object" + "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." + } } } }, @@ -78047,578 +77873,699 @@ } } }, - "/_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": "Returns a list of about the business events.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/businessEventsResponse" - } - } - } - } - } - } - }, - "/_info/routes": { - "get": { - "summary": "Get API routes", - "operationId": "getRoutes", + "/_action/cleanup": { + "delete": { "tags": [ - "System Info & Health Check" + "System Operations" ], + "summary": "Clear old cache folders", + "description": "Removes cache folders that are not needed anymore.", + "operationId": "clearOldCacheFolders", "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" - } - } - } - } - } - } - } - } + "204": { + "description": "Returns a no content response indicating that the cleanup finished." } } } }, - "/_info/health-check": { - "get": { + "/_action/index-products": { + "post": { "tags": [ - "System Info & Health Check" + "System Operations" ], - "summary": "Check that the Application is running", - "operationId": "healthCheck", + "summary": "Send product indexing message", + "description": "Dispatches a product indexing message to the message bus, with the provided ids", + "operationId": "productIndexing", "responses": { - "200": { - "description": "Returns empty response" - }, - "500": { - "description": "Application is not working properly" + "204": { + "description": "Returns an empty response indicating that the message dispatched." } } } }, - "/_info/system-health-check": { - "get": { + "/_action/mail-template/send": { + "post": { "tags": [ - "System Info & Health Check" + "Mail Operations" ], - "summary": "Perform a detailed system health check", - "operationId": "systemHealthCheck", - "parameters": [ - { - "name": "verbose", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "default": false - }, - "description": "Include detailed information in the response" + "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": { + "required": [ + "recipients", + "salesChannelId", + "contentHtml", + "contentPlain", + "subject", + "senderName" + ], + "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" + }, + "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" + }, + "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": "Returns the system health check results", + "description": "The mail was sent successful", "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 - } - } - } - } + "size": { + "description": "Length of the email message", + "type": "integer" } - } + }, + "type": "object" } } } - }, - "500": { - "description": "Application is not working properly" } } } }, - "/_action/index-products": { + "/_action/mail-template/validate": { "post": { "tags": [ - "System Operations" + "Mail Operations" ], - "summary": "Send product indexing message", - "description": "Dispatches a product indexing message to the message bus, with the provided ids", - "operationId": "productIndexing", + "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" + } + } + } + }, "responses": { "204": { - "description": "Returns an empty response indicating that the message dispatched." + "description": "Returns a no content response indicating the mail content was rendered successfully." } } } }, - "/_action/increment/{pool}": { + "/_action/mail-template/build": { "post": { "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" - } - } + "Mail Operations" ], + "summary": "Preview a mail template", + "description": "Generates a preview of a mail template.", + "operationId": "build", "requestBody": { "required": true, "content": { "application/json": { "schema": { - "type": "object", "required": [ - "key" + "mailTemplateType", + "mailTemplate" ], "properties": { - "key": { - "type": "string", - "description": "The key to increment in the pool." + "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" } - } + }, + "type": "object" } } } }, "responses": { "200": { - "description": "Successfully incremented the value", + "description": "The rendered preview of the mail template.", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "example": true - } - } + "type": "string" } } } - }, - "400": { - "description": "Bad request - key parameter missing or cluster parameter missing" } } - }, + } + }, + "/_action/system-config": { "get": { "tags": [ - "Increment Storage" + "System Config" ], - "summary": "List increment values from pool", - "description": "Retrieves a list of increment values from the specified pool with pagination support.", - "operationId": "getIncrementValues", + "summary": "Get configuration values", + "description": "Returns the configuration values for the given domain and optional sales channel.", + "operationId": "getConfigurationValues", "parameters": [ { - "name": "pool", - "in": "path", - "description": "The name of the increment pool to list values from.", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "cluster", + "name": "domain", "in": "query", - "description": "Cluster identifier for the increment operation.", + "description": "The configuration domain.", "required": true, "schema": { "type": "string" } }, { - "name": "limit", + "name": "salesChannelId", "in": "query", - "description": "Maximum number of items to return.", - "required": false, + "description": "The sales channel ID to scope the configuration to.", "schema": { - "type": "integer", - "default": 5, - "minimum": 1 + "type": "string" } }, { - "name": "offset", + "name": "inherit", "in": "query", - "description": "Number of items to skip for pagination.", - "required": false, + "description": "Whether to include inherited (global) values.", "schema": { - "type": "integer", - "default": 0, - "minimum": 0 + "type": "boolean", + "default": false } } ], "responses": { "200": { - "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" + "description": "Returns the configuration values as a key-value object." } } - } - }, - "/_action/decrement/{pool}": { + }, "post": { "tags": [ - "Increment Storage" + "System Config" ], - "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": "Save configuration values", + "description": "Saves the given configuration key-value pairs for the given sales channel.", + "operationId": "saveConfiguration", "parameters": [ { - "name": "pool", - "in": "path", - "description": "The name of the increment pool.", - "required": true, + "name": "salesChannelId", + "in": "query", + "description": "The sales channel ID to scope the configuration to.", "schema": { "type": "string" } }, { - "name": "cluster", + "name": "silent", "in": "query", - "description": "Optional cluster identifier for the decrement operation.", - "required": false, + "description": "If true, the HTTP cache will not be invalidated. Use this for internal configuration values that do not affect the storefront.", "schema": { - "type": "string" + "type": "boolean", + "default": false } } ], "requestBody": { + "description": "Key-value pairs of configuration values to save.", "required": true, "content": { "application/json": { "schema": { "type": "object", - "required": [ - "key" - ], - "properties": { - "key": { - "type": "string", - "description": "The key to decrement in the pool." - } - } + "additionalProperties": true } } } }, "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" + "204": { + "description": "Configuration saved successfully." } } } }, - "/_action/reset-increment/{pool}": { - "post": { + "/_action/system-config/check": { + "get": { "tags": [ - "Increment Storage" + "System Config" ], - "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", + "summary": "Check configuration", + "description": "Checks if a configuration domain exists.", + "operationId": "checkConfiguration", "parameters": [ { - "name": "pool", - "in": "path", - "description": "The name of the increment pool to reset.", + "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": "cluster", + "name": "domain", "in": "query", - "description": "Cluster identifier for the reset operation.", + "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": { - "required": false, + "description": "Object keyed by sales channel ID, each containing key-value pairs of configuration values.", + "required": true, "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." - } + "additionalProperties": { + "type": "object", + "additionalProperties": true } } } } }, + "responses": { + "204": { + "description": "Configuration saved successfully." + } + } + } + }, + "/_action/user/logout": { + "post": { + "tags": [ + "Authorization & Authentication" + ], + "summary": "Logout the current user", + "description": "Revokes all server-side refresh tokens for the currently authenticated administration user and returns a no content response.", + "operationId": "userLogout", + "responses": { + "204": { + "description": "Tokens have been revoked successfully." + }, + "401": { + "description": "Unauthorized - the access token is missing or invalid." + }, + "403": { + "description": "The authenticated source does not have a user ID associated." + } + } + } + }, + "/_action/cache_info": { + "get": { + "tags": [ + "System Operations" + ], + "summary": "Get cache information", + "description": "Get information about the cache configuration", + "operationId": "info", "responses": { "200": { - "description": "Successfully reset the increment values", + "description": "Information about the cache state.", "content": { "application/json": { "schema": { - "type": "object", "properties": { - "success": { - "type": "boolean", - "example": true + "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" } } } - }, - "400": { - "description": "Bad request - cluster parameter missing" } } } }, - "/_action/delete-increment/{pool}": { - "delete": { + "/_action/validation/email": { + "post": { "tags": [ - "Increment Storage" - ], - "summary": "Delete increment keys from pool", - "description": "Deletes specific increment keys from the specified pool.", - "operationId": "deleteIncrementKeys", - "parameters": [ - { - "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": "Cluster identifier for the delete operation.", - "required": true, - "schema": { - "type": "string" - } - } + "Email support validation" ], + "summary": "Email support.", + "description": "Checks a given email string.", + "operationId": "supportsEmail", "requestBody": { "required": true, "content": { "application/json": { "schema": { - "type": "object", "required": [ - "keys" + "email" ], "properties": { - "keys": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Array of keys to delete from the pool." + "email": { + "description": "The email to be verified.", + "type": "string" } - } + }, + "type": "object" } } } }, "responses": { "204": { - "description": "Successfully deleted the increment keys" + "description": "Email is supported" }, "400": { - "description": "Bad request - invalid keys parameter or cluster parameter missing" + "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.", + "content": { + "application/json": { + "schema": { + "properties": { + "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." + } + ] + } + } + } } } } }, - "/_action/container_cache": { - "delete": { + "/_action/indexing": { + "post": { "tags": [ "System Operations" ], - "summary": "Clear container caches", - "description": "The container cache is immediately cleared synchronously.", - "operationId": "clearContainerCache", + "summary": "Run indexer", + "description": "Runs all registered indexer in the shop asynchronously.", + "operationId": "indexing", "responses": { - "204": { - "description": "Returns a no content response indicating that the container cache is cleared." + "200": { + "description": "Returns an empty response indicating that the indexing process started." } } } }, - "/_action/document/{documentId}/{deepLinkCode}": { - "get": { + "/_action/indexing/{indexer}": { + "post": { "tags": [ - "Document Management" + "System Operations" ], - "summary": "Download a document", - "description": "Download a document by its identifier and deep link code.", - "operationId": "downloadDocument", + "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": "documentId", + "name": "indexer", "in": "path", - "description": "Identifier of the document to be downloaded.", + "description": "Name of the indexer to iterate.", "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", - "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 - } } ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "offset": { + "description": "The offset for the iteration.", + "type": "integer" + } + }, + "type": "object" + } + } + } + }, "responses": { "200": { - "description": "The document.", + "description": "Returns information about the iteration.", "content": { - "application/octet-stream": { + "application/json": { "schema": { - "type": "string", - "format": "binary" + "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" } } } @@ -78626,82 +78573,52 @@ } } }, - "/_action/document/{documentId}/upload": { - "post": { + "/_info/openapi3.json": { + "get": { "tags": [ - "Document Management" + "System Info & Health Check" ], - "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 OpenAPI Specification", + "description": "Get information about the admin API in OpenAPI format.", + "operationId": "api-info", "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", + "name": "type", "in": "query", - "description": "Extension of the uploaded file. For example `pdf`", - "required": true, + "description": "Type of the api", "schema": { - "type": "string" + "type": "string", + "enum": [ + "jsonapi", + "json" + ] } } ], - "requestBody": { - "content": { - "application/octet-stream": { - "schema": { - "type": "string", - "format": "binary" - } - }, - "application/json": { - "schema": { - "required": [ - "url" - ], - "properties": { - "url": { - "description": "The url of the document that will be downloaded.", - "type": "string" - } - }, - "type": "object" - } - } + "responses": { + "200": { + "$ref": "#/components/responses/OpenApi3" } - }, + } + } + }, + "/_info/version": { + "get": { + "tags": [ + "System Info & Health Check" + ], + "summary": "Get the Shopware version", + "description": "Get the version of the Shopware instance", + "operationId": "infoShopwareVersion", "responses": { "200": { - "description": "Document uploaded successful", + "description": "Returns the version of the Shopware instance.", "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.", + "version": { + "description": "The Shopware version.", "type": "string" } }, @@ -78773,92 +78690,106 @@ } } }, - "/consents": { - "get": { + "/_action/order/document/download": { + "post": { "tags": [ - "Consent Management", - "Experimental" + "Document Management" ], - "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", + "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": "List of consents with their status", + "description": "The documents.", "content": { - "application/json": { + "application/octet-stream": { "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", - "acceptedUntil": "2024-01-15T10:20:30Z", - "acceptedRevision": "2026-02-01", - "latestRevision": "2026-02-01" - }, - "backend_data": { - "name": "backend_data", - "scopeName": "system", - "identifier": "system", - "status": "unset", - "actor": null, - "updatedAt": null, - "acceptedUntil": null, - "acceptedRevision": null, - "latestRevision": null - } - } + "type": "string", + "format": "binary" } } } - }, - "401": { - "description": "Unauthorized - User not logged in or invalid session" } } } }, - "/consents/accept": { + "/_action/order/document/{documentTypeName}/create": { "post": { "tags": [ - "Consent Management", - "Experimental" + "Document Management" + ], + "summary": "Create documents for orders", + "description": "Creates documents for orders. Documents can for example be an invoice or a delivery note.", + "operationId": "createDocuments", + "parameters": [ + { + "name": "documentTypeName", + "in": "path", + "description": "The type of document to create", + "required": true, + "schema": { + "type": "string" + } + } ], - "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": { + "description": "test", + "required": true, "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "consent": { - "type": "string", - "description": "The name of the consent to accept" - }, - "revision": { - "type": [ - "string", - "null" - ], - "description": "Optional accepted revision. Only the consent definition's latest revision is accepted. When omitted, the latest revision is used automatically." + "type": "array", + "items": { + "type": "object", + "required": [ + "orderId", + "type" + ], + "properties": { + "orderId": { + "description": "Identifier of the order.", + "type": "string", + "pattern": "^[0-9a-f]{32}$" + }, + "type": { + "description": "Type of the document to be generated.", + "type": "string" + }, + "fileType": { + "description": "Type of document file to be generated.", + "type": "string", + "default": "pdf" + }, + "static": { + "description": "Indicate if the document should be static or not.", + "type": "boolean", + "default": false + }, + "referencedDocumentId": { + "description": "Identifier of the reverenced document.", + "type": "string", + "default": "null", + "pattern": "^[0-9a-f]{32}$" + }, + "config": { + "description": "Document specific configuration, like documentNumber, documentDate, documentComment.", + "type": "object" + } } - }, - "required": [ - "consent" - ], - "example": { - "consent": "product_analytics", - "revision": "2026-02-01" } } } @@ -78866,101 +78797,106 @@ }, "responses": { "200": { - "description": "Consent status changed successfully. Returns the updated consent status.", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConsentState" - } - } - } - }, - "400": { - "description": "Bad request - Consent revision is invalid for current acceptance" - }, - "404": { - "description": "Bad request - Consent not found or consent property was empty" - }, - "401": { - "description": "Unauthorized - User not logged in or invalid session" + "description": "Documents created successfully. The `api/_action/order/document/create` route can be used to download the document." } } } }, - "/consents/revoke": { + "/_action/order/{orderId}/state/{transition}": { "post": { "tags": [ - "Consent Management", - "Experimental" + "Order Management" + ], + "summary": "Transition an order to a new state", + "description": "Changes the order state and informs the customer via email if configured.", + "operationId": "orderStateTransition", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "Identifier of the order.", + "required": true, + "schema": { + "type": "string", + "pattern": "^[0-9a-f]{32}$" + } + }, + { + "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, + "schema": { + "type": "string" + } + } ], - "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": { + "required": false, "content": { "application/json": { "schema": { - "type": "object", "properties": { - "consent": { + "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": "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 database table. There should be no need to change it from the default.", "type": "string", - "description": "The name of the consent to accept" + "default": "stateId" + }, + "internalComment": { + "description": "An optional internal comment that will be saved with the state transition.", + "type": "string" } }, - "required": [ - "consent" - ], - "example": { - "consent": "product_analytics" - } + "type": "object" } } } }, "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" + "description": "Todo: Use ref of `state_machine_transition` here" } } } }, - "/_proxy/generate-imitate-customer-token": { + "/_action/message-queue/consume": { "post": { "tags": [ - "Customer impersonation" + "System Operations" ], - "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", + "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": true, "content": { "application/json": { "schema": { "required": [ - "customerId", - "salesChannelId" + "receiver" ], "properties": { - "customerId": { - "description": "ID of the customer", - "type": "string" - }, - "salesChannelId": { - "description": "ID of the sales channel", + "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" } }, @@ -78971,14 +78907,14 @@ }, "responses": { "200": { - "description": "The generated customer impersonation token.", + "description": "Returns information about handled messages", "content": { "application/json": { "schema": { "properties": { - "token": { - "description": "The generated customer impersonation token", - "type": "string" + "handledMessages": { + "description": "The number of messages processed.", + "type": "integer" } }, "type": "object" @@ -78989,6 +78925,70 @@ } } }, + "/_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" + } + } + } + } + } + } + } + } + } + } + } + } + } + }, "/_action/theme/{themeId}": { "patch": { "tags": [ @@ -107834,6 +107834,9 @@ "$ref": "#/components/schemas/Price" } }, + "customFields": { + "type": "object" + }, "quantityStart": { "description": "Starting range of quantity of an item.", "type": "integer", @@ -107844,9 +107847,6 @@ "type": "integer", "format": "int64" }, - "customFields": { - "type": "object" - }, "createdAt": { "type": "string", "format": "date-time", @@ -107967,6 +107967,10 @@ }, "description": "Price of the Product." }, + "customFields": { + "type": "object", + "description": "Additional fields that offer a possibility to add own fields for the different program-areas." + }, "quantityStart": { "description": "Starting range of quantity of an item.", "type": "integer", @@ -107977,10 +107981,6 @@ "type": "integer", "format": "int64" }, - "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", @@ -122406,111 +122406,6 @@ }, "type": "object" }, - "ConsentState": { - "type": "object", - "required": [ - "name", - "scopeName", - "identifier", - "status", - "actor", - "updatedAt", - "acceptedUntil" - ], - "properties": { - "name": { - "type": "string", - "description": "The name of the consent" - }, - "scopeName": { - "type": "string", - "description": "The scope of the consent that defines how the identifier is resolved" - }, - "identifier": { - "type": "string", - "description": "The resolved identifier of the consent" - }, - "status": { - "type": "string", - "enum": [ - "unset", - "accepted", - "revoked" - ], - "description": "The current status of the consent (requested, accepted, revoked)" - }, - "actor": { - "type": [ - "string", - "null" - ], - "description": "The user name of the user who made the consent decision. null if never updated" - }, - "updatedAt": { - "type": [ - "string", - "null" - ], - "format": "date-time", - "description": "The timestamp of when the consent status was last updated. null if never updated" - }, - "acceptedUntil": { - "type": [ - "string", - "null" - ], - "format": "date-time", - "description": "The timestamp until when the consent is accepted. null if never accepted" - }, - "acceptedRevision": { - "type": [ - "string", - "null" - ], - "description": "The accepted consent revision. null unless the consent is currently accepted for a revision-aware consent." - }, - "latestRevision": { - "type": [ - "string", - "null" - ], - "description": "The current latest revision defined for the consent. null when the consent does not use revisions." - } - } - }, - "MediaId": { - "type": "string", - "pattern": "^[0-9a-f]{32}$", - "description": "Media entity ID" - }, - "ExternalThumbnail": { - "type": "object", - "description": "An external thumbnail URL with its dimensions. Used when a CDN provides pre-generated thumbnails alongside the main media file.", - "required": [ - "url", - "width", - "height" - ], - "properties": { - "url": { - "type": "string", - "description": "Absolute HTTP/HTTPS URL of the thumbnail", - "example": "https://cdn.example.com/image-200x200.jpg" - }, - "width": { - "type": "integer", - "exclusiveMinimum": 0, - "description": "Width of the thumbnail in pixels", - "example": 200 - }, - "height": { - "type": "integer", - "exclusiveMinimum": 0, - "description": "Height of the thumbnail in pixels", - "example": 200 - } - } - }, "infoConfigResponse": { "type": "object", "properties": { @@ -122729,6 +122624,215 @@ ], "additionalProperties": false }, + "MediaId": { + "type": "string", + "pattern": "^[0-9a-f]{32}$", + "description": "Media entity ID" + }, + "ExternalThumbnail": { + "type": "object", + "description": "An external thumbnail URL with its dimensions. Used when a CDN provides pre-generated thumbnails alongside the main media file.", + "required": [ + "url", + "width", + "height" + ], + "properties": { + "url": { + "type": "string", + "description": "Absolute HTTP/HTTPS URL of the thumbnail", + "example": "https://cdn.example.com/image-200x200.jpg" + }, + "width": { + "type": "integer", + "exclusiveMinimum": 0, + "description": "Width of the thumbnail in pixels", + "example": 200 + }, + "height": { + "type": "integer", + "exclusiveMinimum": 0, + "description": "Height of the thumbnail in pixels", + "example": 200 + } + } + }, + "MeasurementUnits": { + "type": "object", + "description": "Configuration of the measurement system", + "properties": { + "system": { + "type": "string", + "enum": [ + "metric", + "imperial" + ], + "default": "metric", + "description": "The measurement system used in the store. 'metric' for metric system, 'imperial' for imperial system." + }, + "units": { + "type": "object", + "description": "Units used in the measurement system.", + "properties": { + "length": { + "type": "string", + "enum": [ + "mm", + "cm", + "m", + "in", + "ft" + ], + "default": "mm", + "description": "Unit of length." + }, + "weight": { + "type": "string", + "enum": [ + "g", + "kg", + "oz", + "lb" + ], + "default": "kg", + "description": "Unit of weight." + } + } + } + } + }, + "Price": { + "type": "object", + "description": "Price object", + "properties": { + "currencyId": { + "description": "Unique identity of the associated currency.", + "type": "string", + "pattern": "^[0-9a-f]{32}$" + }, + "gross": { + "description": "Gross price for the associated currency.", + "type": "number" + }, + "net": { + "description": "Net price for the associated currency.", + "type": "number" + }, + "linked": { + "description": "Whether gross and net prices are linked through the tax configuration.", + "type": "boolean" + }, + "percentage": { + "description": "Discount percentage relative to the list price for the gross and net amounts. `null` when no list price is set.", + "type": [ + "object", + "null" + ], + "properties": { + "gross": { + "description": "Discount percentage relative to the gross list price.", + "type": "number" + }, + "net": { + "description": "Discount percentage relative to the net list price.", + "type": "number" + } + }, + "required": [ + "gross", + "net" + ] + }, + "listPrice": { + "description": "Reference list price for displaying discounts.", + "type": "object", + "properties": { + "currencyId": { + "description": "Unique identity of the associated currency.", + "type": "string", + "pattern": "^[0-9a-f]{32}$" + }, + "gross": { + "description": "Gross list price for the associated currency.", + "type": "number" + }, + "net": { + "description": "Net list price for the associated currency.", + "type": "number" + }, + "linked": { + "description": "Whether gross and net list prices are linked through the tax configuration.", + "type": "boolean" + } + }, + "required": [ + "gross", + "net", + "linked" + ] + }, + "regulationPrice": { + "description": "Reference price used for legal price disclosures.", + "type": "object", + "properties": { + "currencyId": { + "description": "Unique identity of the associated currency.", + "type": "string", + "pattern": "^[0-9a-f]{32}$" + }, + "gross": { + "description": "Gross regulation price for the associated currency.", + "type": "number" + }, + "net": { + "description": "Net regulation price for the associated currency.", + "type": "number" + }, + "linked": { + "description": "Whether gross and net regulation prices are linked through the tax configuration.", + "type": "boolean" + } + }, + "required": [ + "gross", + "net", + "linked" + ] + } + }, + "required": [ + "currencyId", + "gross", + "net", + "linked" + ] + }, + "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" + } + } + } + }, "businessEventsResponse": { "type": "array", "items": { @@ -122763,6 +122867,130 @@ } } }, + "OAuthScopes": { + "description": "OAuth scopes that should be requested.", + "type": "string", + "enum": [ + "write", + "user-verified", + "admin", + "write user-verified", + "write admin", + "user-verified admin", + "write user-verified admin" + ] + }, + "OAuthGrant": { + "type": "object", + "properties": { + "grant_type": { + "description": "OAuth grant type that should be requested. See [OAuth 2.0 grant](https://oauth2.thephpleague.com/authorization-server/which-grant/) for more information.", + "type": "string" + } + }, + "required": [ + "grant_type" + ], + "discriminator": { + "propertyName": "grant_type", + "mapping": { + "client_credentials": "#/components/schemas/OAuthClientCredentialsGrant", + "password": "#/components/schemas/OAuthPasswordGrant", + "refresh_token": "#/components/schemas/OAuthRefreshTokenGrant" + } + } + }, + "OAuthClientCredentialsGrant": { + "allOf": [ + { + "$ref": "#/components/schemas/OAuthGrant" + }, + { + "type": "object", + "properties": { + "client_id": { + "description": "OAuth client id.", + "type": "string" + }, + "client_secret": { + "description": "Password of the client that should be authenticated.", + "type": "string" + } + }, + "required": [ + "client_id", + "client_secret" + ] + } + ] + }, + "OAuthPasswordGrant": { + "allOf": [ + { + "$ref": "#/components/schemas/OAuthGrant" + }, + { + "type": "object", + "properties": { + "client_id": { + "description": "OAuth client id.", + "type": "string", + "enum": [ + "administration" + ] + }, + "scope": { + "$ref": "#/components/schemas/OAuthScopes" + }, + "username": { + "description": "Username of the user that should be authenticated.", + "type": "string" + }, + "password": { + "description": "Password of the user that should be authenticated.", + "type": "string" + } + }, + "required": [ + "client_id", + "scope", + "username", + "password" + ] + } + ] + }, + "OAuthRefreshTokenGrant": { + "allOf": [ + { + "$ref": "#/components/schemas/OAuthGrant" + }, + { + "type": "object", + "properties": { + "client_id": { + "description": "OAuth client id.", + "type": "string", + "enum": [ + "administration" + ] + }, + "scope": { + "$ref": "#/components/schemas/OAuthScopes" + }, + "refresh_token": { + "description": "The refresh token that should be used to refresh the access token.", + "type": "string" + } + }, + "required": [ + "client_id", + "scope", + "refresh_token" + ] + } + ] + }, "Criteria": { "type": "object", "description": "Criteria to query entities.", @@ -123483,281 +123711,77 @@ "field" ] }, - "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" - } - } - } - }, - "OAuthScopes": { - "description": "OAuth scopes that should be requested.", - "type": "string", - "enum": [ - "write", - "user-verified", - "admin", - "write user-verified", - "write admin", - "user-verified admin", - "write user-verified admin" - ] - }, - "OAuthGrant": { + "ConsentState": { "type": "object", - "properties": { - "grant_type": { - "description": "OAuth grant type that should be requested. See [OAuth 2.0 grant](https://oauth2.thephpleague.com/authorization-server/which-grant/) for more information.", - "type": "string" - } - }, "required": [ - "grant_type" + "name", + "scopeName", + "identifier", + "status", + "actor", + "updatedAt", + "acceptedUntil" ], - "discriminator": { - "propertyName": "grant_type", - "mapping": { - "client_credentials": "#/components/schemas/OAuthClientCredentialsGrant", - "password": "#/components/schemas/OAuthPasswordGrant", - "refresh_token": "#/components/schemas/OAuthRefreshTokenGrant" - } - } - }, - "OAuthClientCredentialsGrant": { - "allOf": [ - { - "$ref": "#/components/schemas/OAuthGrant" + "properties": { + "name": { + "type": "string", + "description": "The name of the consent" }, - { - "type": "object", - "properties": { - "client_id": { - "description": "OAuth client id.", - "type": "string" - }, - "client_secret": { - "description": "Password of the client that should be authenticated.", - "type": "string" - } - }, - "required": [ - "client_id", - "client_secret" - ] - } - ] - }, - "OAuthPasswordGrant": { - "allOf": [ - { - "$ref": "#/components/schemas/OAuthGrant" + "scopeName": { + "type": "string", + "description": "The scope of the consent that defines how the identifier is resolved" }, - { - "type": "object", - "properties": { - "client_id": { - "description": "OAuth client id.", - "type": "string", - "enum": [ - "administration" - ] - }, - "scope": { - "$ref": "#/components/schemas/OAuthScopes" - }, - "username": { - "description": "Username of the user that should be authenticated.", - "type": "string" - }, - "password": { - "description": "Password of the user that should be authenticated.", - "type": "string" - } - }, - "required": [ - "client_id", - "scope", - "username", - "password" - ] - } - ] - }, - "OAuthRefreshTokenGrant": { - "allOf": [ - { - "$ref": "#/components/schemas/OAuthGrant" + "identifier": { + "type": "string", + "description": "The resolved identifier of the consent" }, - { - "type": "object", - "properties": { - "client_id": { - "description": "OAuth client id.", - "type": "string", - "enum": [ - "administration" - ] - }, - "scope": { - "$ref": "#/components/schemas/OAuthScopes" - }, - "refresh_token": { - "description": "The refresh token that should be used to refresh the access token.", - "type": "string" - } - }, - "required": [ - "client_id", - "scope", - "refresh_token" - ] - } - ] - }, - "MeasurementUnits": { - "type": "object", - "description": "Configuration of the measurement system", - "properties": { - "system": { + "status": { "type": "string", "enum": [ - "metric", - "imperial" + "unset", + "accepted", + "revoked" ], - "default": "metric", - "description": "The measurement system used in the store. 'metric' for metric system, 'imperial' for imperial system." - }, - "units": { - "type": "object", - "description": "Units used in the measurement system.", - "properties": { - "length": { - "type": "string", - "enum": [ - "mm", - "cm", - "m", - "in", - "ft" - ], - "default": "mm", - "description": "Unit of length." - }, - "weight": { - "type": "string", - "enum": [ - "g", - "kg", - "oz", - "lb" - ], - "default": "kg", - "description": "Unit of weight." - } - } - } - } - }, - "Price": { - "type": "object", - "description": "Price object", - "properties": { - "currencyId": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" + "description": "The current status of the consent (requested, accepted, revoked)" }, - "gross": { - "description": "", - "type": "number" + "actor": { + "type": [ + "string", + "null" + ], + "description": "The user name of the user who made the consent decision. null if never updated" }, - "net": { - "description": "", - "type": "number" + "updatedAt": { + "type": [ + "string", + "null" + ], + "format": "date-time", + "description": "The timestamp of when the consent status was last updated. null if never updated" }, - "linked": { - "description": "", - "type": "boolean" + "acceptedUntil": { + "type": [ + "string", + "null" + ], + "format": "date-time", + "description": "The timestamp until when the consent is accepted. null if never accepted" }, - "listPrice": { - "description": "", - "type": "object", - "properties": { - "currencyId": { - "type": "string", - "pattern": "^[0-9a-f]{32}$" - }, - "gross": { - "description": "", - "type": "number" - }, - "net": { - "description": "", - "type": "number" - }, - "linked": { - "description": "", - "type": "boolean" - } - }, - "required": [ - "gross", - "net", - "linked" - ] + "acceptedRevision": { + "type": [ + "string", + "null" + ], + "description": "The accepted consent revision. null unless the consent is currently accepted for a revision-aware consent." }, - "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" - } - }, - "required": [ - "gross", - "net", - "linked" - ] + "latestRevision": { + "type": [ + "string", + "null" + ], + "description": "The current latest revision defined for the consent. null when the consent does not use revisions." } - }, - "required": [ - "currencyId", - "gross", - "net", - "linked" - ] + } }, "Cart": { "properties": {