{"openapi":"3.0.1","info":{"title":"dotCMS REST API","version":"3"},"servers":[{"url":"/","description":"dotCMS Server"}],"tags":[{"name":"AI","description":"AI-powered content generation and analysis endpoints"},{"name":"dotAuth","description":"OAuth/OIDC and SAML authentication: per-site configuration (SYSTEM_HOST is the global default) and headless OIDC token exchange"},{"name":"JavaScript","description":"JavaScript execution and server-side scripting"},{"name":"Bundle","description":"Content bundle management and deployment"},{"name":"Content Delivery","description":"Content retrieval and manipulation endpoints"},{"name":"Data Integrity","description":"Data integrity checking and conflict resolution"},{"name":"Content Type","description":"Content type definitions and schema management"},{"name":"Tag (v1)","description":"Legacy tag management endpoints (deprecated - use v2 TagResource instead)"},{"name":"Accessibility Agent","description":"Streaming a11y-fix agent proxy"},{"name":"Accessibility Checker","description":"Endpoints that perform operations related to validating accessibility in content."},{"name":"Content Analytics","description":"Proxy endpoints that forward analytics requests to the dot-ca-event-manager service."},{"name":"Announcements","description":"System announcements and notifications"},{"name":"Apps","description":"Third-party application integration and configuration"},{"name":"Authentication","externalDocs":{"description":"Additional Authentication API information","url":"https://www.dotcms.com/docs/latest/rest-api-authentication"}},{"name":"Browser Tree","description":"File and folder browser tree operations"},{"name":"System Configuration","description":"System configuration and company settings"},{"name":"Containers","description":"Endpoints for managing Container objects and their content"},{"name":"Content","description":"Endpoints for managing content and contentlets - the core data objects in dotCMS"},{"name":"getPagesContentTypes","description":"Returns the content types valid for a page based on the container/types on the layout"},{"name":"Folders","description":"Endpoints for managing folder structure and organization"},{"name":"Forms","description":"Form management and processing"},{"name":"Health","description":"Health management and monitoring endpoints for administrative dashboards"},{"name":"Search Index","description":"Elasticsearch index management and operations"},{"name":"Job Queue","description":"Endpoints for managing background jobs and job queues"},{"name":"Language","description":"Language configuration and management"},{"name":"Maintenance","description":"System maintenance and administration operations"},{"name":"Navigation","description":"Site navigation tree endpoints"},{"name":"Page","description":"Page rendering, layout management, and content operations","externalDocs":{"description":"Additional Page API information","url":"https://www.dotcms.com/docs/latest/page-rest-api-layout-as-a-service-laas"}},{"name":"Publishing","description":"Push publishing job management endpoints"},{"name":"Relationships","description":"Content relationship management"},{"name":"Site","description":"Site management, lifecycle, and configuration endpoints"},{"name":"Cache Management","description":"Cache provider management and operations"},{"name":"System Logging","description":"System logging configuration and management"},{"name":"System Monitoring","description":"System monitoring and health checks"},{"name":"Temporary Files","description":"Temporary file upload and management for content creation"},{"name":"Template","description":"Template CRUD, publish, archive, and layout management endpoints"},{"name":"Theme","description":"Theme browsing and management"},{"name":"Usage","description":"Provides business intelligence metrics for dashboard usage"},{"name":"Variants","description":"Endpoints for managing content variants"},{"name":"Templates","description":"Template design and management"},{"name":"Content Type Field","description":"Content type field definitions and configuration"},{"name":"Tags","description":"Content tagging and labeling"},{"name":"Administration","description":"System administration and management tools"},{"name":"API Token","description":"API token management and authentication","externalDocs":{"description":"Additional API token information","url":"https://www.dotcms.com/docs/latest/rest-api-authentication#APIToken"}},{"name":"Categories","description":"Content categorization and taxonomy"},{"name":"Cluster Management","description":"Cluster nodes and distributed system management"},{"name":"Content Report","description":"Content reporting and analytics"},{"name":"Environment","description":"Publishing environment management and configuration"},{"name":"Experiments","description":"A/B testing and experimentation management"},{"name":"File Assets","description":"File asset management and download operations"},{"name":"Internationalization","description":"Language management and localization"},{"name":"License","description":"License management and validation"},{"name":"Notifications","description":"User notifications and alerts management"},{"name":"OSGi Plugins","description":"OSGi plugin management and dynamic deployment"},{"name":"Permissions","description":"Permission management and access control"},{"name":"Personas","description":"Content persona management and targeting"},{"name":"Personalization","description":"Content personalization and persona management"},{"name":"Portlets","description":"Portlet management and administration"},{"name":"Push Publishing","description":"Remote content publishing and synchronization"},{"name":"Roles","description":"User role and permission management"},{"name":"Rules Engine","description":"Business rules and conditional logic management"},{"name":"SAML Authentication","description":"SAML SSO authentication and integration"},{"name":"Search","description":"Content search and query operations"},{"name":"Sites","description":"Multi-site management and configuration"},{"name":"System","description":"System-level operations and Redis management"},{"name":"System Storage","description":"Storage providers and data replication management"},{"name":"TailLog","description":"Server log file monitoring and real-time viewing"},{"name":"Testing","description":"Testing utilities and development endpoints"},{"name":"Themes","description":"Theme design and management"},{"name":"Tool Groups","description":"Administrative tool group management"},{"name":"Users","description":"User account management and administration"},{"name":"Versionables","description":"Version control and content archiving"},{"name":"VTL","description":"Velocity Template Language execution and rendering"},{"name":"Web Assets","description":"Web asset management and operations"},{"name":"Widgets","description":"Widget development and rendering"},{"name":"Workflow","description":"Endpoints that perform operations related to workflows.","externalDocs":{"description":"Additional Workflow API information","url":"https://www.dotcms.com/docs/latest/workflow-rest-api"}},{"name":"Elasticsearch Content Search","description":"Backend Elasticsearch search endpoints for portlet context"}],"paths":{"/api/v1/ai/providers":{"get":{"tags":["AI"],"summary":"List dotAI provider configuration metadata","description":"Returns, for every registered dotAI provider, the capabilities it supports (chat/embeddings/image) and the providerConfig fields each supported capability requires or accepts.","operationId":"listAiProviders","responses":{"200":{"description":"Provider metadata retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityAiProviderListView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}}}}},"/api/v1/ai/providers/test/{capability}":{"post":{"tags":["AI"],"summary":"Test a dotAI provider connection","description":"Builds the provider client for the given capability from the posted configuration and issues one minimal real request against the provider (a short chat reply, a one-line embedding, or a single test image). Masked credential fields (\"*****\") in the posted config are resolved against the real value already stored for siteId before testing. Returns success=false with a message on any validation or provider error rather than an HTTP error status, so the caller can always render the result.","operationId":"testAiProviderConnection","parameters":[{"name":"capability","in":"path","required":true,"schema":{"type":"string"}},{"name":"siteId","in":"query","schema":{"type":"string"}}],"requestBody":{"description":"Provider config section to test","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Test executed — check the success field for the outcome","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityAiTestConnectionView"}}}},"400":{"description":"Unknown capability or malformed request body","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - requires CMS admin, or access denied to site","content":{"application/json":{}}}}}},"/api/v1/ai/completions/config":{"get":{"tags":["AI"],"summary":"Get AI service configuration","description":"Retrieves the current AI service configuration. Accepts an optional siteId query parameter (site identifier / UUID, or the literal SYSTEM_HOST). Hostname values are not supported — use the site identifier. When siteId is omitted or cannot be resolved, falls back to the site derived from the HTTP Host header.","operationId":"getAiConfig","parameters":[{"name":"siteId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration retrieved successfully","content":{"application/json":{"schema":{"type":"string"}}}},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks permission for the requested site"},"500":{"description":"Internal server error"}}},"put":{"tags":["AI"],"summary":"Save AI provider configuration","description":"Saves the providerConfig JSON for the target site. Accepts an optional siteId query parameter (site identifier / UUID, or the literal SYSTEM_HOST). Hostname values are not supported — use the site identifier. When siteId is omitted, saves to the site derived from the HTTP Host header. An unresolvable siteId returns 400. Credential fields set to \"*****\" are preserved from the existing stored configuration. Requires CMS admin.","operationId":"saveAiConfig","parameters":[{"name":"siteId","in":"query","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Configuration saved successfully"},"400":{"description":"Missing or invalid request body, or site not found"},"403":{"description":"Forbidden - requires CMS admin or access denied to site"},"500":{"description":"Internal server error"}}}},"/api/v1/ai/completions/rawPrompt":{"post":{"tags":["AI"],"summary":"Generate AI completions from raw prompt","description":"Processes raw prompts directly through the AI service without content preprocessing. Supports both streaming and non-streaming responses.","operationId":"rawPrompt","requestBody":{"description":"Completion form with raw prompt and configuration","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CompletionsForm"}}}},"responses":{"200":{"description":"Raw completion generated successfully","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request - Missing or invalid prompt"},"401":{"description":"Unauthorized - User not authenticated"},"500":{"description":"Internal server error"}}}},"/api/v1/ai/completions":{"post":{"tags":["AI"],"summary":"Generate AI completions from content","description":"Creates AI-powered content summaries and completions based on provided prompts. Supports both streaming and non-streaming responses.","operationId":"summarizeFromContent","requestBody":{"description":"Completion form with prompt and configuration","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CompletionsForm"}}}},"responses":{"200":{"description":"Completion generated successfully","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request - Missing or invalid prompt"},"401":{"description":"Unauthorized - User not authenticated"},"500":{"description":"Internal server error"}}}},"/api/v1/ai/embeddings/count":{"get":{"tags":["AI"],"operationId":"count_1","parameters":[{"name":"site","in":"query","schema":{"type":"string"}},{"name":"contentType","in":"query","schema":{"type":"string"}},{"name":"indexName","in":"query","schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}},{"name":"identifier","in":"query","schema":{"type":"string"}},{"name":"inode","in":"query","schema":{"type":"string"}},{"name":"fieldVar","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}},"post":{"tags":["AI"],"operationId":"count","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/CompletionsForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/embeddings":{"post":{"tags":["AI"],"operationId":"embed","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/EmbeddingsForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}},"delete":{"tags":["AI"],"operationId":"delete","requestBody":{"content":{"*/*":{"schema":{"type":"object","properties":{"asMap":{"type":"object","additionalProperties":{"type":"object"}},"empty":{"type":"boolean"}},"additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/embeddings/db":{"delete":{"tags":["AI"],"operationId":"dropAndRecreateTables","requestBody":{"content":{"*/*":{"schema":{"type":"object","properties":{"asMap":{"type":"object","additionalProperties":{"type":"object"}},"empty":{"type":"boolean"}},"additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/embeddings/indexCount":{"get":{"tags":["AI"],"operationId":"indexCount","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/embeddings/test":{"get":{"tags":["AI"],"operationId":"textResource","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/image/generate":{"get":{"tags":["AI"],"operationId":"indexByInode_1","parameters":[{"name":"prompt","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}},"post":{"tags":["AI"],"operationId":"handleImageRequest","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/AIImageRequestDTO"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/image/test":{"get":{"tags":["AI"],"operationId":"indexByInode","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/search/related":{"get":{"tags":["AI"],"operationId":"relatedByGet","parameters":[{"name":"language","in":"query","schema":{"type":"integer","format":"int64"}},{"name":"identifier","in":"query","schema":{"type":"string"}},{"name":"inode","in":"query","schema":{"type":"string"}},{"name":"indexName","in":"query","schema":{"type":"string"}},{"name":"fieldVar","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}},"post":{"tags":["AI"],"operationId":"relatedByPost","requestBody":{"content":{"*/*":{"schema":{"type":"object","properties":{"asMap":{"type":"object","additionalProperties":{"type":"object"}},"empty":{"type":"boolean"}},"additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/search":{"get":{"tags":["AI"],"operationId":"searchByGet","parameters":[{"name":"query","in":"query","schema":{"type":"string"}},{"name":"searchLimit","in":"query","schema":{"type":"integer","format":"int32","default":1000}},{"name":"searchOffset","in":"query","schema":{"type":"integer","format":"int32","default":0}},{"name":"site","in":"query","schema":{"type":"string"}},{"name":"contentType","in":"query","schema":{"type":"string"}},{"name":"indexName","in":"query","schema":{"type":"string","default":"default"}},{"name":"threshold","in":"query","schema":{"type":"number","format":"float","default":0.25}},{"name":"stream","in":"query","schema":{"type":"boolean","default":false}},{"name":"responseLength","in":"query","schema":{"type":"integer","format":"int32","default":1024}},{"name":"operator","in":"query","schema":{"type":"string","default":"<=>"}},{"name":"language","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/octet-stream":{},"application/json":{}}}}},"post":{"tags":["AI"],"operationId":"searchByPost","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/CompletionsForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/search/test":{"get":{"tags":["AI"],"operationId":"testResponse","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/ai/text/generate":{"get":{"tags":["AI"],"operationId":"doGet","parameters":[{"name":"prompt","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}},"post":{"tags":["AI"],"operationId":"doPost","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/CompletionsForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/dotauth/oauth/exchange":{"post":{"tags":["dotAuth"],"summary":"Exchange an OIDC id_token for a dotAuth session-ref","description":"Validates the caller-supplied id_token against the configured OIDC provider's JWKS (signature, iss, aud == our client_id, exp, nonce), resolves or JIT-provisions the matching dotCMS user, and returns an opaque session-ref bound to that user.","operationId":"exchange","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthExchangeForm"}}}},"responses":{"200":{"description":"Token exchange succeeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityOAuthExchangeView"}}}},"400":{"description":"Malformed payload or non-OIDC provider configured"},"401":{"description":"id_token failed validation (signature, iss, aud, exp, or nonce)"},"403":{"description":"Resolved dotCMS user exists but is not active"},"404":{"description":"Exchange endpoint not found"},"503":{"description":"OAuth is not configured for this site"}}},"options":{"tags":["dotAuth"],"operationId":"exchangePreflight","responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/v1/dotauth/sites/{hostId}":{"get":{"tags":["dotAuth"],"summary":"Get the dotAuth configuration for a site","description":"Returns the protocol-specific configuration stored for the given hostId. Use the sentinel \"SYSTEM_HOST\" for the global default. When the host has no row of its own and the system default is configured, the response carries inherited=true and values holds the system defaults. Hidden secrets (e.g. clientSecret, privateKey) are masked as \"****\".","operationId":"getDotAuthConfig","parameters":[{"name":"hostId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityDotAuthConfigView"}}}},"401":{"description":"Authentication required"},"403":{"description":"User does not have permission to read this site"},"404":{"description":"Site not found"},"500":{"description":"Internal server error"}}},"put":{"tags":["dotAuth"],"summary":"Save (upsert) the dotAuth configuration for a site","description":"Writes the chosen protocol's secrets for the given hostId and deletes the other protocol's row for that host (mutual exclusion). Posting \"****\" on a hidden field preserves the stored value.","operationId":"saveDotAuthConfig","parameters":[{"name":"hostId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DotAuthConfigForm"}}}},"responses":{"200":{"description":"Configuration saved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"400":{"description":"Invalid form payload"},"401":{"description":"Authentication required"},"403":{"description":"User does not have permission to edit this site"},"404":{"description":"Site not found"},"500":{"description":"Internal server error"}}},"delete":{"tags":["dotAuth"],"summary":"Clear the dotAuth configuration for a site","description":"Deletes both OAuth and SAML secret rows for the given hostId. On SYSTEM_HOST this removes the global default; non-system hosts fall back to inheriting from SYSTEM_HOST afterward.","operationId":"clearDotAuthConfig","parameters":[{"name":"hostId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Configuration cleared successfully"},"401":{"description":"Authentication required"},"403":{"description":"User does not have permission to edit this site"},"404":{"description":"Site not found"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/headless":{"put":{"tags":["dotAuth"],"summary":"Save the system-level headless token-exchange configuration","description":"Writes headless config to SYSTEM_HOST. Headless config is system-wide (not per-site). SSO saves/deletes never affect it.","operationId":"saveDotAuthHeadlessConfig","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"200":{"description":"Headless config saved"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"500":{"description":"Internal server error"}}},"delete":{"tags":["dotAuth"],"summary":"Clear the system-level headless token-exchange configuration","description":"Deletes the headless config. SSO config is not affected.","operationId":"clearDotAuthHeadlessConfig","responses":{"204":{"description":"Headless config cleared"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/discover/oidc":{"post":{"tags":["dotAuth"],"summary":"Fetch and parse an OIDC discovery document","description":"Thin authenticated proxy used by the dotAuth portlet to populate issuer, endpoint, JWKS, and supported algorithm fields from a .well-known/openid-configuration URL.","operationId":"discoverDotAuthOidc","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"200":{"description":"Discovery document parsed successfully","content":{"application/json":{"schema":{"type":"object","description":"Parsed OIDC discovery fields: issuer, endpoints, JWKS URI, and signing algorithms"}}}},"400":{"description":"Missing or invalid discovery URL"},"401":{"description":"Authentication required"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/export":{"post":{"tags":["dotAuth"],"summary":"Export all dotAuth AppSecrets","description":"Exports OAuth/OIDC, SAML, and headless dotAuth AppSecrets into one encrypted Apps export file.","operationId":"exportDotAuthAppSecrets","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"200":{"description":"Encrypted export file","content":{"application/octet-stream":{}}},"400":{"description":"Invalid password or no secrets configured"},"401":{"description":"Authentication required"},"403":{"description":"Admin access required"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/fetch/saml-metadata":{"post":{"tags":["dotAuth"],"summary":"Fetch SAML IdP metadata XML from a URL","description":"Authenticated proxy that fetches SAML metadata XML from an IdP's metadata endpoint URL. Returns the raw XML as a string so the admin can review it before saving.","operationId":"fetchSamlMetadata","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"200":{"description":"Metadata fetched successfully","content":{"application/json":{"schema":{"type":"object","description":"Object with a single 'xml' field containing the raw metadata XML"}}}},"400":{"description":"Missing or invalid metadata URL"},"401":{"description":"Authentication required"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/saml/metadata/{hostId}":{"get":{"tags":["dotAuth"],"summary":"Download SAML SP metadata XML for a site","description":"Generates SAML Service Provider metadata XML for the given site. For inherited configs the certificate comes from the SYSTEM_HOST row, but the entity ID and ACS URL use the target site's hostname so the IdP can distinguish per-site requests.","operationId":"getSamlSpMetadata","parameters":[{"name":"hostId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SP metadata XML","content":{"application/xml":{}}},"401":{"description":"Authentication required"},"404":{"description":"No SAML configuration found for this site"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/import":{"post":{"tags":["dotAuth"],"summary":"Import dotAuth AppSecrets","description":"Imports an encrypted Apps export file containing only OAuth/OIDC, SAML, and headless dotAuth AppSecrets.","operationId":"importDotAuthAppSecrets","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"200":{"description":"Import succeeded","content":{"application/json":{"schema":{"type":"object","description":"Import result with count of imported secrets"}}}},"400":{"description":"Invalid password, empty file, or non-dotAuth secrets in file"},"401":{"description":"Authentication required"},"403":{"description":"Admin access required"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/sites":{"get":{"tags":["dotAuth"],"summary":"List all sites with their dotAuth status","description":"Returns the SYSTEM_HOST (global default) status plus a per-site list indicating whether each site has its own OAuth/SAML configuration, inherits from the system default, or is unconfigured.","operationId":"listDotAuthSites","responses":{"200":{"description":"Sites retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityDotAuthSitesView"}}}},"401":{"description":"Authentication required"},"403":{"description":"User does not have permission to access dotAuth"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/sessionrefs/revoke":{"post":{"tags":["dotAuth"],"summary":"Revoke all dotAuth sessionRefs","description":"Flushes the dotAuth sessionRef cache. Existing browser sessions are not affected.","operationId":"revokeDotAuthSessionRefs","responses":{"200":{"description":"All session-refs revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"401":{"description":"Authentication required"},"403":{"description":"Admin access required"},"500":{"description":"Internal server error"}}}},"/api/v1/dotauth/oauth/session":{"delete":{"tags":["dotAuth"],"summary":"Invalidate the caller's dotAuth session-ref","description":"Removes the session referenced by the Authorization: Bearer header from the in-memory session cache. Always returns 204 — unknown or missing refs are silently ignored so this is safe to call unconditionally on sign-out.","operationId":"logout","responses":{"204":{"description":"Session invalidated (or was unknown)"}}}},"/api/v1/dotsaml/login/{idpConfigId}":{"get":{"tags":["SAML Authentication"],"summary":"Initiate SAML login","description":"Initiates a SAML authentication request by redirecting the user to the Identity Provider (IDP) login screen. Requires IDP metadata to determine the SSO login endpoint.","operationId":"doLogin","parameters":[{"name":"idpConfigId","in":"path","description":"Identity Provider configuration ID (typically host ID)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SAML authentication request initiated successfully (no body)"},"400":{"description":"Bad request - invalid IDP configuration ID","content":{"application/json":{}}},"404":{"description":"IDP configuration not found or not enabled","content":{"application/json":{}}},"500":{"description":"Internal server error during SAML authentication initiation","content":{"application/json":{}}}}},"post":{"tags":["SAML Authentication"],"summary":"Process SAML login callback","description":"Handles the callback from the Identity Provider after successful authentication. Extracts user information from the SAML assertion and creates/logs in the user to dotCMS.","operationId":"processLogin","parameters":[{"name":"idpConfigId","in":"path","description":"Identity Provider configuration ID (typically host ID)","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"SAML assertion data from Identity Provider","content":{"application/xml":{},"application/x-www-form-urlencoded":{}},"required":true},"responses":{"200":{"description":"SAML login processed successfully - user logged in","content":{"text/html":{}}},"400":{"description":"Bad request - invalid SAML assertion or missing data","content":{"text/html":{}}},"401":{"description":"Unauthorized - SAML assertion validation failed","content":{"text/html":{}}},"404":{"description":"IDP configuration not found or not enabled","content":{"text/html":{}}},"500":{"description":"Internal server error during SAML login processing","content":{"text/html":{}}}}}},"/api/v1/dotsaml/logout/{idpConfigId}":{"get":{"tags":["SAML Authentication"],"summary":"Process SAML logout (GET)","description":"Processes a SAML logout request via GET method. Initiates logout flow and redirects to the configured logout endpoint or builds a logout URL based on the request.","operationId":"logoutGet","parameters":[{"name":"idpConfigId","in":"path","description":"Identity Provider configuration ID (typically host ID)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SAML logout processed successfully","content":{"text/html":{}}},"404":{"description":"IDP configuration not found or not enabled","content":{"text/html":{}}},"500":{"description":"Internal server error during logout processing","content":{"text/html":{}}}}},"post":{"tags":["SAML Authentication"],"summary":"Process SAML logout (POST)","description":"Processes a SAML logout request via POST method. Handles logout callbacks from the Identity Provider and redirects to the configured logout endpoint.","operationId":"logoutPost","parameters":[{"name":"idpConfigId","in":"path","description":"Identity Provider configuration ID (typically host ID)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SAML logout processed successfully","content":{"text/html":{}}},"404":{"description":"IDP configuration not found or not enabled","content":{"text/html":{}}},"500":{"description":"Internal server error during logout processing","content":{"text/html":{}}}}}},"/api/v1/dotsaml/metadata/{idpConfigId}":{"get":{"tags":["SAML Authentication"],"summary":"Get SAML metadata","description":"Renders the XML metadata for the SAML Service Provider configuration. This endpoint is only accessible by administrators and provides the metadata required for IDP configuration.","operationId":"metadata","parameters":[{"name":"idpConfigId","in":"path","description":"Identity Provider configuration ID (typically host ID)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SAML metadata rendered successfully","content":{"application/xml":{}}},"401":{"description":"Unauthorized - admin access required","content":{"application/xml":{}}},"403":{"description":"Forbidden - user is not an administrator","content":{"application/xml":{}}},"404":{"description":"IDP configuration not found or not enabled","content":{"application/xml":{}}},"500":{"description":"Internal server error rendering metadata","content":{"application/xml":{}}}}}},"/api/v1/fieldTypes":{"get":{"tags":["Content Type Field"],"summary":"Get field types","description":"Retrieves all available field types in dotCMS for content type configuration","operationId":"getFieldTypes","responses":{"200":{"description":"Field types retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityFieldTypeListView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}}}}},"/api/js/{folder}":{"get":{"tags":["JavaScript"],"operationId":"get","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"put":{"tags":["JavaScript"],"operationId":"putMultipart","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"post":{"tags":["JavaScript"],"operationId":"postMultipart","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"delete":{"tags":["JavaScript"],"operationId":"delete_1","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"patch":{"tags":["JavaScript"],"operationId":"patchMultipart","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}}},"/api/js/{folder}/{pathParam}":{"get":{"tags":["JavaScript"],"operationId":"get_1","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}},{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"put":{"tags":["JavaScript"],"operationId":"putMultipart_1","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}},{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"post":{"tags":["JavaScript"],"operationId":"postMultipart_1","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}},{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"delete":{"tags":["JavaScript"],"operationId":"delete_2","parameters":[{"name":"folder","in":"path","required":true,"schema":{"type":"string"}},{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"patch":{"tags":["JavaScript"],"operationId":"patchMultipart_1","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}},{"name":"folder","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}}},"/api/js/dynamic/{pathParam}":{"get":{"tags":["JavaScript"],"operationId":"dynamicGet_1","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"put":{"tags":["JavaScript"],"operationId":"dynamicPut_1","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"post":{"tags":["JavaScript"],"operationId":"dynamicPost_1","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"delete":{"tags":["JavaScript"],"operationId":"dynamicDelete","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"patch":{"tags":["JavaScript"],"operationId":"dynamicPatch","parameters":[{"name":"pathParam","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}}},"/api/js/dynamic":{"get":{"tags":["JavaScript"],"operationId":"dynamicGet","requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"put":{"tags":["JavaScript"],"operationId":"dynamicPut","requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}},"post":{"tags":["JavaScript"],"operationId":"dynamicPost","requestBody":{"content":{"application/json":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}}},"/api/auditPublishing/get/{bundleId}":{"get":{"tags":["Publishing"],"operationId":"get_2","parameters":[{"name":"bundleId","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/xml":{}}}}}},"/api/auditPublishing/getAll":{"post":{"tags":["Publishing"],"operationId":"getAll","requestBody":{"content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/layout/{params}":{"get":{"operationId":"getLayout","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/html":{}}}}}},"/api/bundlePublisher/publish":{"post":{"tags":["Bundle"],"operationId":"publish","parameters":[{"name":"type","in":"query","schema":{"type":"string"}},{"name":"callback","in":"query","schema":{"type":"string"}},{"name":"FORCE_PUSH","in":"query","schema":{"type":"boolean"}},{"name":"filterkey","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/all":{"delete":{"tags":["Bundle"],"operationId":"deleteAll","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/all/fail":{"delete":{"tags":["Bundle"],"operationId":"deleteAllFail","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/all/success":{"delete":{"tags":["Bundle"],"operationId":"deleteAllSuccess","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/ids":{"delete":{"tags":["Bundle"],"operationId":"deleteBundlesByIdentifiers","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/DeleteBundlesByIdentifierForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/olderthan/{olderThan}":{"delete":{"tags":["Bundle"],"operationId":"deleteBundlesOlderThan","parameters":[{"name":"olderThan","in":"path","required":true,"schema":{"type":"string","format":"date-time"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/deleteenvironmentpushhistory/{params}":{"get":{"tags":["Bundle"],"operationId":"deleteEnvironmentPushHistory","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/deletepushhistory/{params}":{"get":{"tags":["Bundle"],"operationId":"deletePushHistory","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/_download/{bundleId}":{"get":{"tags":["Bundle"],"operationId":"downloadBundle","parameters":[{"name":"bundleId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/octet-stream":{}}}}}},"/api/bundle/{bundleId}/manifest":{"get":{"tags":["Bundle"],"operationId":"downloadManifest","parameters":[{"name":"bundleId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/octet-stream":{}}}}}},"/api/bundle/_generate":{"post":{"tags":["Bundle"],"operationId":"generateBundle","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateBundleForm"}}}},"responses":{"default":{"description":"default response","content":{"application/octet-stream":{}}}}}},"/api/bundle/{bundleId}/assets":{"get":{"tags":["Bundle"],"operationId":"getPublishQueueElements","parameters":[{"name":"bundleId","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","format":"int32"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/getunsendbundles/{params}":{"get":{"tags":["Bundle"],"operationId":"getUnsendBundles","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle/updatebundle/{params}":{"get":{"tags":["Bundle"],"operationId":"updateBundle","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/bundle":{"post":{"tags":["Bundle"],"operationId":"uploadBundleAsync","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}}},"/api/bundle/sync":{"post":{"tags":["Bundle"],"operationId":"uploadBundleSync","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/xml":{},"text/plain":{}}}}}},"/api/config/deleteEndpoint":{"post":{"tags":["System Configuration"],"operationId":"deleteEndpoint","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"endPoint":{"type":"string"},"type":{"type":"string"},"callback":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}},"deprecated":true}},"/api/config/deleteEnvironment":{"post":{"tags":["System Configuration"],"operationId":"deleteEnvironment","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"environment":{"type":"string"},"type":{"type":"string"},"callback":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/config/regenerateKey":{"post":{"tags":["System Configuration"],"operationId":"regenerateKey","responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/config/saveCompanyAuthTypeInfo":{"post":{"tags":["System Configuration"],"operationId":"saveCompanyAuthTypeInfo","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"authType":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/config/saveCompanyBasicInfo":{"post":{"tags":["System Configuration"],"operationId":"saveCompanyBasicInfo","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"portalURL":{"type":"string"},"mx":{"type":"string"},"emailAddress":{"type":"string"},"size":{"type":"string"},"type":{"type":"string"},"street":{"type":"string"},"homeURL":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/config/saveCompanyLocaleInfo":{"post":{"tags":["System Configuration"],"operationId":"saveCompanyLocaleInfo","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"languageId":{"type":"string"},"timeZoneId":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/config/saveCompanyLogo":{"post":{"tags":["System Configuration"],"operationId":"saveCompanyLogo","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"logoFile":{"$ref":"#/components/schemas/FormDataContentDisposition"}}}}}},"responses":{"default":{"description":"default response","content":{"text/html":{}}}},"deprecated":true}},"/api/cluster/getESConfigProperties/{params}":{"get":{"tags":["Cluster Management"],"operationId":"getESConfigProperties","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/cluster/licenseRepoStatus":{"get":{"tags":["Cluster Management"],"operationId":"getLicenseRepoStatus","parameters":[{"name":"params","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/cluster/getNodesStatus/{params}":{"get":{"tags":["Cluster Management"],"operationId":"getNodesInfo","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/cluster/remove/{params}":{"post":{"tags":["Cluster Management"],"operationId":"removeFromCluster","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/cluster/test":{"get":{"tags":["Cluster Management"],"operationId":"testCluster","responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/content/canLock/{params}":{"put":{"tags":["Content Delivery"],"summary":"Check if a contentlet can be locked (deprecated)","description":"Checks whether the current user can lock a contentlet identified by inode or identifier. Returns lock capability information including current lock status and lock owner details. Parameters are passed as semicolon-delimited path segments (e.g., id:abc123/language:1). This endpoint is deprecated - use the v1 ContentResource canLockContent endpoint instead.","operationId":"canLockContentLegacy","parameters":[{"name":"params","in":"path","description":"Semicolon-delimited parameters (e.g., inode:abc123/language:1/live:true)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Lock capability check completed successfully","content":{"application/json":{"schema":{"type":"object","description":"Lock capability check result"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"Contentlet not found","content":{"application/json":{}}}},"deprecated":true}},"/api/content/{params}":{"get":{"tags":["Content Delivery"],"summary":"Retrieve content by ID, inode, query, or related content","description":"Retrieves contentlets using various lookup strategies. Parameters use a slash-delimited key:value format in the URL path (e.g., /api/content/inode:abc123/live:true/language:1). Supported parameters include: id (identifier), inode, query (Lucene query), type (json or xml), orderby, limit, offset, language, live, depth (0-3 for relationship traversal), render (true to render widgets), related (ContentType.Field:identifier format), and allCategoriesInfo. When 'depth' is set: 0 returns related content identifiers, 1 returns full related content objects, 2 returns related content with their related identifiers, 3 returns related content with their fully hydrated related content.","operationId":"getContentLegacy","parameters":[{"name":"params","in":"path","description":"Slash-delimited key:value parameters (e.g., inode:abc123/live:true/language:1)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Content retrieved successfully","content":{"application/json":{"schema":{"type":"object","description":"Content data in the requested format"}}}},"400":{"description":"Invalid parameters or malformed query","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"Content not found","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}}},"put":{"tags":["Content Delivery"],"summary":"Create or update content via PUT (deprecated)","description":"Creates or updates a contentlet using JSON, XML, or form-encoded data. This endpoint is deprecated - use the v1 WorkflowResource fireActionDefault endpoint instead.","operationId":"singlePutContent","parameters":[{"name":"params","in":"path","description":"Slash-delimited key:value parameters for content operation","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"description":"Content data in JSON, XML, or form format","content":{"application/json":{},"application/xml":{},"application/x-www-form-urlencoded":{}},"required":true},"responses":{"200":{"description":"Contentlet created or updated successfully","content":{"application/json":{"schema":{"type":"object","description":"Created or updated contentlet data"}}}},"400":{"description":"Bad request - invalid input data","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}}},"deprecated":true},"post":{"tags":["Content Delivery"],"summary":"Create content via POST (deprecated)","description":"Creates a contentlet using JSON, XML, or form-encoded data. This endpoint is deprecated - use the v1 WorkflowResource fireActionDefault endpoint instead.","operationId":"singlePostContent","parameters":[{"name":"params","in":"path","description":"Slash-delimited key:value parameters for content operation","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"description":"Content data in JSON, XML, or form format","content":{"application/json":{},"application/xml":{},"application/x-www-form-urlencoded":{}},"required":true},"responses":{"200":{"description":"Contentlet created successfully","content":{"application/json":{"schema":{"type":"object","description":"Created or updated contentlet data"}}}},"400":{"description":"Bad request - invalid input data","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}}},"deprecated":true}},"/api/content/indexcount/{query}":{"get":{"tags":["Content Delivery"],"summary":"Count content matching a Lucene query","description":"Performs an index count using the specified Lucene query and returns the total number of matching contentlets as a plain text string.","operationId":"indexCountContent","parameters":[{"name":"query","in":"path","description":"Lucene query string to count matching content","required":true,"schema":{"type":"string"}},{"name":"type","in":"query","description":"Response format type (optional)","schema":{"type":"string"}},{"name":"callback","in":"query","description":"JSONP callback function name (optional)","schema":{"type":"string"}}],"responses":{"200":{"description":"Count of matching contentlets returned successfully","content":{"text/plain":{"schema":{"type":"string","description":"The count of contentlets matching the query"}}}},"400":{"description":"Invalid query syntax","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"500":{"description":"Internal server error during count operation","content":{"application/json":{}}}}}},"/api/content/indexsearch/{query}/sortby/{sortby}/limit/{limit}/offset/{offset}":{"get":{"tags":["Content Delivery"],"summary":"Search content index by Lucene query","description":"Performs an index search using the Lucene query and returns an array of JSON objects, each containing the inode and identifier of matching content.","operationId":"indexSearchContent","parameters":[{"name":"query","in":"path","description":"Lucene query string to search the index","required":true,"schema":{"type":"string"}},{"name":"sortby","in":"path","description":"Field name to sort results by","required":true,"schema":{"type":"string"}},{"name":"limit","in":"path","description":"Maximum number of results to return","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"offset","in":"path","description":"Number of results to skip for pagination","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"type","in":"query","description":"Response format type (optional)","schema":{"type":"string"}},{"name":"callback","in":"query","description":"JSONP callback function name (optional)","schema":{"type":"string"}}],"responses":{"200":{"description":"Index search results returned successfully","content":{"application/json":{"schema":{"type":"object","description":"Array of content identifiers or inodes matching the search criteria"}}}},"400":{"description":"Invalid query syntax or parameters","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"500":{"description":"Internal server error during index search","content":{"application/json":{}}}}}},"/api/content/lock/{params}":{"put":{"tags":["Content Delivery"],"summary":"Lock a contentlet (deprecated)","description":"Locks a contentlet identified by inode or identifier to prevent concurrent edits. Parameters are passed as semicolon-delimited path segments (e.g., id:abc123/language:1). This endpoint is deprecated - use the v1 ContentResource lockContent endpoint instead.","operationId":"lockContentLegacy","parameters":[{"name":"params","in":"path","description":"Semicolon-delimited parameters (e.g., inode:abc123/language:1/live:true)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Contentlet locked successfully","content":{"application/json":{"schema":{"type":"object","description":"Lock status result"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"Contentlet not found","content":{"application/json":{}}}},"deprecated":true}},"/api/content/unlock/{params}":{"put":{"tags":["Content Delivery"],"summary":"Unlock a contentlet (deprecated)","description":"Unlocks a previously locked contentlet identified by inode or identifier. Parameters are passed as semicolon-delimited path segments (e.g., id:abc123/language:1). This endpoint is deprecated - use the v1 ContentResource unlockContent endpoint instead.","operationId":"unlockContentLegacy","parameters":[{"name":"params","in":"path","description":"Semicolon-delimited parameters (e.g., inode:abc123/language:1/live:true)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Contentlet unlocked successfully","content":{"application/json":{"schema":{"type":"object","description":"Unlock operation result"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"Contentlet not found","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/environments/endpoints":{"get":{"tags":["Environment"],"summary":"Returns the endpoints","operationId":"getEndpoints","responses":{"200":{"description":"Collection of environments.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEndpointsView"}}}}}},"post":{"tags":["Environment"],"summary":"Creates an endpoint","operationId":"create","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/EndpointForm"}}}},"responses":{"200":{"description":"If creation is successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEndpointView"}}}},"403":{"description":"If the user is not an admin or access to the configuration layout or does have permission, it will return a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenException"}}}},"400":{"description":"If the endpoint already exits","content":{"application/json":{"schema":{"type":"string"}}}}}}},"/api/v1/environments/endpoints/{id}":{"put":{"tags":["Environment"],"summary":"Updates an endpoint","operationId":"update","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/EndpointForm"}}}},"responses":{"200":{"description":"If update is success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEndpointView"}}}},"403":{"description":"If the user is not an admin or access to the configuration layout or does have permission, it will return a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenException"}}}},"400":{"description":"If the environment already exits","content":{"application/json":{"schema":{"type":"string"}}}}}},"delete":{"tags":["Environment"],"summary":"Deletes an endpoint","operationId":"delete_3","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"If deletion is successfully endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"403":{"description":"If the user is not an admin or access to the configuration layout or does have permission, it will return a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenException"}}}},"404":{"description":"If the endpoint does not exits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoesNotExistException"}}}}}}},"/api/v1/environments/endpoints/{endpointId}":{"get":{"tags":["Environment"],"summary":"Returns the endpoint by id","operationId":"getEndpoint","parameters":[{"name":"endpointId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Collection of environments.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEndpointView"}}}}}}},"/api/v1/environments/endpoints/environment/{environmentId}":{"get":{"tags":["Environment"],"summary":"Returns the endpoints","operationId":"getEndpointsByEnvironmentId","parameters":[{"name":"environmentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Collection of environments.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEndpointsView"}}}}}}},"/api/environment":{"get":{"tags":["Environment"],"summary":"Returns the environments","operationId":"loadAllEnvironments","responses":{"200":{"description":"Collection of environments.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEnvironmentsView"}}}}}},"post":{"tags":["Environment"],"summary":"Creates an environment","operationId":"create_1","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnvironmentForm"}}}},"responses":{"200":{"description":"If creation is successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEnvironmentView"}}}},"403":{"description":"If the user is not an admin or access to the configuration layout or does have permission, it will return a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenException"}}}},"400":{"description":"If the environment already exits","content":{"application/json":{"schema":{"type":"string"}}}}}}},"/api/environment/{id}":{"put":{"tags":["Environment"],"summary":"Updates an environment","operationId":"update_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/EnvironmentForm"}}}},"responses":{"200":{"description":"If update is success.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityEnvironmentView"}}}},"403":{"description":"If the user is not an admin or access to the configuration layout or does have permission, it will return a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenException"}}}},"400":{"description":"If the environment already exits","content":{"application/json":{"schema":{"type":"string"}}}}}},"delete":{"tags":["Environment"],"summary":"Deletes an environment","operationId":"delete_4","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"If deletion is successfully environment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"403":{"description":"If the user is not an admin or access to the configuration layout or does have permission, it will return a 403.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenException"}}}},"404":{"description":"If the environment does not exits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DoesNotExistException"}}}}}}},"/api/environment/loadenvironments/{params}":{"get":{"tags":["Environment"],"operationId":"loadEnvironments","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/integrity/checkintegrity/{params}":{"get":{"tags":["Data Integrity"],"operationId":"checkIntegrity","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/integrity/checkIntegrityProcessStatus/{params}":{"get":{"tags":["Data Integrity"],"operationId":"checkIntegrityProcessStatus","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/integrity/discardconflicts/{params}":{"get":{"tags":["Data Integrity"],"operationId":"discardConflicts","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/integrity/fixconflicts/{params}":{"get":{"tags":["Data Integrity"],"operationId":"fixConflicts","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/integrity/_fixconflictsfromremote":{"post":{"tags":["Data Integrity"],"operationId":"fixConflictsFromRemote","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"DATA_TO_FIX":{"type":"object"},"TYPE":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"text/plain":{}}}}}},"/api/integrity/_generateintegritydata":{"post":{"tags":["Data Integrity"],"operationId":"generateIntegrityData","responses":{"default":{"description":"default response","content":{"text/plain":{}}}}}},"/api/integrity/{requestId}/integrityData":{"get":{"tags":["Data Integrity"],"operationId":"getIntegrityData","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/zip":{}}}}}},"/api/integrity/getIntegrityResult/{params}":{"get":{"tags":["Data Integrity"],"operationId":"getIntegrityResult","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/portlet/layout/{params}":{"get":{"tags":["Portlets"],"operationId":"getLayout_1","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/html":{}}}}}},"/api/portlet/{params}":{"get":{"tags":["Portlets"],"operationId":"layoutGet","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/html":{}}}}},"post":{"tags":["Portlets"],"operationId":"layoutPost","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/html":{}}}}}},"/api/license/applyLicense":{"post":{"tags":["License"],"operationId":"applyLicense","parameters":[{"name":"params","in":"path","required":true,"schema":{"type":"string"}},{"name":"licenseText","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/license/delete/{params}":{"delete":{"tags":["License"],"operationId":"delete_5","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/license/free/{params}":{"post":{"tags":["License"],"operationId":"freeLicense","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/license/all/{params}":{"get":{"tags":["License"],"operationId":"getAll_1","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/license/pick/{params}":{"post":{"tags":["License"],"operationId":"pickLicense","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/license/upload/{params}":{"post":{"tags":["License"],"operationId":"putZipFile","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"$ref":"#/components/schemas/FormDataContentDisposition"},"return":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/license/requestCode/{params}":{"post":{"tags":["License"],"operationId":"requestLicense","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/license/resetLicense/{params}":{"post":{"tags":["License"],"operationId":"resetLicense","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"*/*":{}}}}}},"/api/osgi/getInstalledBundles/{params}":{"get":{"tags":["OSGi Plugins"],"operationId":"getInstalledBundles","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}},"deprecated":true}},"/api/osgi/_processExports/{bundle}":{"get":{"tags":["OSGi Plugins"],"operationId":"processBundle","parameters":[{"name":"bundle","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}},"deprecated":true}},"/api/osgi":{"post":{"tags":["OSGi Plugins"],"operationId":"updateBundles","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}},"deprecated":true}},"/api/v1/publishqueue":{"delete":{"tags":["Publishing"],"operationId":"deleteAssetsByIdentifiers","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/DeletePPQueueElementsByIdentifierForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/restexample/layout/{params}":{"get":{"tags":["Administration"],"operationId":"getLayout_2","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/html":{}}}}}},"/api/restexample/test/{params}":{"get":{"tags":["Administration"],"operationId":"loadJson","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/role/loadbyid/{params}":{"get":{"tags":["Roles"],"summary":"Load role by ID (deprecated)","description":"Returns detailed role information including all role properties. Used for loading complete role details in admin UI. This endpoint is deprecated.","operationId":"loadRoleByIdLegacy","parameters":[{"name":"params","in":"path","description":"URL parameters including role ID (id=roleId)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Role loaded successfully","content":{"application/json":{"schema":{"type":"object","description":"Role details including DBFQN, FQN, description, permissions, id, name, and other role properties"}}}},"401":{"description":"Unauthorized - backend user authentication required","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}},"deprecated":true}},"/api/role/loadbyname/{params}":{"get":{"tags":["Roles"],"summary":"Load roles by name filter (deprecated)","description":"Returns a filtered role tree structure where leaf nodes contain the specified name. Used for role filtering in admin UI. This endpoint is deprecated.","operationId":"loadRolesByNameLegacy","parameters":[{"name":"params","in":"path","description":"URL parameters including name filter (name=filterText)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Filtered roles loaded successfully","content":{"application/json":{"schema":{"type":"object","description":"Filtered role tree structure with identifier, label, and items containing matching roles"}}}},"401":{"description":"Unauthorized - backend user authentication required","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}},"deprecated":true}},"/api/role/loadchildren/{params}":{"get":{"tags":["Roles"],"summary":"Load role children (deprecated)","description":"Returns role hierarchy with first-level children for lazy-loading role tree in admin UI. If no ID provided, returns root roles. This endpoint is deprecated.","operationId":"loadRoleChildrenLegacy","parameters":[{"name":"params","in":"path","description":"URL parameters including role ID (id=roleId or empty for root roles)","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Role children loaded successfully","content":{"application/json":{"schema":{"type":"object","description":"Role hierarchy tree with child roles containing id, name, locked, and children properties"}}}},"401":{"description":"Unauthorized - backend user authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}},"deprecated":true}},"/api/rulesengine/layout/{params}":{"get":{"tags":["Rules Engine"],"operationId":"getLayout_3","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/html":{}}}}}},"/api/structure/{path}":{"get":{"tags":["Content Type"],"operationId":"getStructuresWithWYSIWYGFields","parameters":[{"name":"path","in":"path","required":true,"schema":{"pattern":".*","type":"string"}},{"name":"name","in":"query","schema":{"type":"string"}},{"name":"type","in":"path","required":true,"schema":{"type":"string"}},{"name":"callback","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/tags":{"get":{"tags":["Tag (v1)"],"summary":"List or search tags (deprecated)","description":"Lists all tags or searches by name with optional site filtering. If a name is provided, a search-by-name (like) operation is performed. If no matches are found for the site, global tags are searched. This endpoint is deprecated - use v2 TagResource instead.","operationId":"getTagsV1","parameters":[{"name":"name","in":"query","description":"Tag name to search for (supports partial matching)","schema":{"type":"string"}},{"name":"siteId","in":"query","description":"Site identifier to restrict tag search","schema":{"type":"string"}}],"responses":{"200":{"description":"Tags retrieved successfully","content":{"application/json":{"schema":{"type":"object","description":"Map of tag names to RestTag objects"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}}},"deprecated":true},"put":{"tags":["Tag (v1)"],"summary":"Update a tag (deprecated)","description":"Updates an existing tag's name and site association. Requires tagId, tagName, and siteId in the request body. This endpoint is deprecated - use v2 TagResource instead.","operationId":"updateTagV1","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/UpdateTagForm"}}}},"responses":{"200":{"description":"Tag updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityTagsView"}}}},"400":{"description":"Invalid or incomplete tag data provided","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"Tag not found for the given ID","content":{"application/json":{}}}},"deprecated":true},"post":{"tags":["Tag (v1)"],"summary":"Create tags (deprecated)","description":"Creates new tags and optionally links them to an owner user. This endpoint is deprecated - use v2 TagResource instead.","operationId":"addTagV1","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/TagForm"}}}},"responses":{"200":{"description":"Tags created successfully (may contain partial errors)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityTagOperationView"}}}},"400":{"description":"Invalid tag data provided","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/tags/{tagId}":{"delete":{"tags":["Tag (v1)"],"summary":"Delete a tag by ID (deprecated)","description":"Deletes a tag by its ID. The user must have EDIT permission on all contentlets associated with the tag. If the tag has no contentlet associations (orphan tag), deletion is allowed. This endpoint is deprecated - use v2 TagResource instead.","operationId":"deleteTagV1","parameters":[{"name":"tagId","in":"path","description":"Tag identifier to delete","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - user lacks permission to delete the tag","content":{"application/json":{}}},"404":{"description":"Tag not found for the given ID","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/tags/inode/{inode}":{"get":{"tags":["Tag (v1)"],"summary":"Get tags by inode (deprecated)","description":"Retrieves all tag-inode associations for a given inode. This endpoint is deprecated - use v2 TagResource instead.","operationId":"findTagsByInodeV1","parameters":[{"name":"inode","in":"path","description":"Inode identifier to retrieve associated tags for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag-inode associations retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityTagInodesView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"No tags found for the given inode","content":{"application/json":{}}}},"deprecated":true},"delete":{"tags":["Tag (v1)"],"summary":"Remove all tag-inode links for an inode (deprecated)","description":"Breaks the link between an inode and all its associated tags. This endpoint is deprecated - use v2 TagResource instead.","operationId":"deleteTagInodesByInodeV1","parameters":[{"name":"inode","in":"path","description":"Inode identifier to remove all tag associations from","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tag-inode associations removed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"400":{"description":"Error removing tag-inode associations","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"No tags found for the given inode","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/tags/{nameOrId}":{"get":{"tags":["Tag (v1)"],"summary":"Get tags by name or ID (deprecated)","description":"Looks up tags by tag name or tag ID. If the value is a UUID, lookup is performed by tag ID. Otherwise, lookup is performed by tag name. This endpoint is deprecated - use v2 TagResource instead.","operationId":"getTagsByNameOrIdV1","parameters":[{"name":"nameOrId","in":"path","description":"Tag name or tag UUID to look up","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tags found successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityTagsView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"No tags found matching the given name or ID","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/tags/user/{userId}":{"get":{"tags":["Tag (v1)"],"summary":"Get tags by user ID (deprecated)","description":"Retrieves all tags owned by a given user. Returns tags that were assigned an owner during creation. This endpoint is deprecated - use v2 TagResource instead.","operationId":"getTagsByUserIdV1","parameters":[{"name":"userId","in":"path","description":"User identifier to retrieve owned tags for","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tags retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityTagsView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"No tags found for the given user ID","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/tags/import":{"post":{"tags":["Tag (v1)"],"summary":"Import tags from file (deprecated)","description":"Imports tags from an uploaded file using multipart form data. This endpoint is deprecated - use v2 TagResource instead.","operationId":"importTagsV1","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"200":{"description":"Tags imported successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"400":{"description":"Failure importing tags file","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/tags/tag/{nameOrId}/inode/{inode}":{"put":{"tags":["Tag (v1)"],"summary":"Link tags to an inode (deprecated)","description":"Binds a tag with a given inode. The lookup can be done via tag name or tag ID. If the tag name matches more than one tag, all matching tags will be bound. Use a tag ID instead of a name for more specific binding. This endpoint is deprecated - use v2 TagResource instead.","operationId":"linkTagsAndInodeV1","parameters":[{"name":"nameOrId","in":"path","description":"Tag name or tag UUID to link","required":true,"schema":{"type":"string"}},{"name":"inode","in":"path","description":"Inode identifier to link the tag(s) to","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tags linked to inode successfully (may contain partial errors)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityTagInodeOperationView"}}}},"400":{"description":"Error linking tag to inode","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - insufficient permissions","content":{"application/json":{}}},"404":{"description":"No tags found matching the given name or ID","content":{"application/json":{}}}},"deprecated":true}},"/api/testResource/testGet/{params}":{"get":{"operationId":"getDocumentCount","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/testResource/testPost":{"post":{"operationId":"saveTest","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user":{"type":"string"},"password":{"type":"string"},"param1":{"type":"string"},"param2":{"type":"string"},"type":{"type":"string"},"callback":{"type":"string"}}}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/user/getloggedinuser/{params}":{"get":{"tags":["Users"],"summary":"Get logged in user (deprecated)","description":"Returns a JSON representation of the currently logged in user including userId, emailAddress, firstName, lastName, and roleId. This endpoint is deprecated - use v1 UserResource instead.","operationId":"getLoggedInUserLegacy","parameters":[{"name":"params","in":"path","description":"URL parameters for the request","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"User information retrieved successfully","content":{"application/json":{"schema":{"type":"object","description":"User information containing userId, emailAddress, firstName, lastName, and roleId"}}}},"401":{"description":"Unauthorized - backend user authentication required","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}},"deprecated":true}},"/api/util/encodeQueryParamValue/{params}":{"get":{"tags":["Administration"],"operationId":"getLoggedInUser","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/widget/{params}":{"get":{"tags":["Widgets"],"operationId":"getWidget","parameters":[{"name":"params","in":"path","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"default":{"description":"default response","content":{"text/plain; charset=UTF-8":{}}}}}},"/api/v1/agents/a11y/fix":{"post":{"tags":["Accessibility Agent"],"summary":"Run the accessibility fix agent on a page","description":"Resolves the page identifier to a live URL, URI and host id, mints a short-lived token for the calling user, and forwards the request to the configured a11y agent service. Returns the agent's report once the run completes. This call is synchronous and a full run can take minutes - use /fix/stream to receive progress as it happens. Requires the dotPageScanner-config App to carry the agent url and auth token.","operationId":"runA11yAgentFix","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yAgentFixForm"}}}},"responses":{"200":{"description":"The agent's fix report, relayed verbatim from the agent service","content":{"application/json":{}}},"400":{"description":"identifier is missing, or the page could not be resolved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityView"}}}},"401":{"description":"Authentication required","content":{"application/json":{}}},"500":{"description":"The agent App is not configured, or the agent service failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityView"}}}}}}},"/api/v1/agents/a11y/fix/stream":{"post":{"tags":["Accessibility Agent"],"summary":"Run the accessibility fix agent, streaming progress over SSE","description":"Same as /fix, but relays the agent's Server-Sent Events as they arrive rather than waiting for the run to finish. Frames carry the run id, phase steps, progress counts, heartbeats, and a terminal done, aborted or error event. A configuration failure is reported as an SSE error frame rather than an HTTP status, because the response has already begun.","operationId":"streamA11yAgentFix","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yAgentFixForm"}}}},"responses":{"200":{"description":"SSE stream of agent events (text/event-stream)","content":{"text/event-stream":{}}},"401":{"description":"Authentication required","content":{"application/json":{}}}}}},"/api/v1/agents/a11y/stop":{"post":{"tags":["Accessibility Agent"],"summary":"Stop an in-flight accessibility fix run","description":"Cooperatively stops the run identified by runId. The agent stops at its next safe checkpoint and the open /fix/stream connection receives a terminal aborted event carrying a partial report - fixes already applied are kept. Runs are addressed by runId rather than by caller identity, because the proxy mints a fresh token per request.","operationId":"stopA11yAgentRun","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/A11yAgentStopForm"}}}},"responses":{"202":{"description":"Stop signalled, or no such run was active - both are success","content":{"application/json":{}}},"400":{"description":"runId is missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityView"}}}},"401":{"description":"Authentication required","content":{"application/json":{}}}}}},"/api/v1/achecker/guidelines":{"get":{"tags":["Accessibility Checker"],"summary":"Retrieves Accessibility Guidelines","description":"Returns the list of available Accessibility Guidelines that are used to validate content.","operationId":"getAccessibilityGuidelines","responses":{"200":{"description":"Guideline list retrieved successfully","content":{"application/json":{}}},"500":{"description":"Internal Server Error"}}}},"/api/v1/achecker/_validate":{"post":{"tags":["Accessibility Checker"],"summary":"Validates content","description":"Validates the given content against the one or more Accessibility Guidelines.","operationId":"postValidateContent","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"empty":{"type":"boolean"}},"additionalProperties":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Content validated successfully","content":{"application/json":{"example":"{\n \"entity\": {\n \"errors\": [\n {\n \"check\": {\n \"check_id\": 98,\n \"confidence\": 2,\n \"confidenceEnum\": \"POTENTIAL\",\n \"decision_fail\": \"Not all abbreviations are marked with the abbr element.\",\n \"decision_pass\": \"All abbreviations are marked with the abbr element.\",\n \"description\": \"If body element content is greater than 10 characters (English) this error will be generated.\",\n \"err\": \"Abbreviations may not be marked with abbr element.\",\n \"func\": \"return (BasicFunctions::getPlainTextLength() <= 10);\",\n \"how_to_repair\": \"\",\n \"html_tag\": \"body\",\n \"lang\": \"en\",\n \"long_description\": null,\n \"name\": \"Abbreviations must be marked with abbr element.\",\n \"note\": \"\",\n \"open_to_public\": 1,\n \"question\": \"Are there any abbreviations in the document that are not marked with the abbr element?\",\n \"rationale\": \"_RATIONALE_98\",\n \"repair_example\": \"\",\n \"search_str\": null,\n \"test_expected_result\": \"1. All abbreviations are expected to be marked with a valid abbr element.\",\n \"test_failed_result\": \"1. Mark all abbreviations with a valid abbr element.\",\n \"test_procedure\": \"1. Check the document for any text abbreviations.\\\\n2. If an abbreviation is found, check if it is properly marked with the abbr element.\",\n \"user_id\": 0\n },\n \"col_number\": 110,\n \"cssCode\": null,\n \"htmlCode\": \"
doctype declaration.\",\n \"err\": \"doctype declaration missing.\",\n \"func\": \"return (BasicFunctions::getNumOfTagInWholeContent(\\\\\\\"doctype\\\\\\\") > 0);\",\n \"how_to_repair\": \"Add a valid doctype declaration to the document.\",\n \"html_tag\": \"html\",\n \"lang\": \"en\",\n \"long_description\": null,\n \"name\": \"HTML content has a valid doctype declaration.\",\n \"note\": \"\",\n \"open_to_public\": 1,\n \"question\": \"\",\n \"rationale\": \"\",\n \"repair_example\": \"\",\n \"search_str\": null,\n \"test_expected_result\": \"1. HTML content has a valid doctype declaration.\",\n \"test_failed_result\": \"1. Add a valid doctype declaration to the document.\",\n \"test_procedure\": \"1. Check for the presence of a doctype declaration at the start of the document.\\\\n2. Check the content of the doctype declaration.\",\n \"user_id\": 0\n },\n \"col_number\": 110,\n \"cssCode\": null,\n \"htmlCode\": \" Adventure travel done right Wherever you want to go, what...\",\n \"image\": null,\n \"imageAlt\": null,\n \"line_number\": 0,\n \"success\": true\n },\n ...\n ...\n ]\n },\n \"errors\": [],\n \"i18nMessagesMap\": {},\n \"messages\": [],\n \"pagination\": null,\n \"permissions\": []\n}"}}},"400":{"description":"Bad Request"},"415":{"description":"Unsupported Media Type"},"500":{"description":"Internal Server Error"}}}},"/api/v1/analytics/content/siteauth/generate/{siteId}":{"get":{"tags":["Content Analytics"],"summary":"Generate Site Auth","description":"Generates and returns a Site Key that must be used by the client-side JS code to send custom Content Analytics Events","operationId":"generateSiteAuth","parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The Site key was generated and returned successfully"},"400":{"description":"Bad Request"},"401":{"description":"Unauthorized"},"404":{"description":"Site ID in path is not found or incorrect path"},"405":{"description":"Method Not Allowed"},"500":{"description":"Internal Server Error"}}}},"/api/v1/analytics/content/event":{"post":{"tags":["Content Analytics"],"summary":"Proxy analytics event ingest with site auth validation","description":"Validates the site_auth field in the JSON body via SiteAuthValidator, resolves the active site, injects site_id into context, and asynchronously forwards the body to {DOT_ANALYTICS_BASE_URL}/v1/event/ingest. The dotCMS-side path is a fixed match; the upstream sub-path is not caller-controllable.","operationId":"proxyAnalyticsEventRequest","requestBody":{"description":"JSON request body with a `context.site_auth` value and event payload","content":{"application/json":{"schema":{"type":"string"}}},"required":true},"responses":{"200":{"description":"Successful upstream response","content":{"application/json":{"schema":{"type":"object","description":"dotCMS response envelope containing the upstream analytics data"}}}},"400":{"description":"Invalid siteAuth or upstream returned an error","content":{"application/json":{}}},"500":{"description":"Internal server error or upstream unreachable","content":{"application/json":{}}}}}},"/api/v1/analytics/{path}":{"get":{"tags":["Content Analytics"],"summary":"Proxy any analytics GET request","description":"Forwards any authenticated GET request to /v1/analytics/** to the dot-ca-event-manager service at /v1/**, preserving all query parameters. Requests are site-permission gated: the caller must have READ on the site resolved from ?siteId=, ?host_id=, or the session fallback.","operationId":"proxyAnalyticsGetRequest","parameters":[{"name":"path","in":"path","description":"Path to forward to the upstream analytics service","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Successful upstream response","content":{"application/json":{"schema":{"type":"object","description":"dotCMS response envelope containing the upstream analytics data"}}}},"400":{"description":"Site identifier could not be resolved","content":{"application/json":{}}},"401":{"description":"Unauthorized – backend user required","content":{"application/json":{}}},"403":{"description":"User lacks READ permission on the resolved site (error code SITE_ACCESS_DENIED)","content":{"application/json":{}}},"500":{"description":"Internal server error or upstream unreachable","content":{"application/json":{}}}}}},"/api/v1/announcements":{"get":{"tags":["Announcements"],"operationId":"announcements","parameters":[{"name":"refreshCache","in":"query","schema":{"type":"boolean"}},{"name":"limit","in":"query","schema":{"type":"integer","format":"int32"}}],"responses":{"default":{"description":"default response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityViewListAnnouncement"}},"application/javascript":{"schema":{"$ref":"#/components/schemas/ResponseEntityViewListAnnouncement"}}}}}}},"/api/v1/apps":{"get":{"tags":["Apps"],"operationId":"listAvailableApps","parameters":[{"name":"filter","in":"query","schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"post":{"tags":["Apps"],"operationId":"createApp","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"delete":{"tags":["Apps"],"operationId":"deleteIndividualAppSecret","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/DeleteSecretForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}}},"/api/v1/apps/{key}/{siteId}":{"get":{"tags":["Apps"],"operationId":"getAppDetail","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"put":{"tags":["Apps"],"operationId":"updateAppIndividualSecret","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/SecretForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"post":{"tags":["Apps"],"operationId":"createAppSecrets","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/SecretForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"delete":{"tags":["Apps"],"operationId":"deleteAllAppSecrets","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}}},"/api/v1/apps/{key}":{"get":{"tags":["Apps"],"operationId":"getAppByKey","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"delete":{"tags":["Apps"],"operationId":"deleteApp","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}},{"name":"removeDescriptor","in":"query","schema":{"type":"boolean"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}}},"/api/v1/apps/export":{"post":{"tags":["Apps"],"operationId":"exportSecrets","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExportSecretForm"}}}},"responses":{"default":{"description":"default response","content":{"application/octet-stream":{},"application/json":{}}}}}},"/api/v1/apps/import":{"post":{"tags":["Apps"],"operationId":"importSecrets","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FormDataMultiPart"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{}}}}}},"/api/v1/assets/_archive":{"post":{"tags":["Web Assets"],"summary":"Archive asset","description":"Archive an asset (file) to make it inactive while preserving it in the system.","operationId":"archiveAsset","requestBody":{"description":"Asset archive request information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetArchiveRequestForm"}}},"required":true},"responses":{"200":{"description":"Asset archived successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"404":{"description":"Asset not found","content":{"application/json":{}}},"403":{"description":"Insufficient permissions to archive asset","content":{"application/json":{}}}}}},"/api/v1/assets/folders":{"put":{"tags":["Web Assets"],"summary":"Update existing folder","description":"Update an existing folder's configuration details and optionally rename it","operationId":"updateFolder","requestBody":{"description":"Folder update request with path and new configuration details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFolderForm"}}},"required":true},"responses":{"200":{"description":"Folder updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityView"}}}},"400":{"description":"Invalid request data or folder path","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"404":{"description":"Folder not found at the specified path","content":{"application/json":{}}},"403":{"description":"Insufficient permissions to update folder","content":{"application/json":{}}}}},"post":{"tags":["Web Assets"],"summary":"Create new folder","description":"Create a new folder at the specified path with the provided configuration details","operationId":"createFolder","requestBody":{"description":"New folder creation request with path and configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewFolderForm"}}},"required":true},"responses":{"200":{"description":"Folder created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityView"}}}},"400":{"description":"Invalid request data or folder path","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"409":{"description":"Folder already exists at the specified path","content":{"application/json":{}}}}}},"/api/v1/assets/_delete":{"post":{"tags":["Web Assets"],"summary":"Delete asset permanently","description":"Permanently delete an asset (file) from the system using its path","operationId":"deleteAsset","requestBody":{"description":"Asset deletion request information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDeletionRequestForm"}}},"required":true},"responses":{"200":{"description":"Asset deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"404":{"description":"Asset not found","content":{"application/json":{}}},"403":{"description":"Insufficient permissions to delete asset","content":{"application/json":{}}}}}},"/api/v1/assets/folders/_delete":{"post":{"tags":["Web Assets"],"summary":"Delete folder permanently","description":"Permanently delete a folder and all its contents from the system using its path","operationId":"deleteFolder","requestBody":{"description":"Folder deletion request information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderDeletionRequestForm"}}},"required":true},"responses":{"200":{"description":"Folder deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"404":{"description":"Folder not found","content":{"application/json":{}}},"403":{"description":"Insufficient permissions to delete folder","content":{"application/json":{}}}}}},"/api/v1/assets/_download":{"post":{"tags":["Web Assets"],"summary":"Download asset file","description":"Download the binary content of an asset file by path, language and version","operationId":"download","requestBody":{"description":"Asset download request information","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetsRequestForm"}}},"required":true},"responses":{"200":{"description":"Asset file download started successfully","content":{"application/octet-stream":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}},"404":{"description":"Asset not found","content":{"application/json":{}}}}}},"/api/v1/assets":{"put":{"tags":["Web Assets"],"summary":"Upload or update asset file","description":"Upload a new asset file or update an existing one at the specified path using multipart form data","operationId":"saveUpdateAsset","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"$ref":"#/components/schemas/FormDataContentDisposition"},"assetPath":{"type":"string"},"detail":{"$ref":"#/components/schemas/FileUploadDetail"}}}}}},"responses":{"200":{"description":"Asset uploaded/updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAssetEntityView"}}}},"400":{"description":"Bad request - invalid file or path","content":{"application/json":{}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}}}},"post":{"tags":["Web Assets"],"summary":"Get asset information by path","description":"Retrieve detailed information and metadata for an asset (file or folder) using its path","operationId":"getAssetsInfo","requestBody":{"description":"Asset path information","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AssetLookupRequestForm"}}},"required":true},"responses":{"200":{"description":"Asset information retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebAssetEntityView"}}}},"401":{"description":"Unauthorized access","content":{"application/json":{}}}}}},"/api/v1/apitoken/{tokenId}":{"delete":{"tags":["API Token"],"summary":"Deletes an API token","description":"Deletes an API token by identifier. May be performed on either active, expired, or revoked.\n\nReturned entity contains the property `deleted`, the value of which is the deleted token object.","operationId":"deleteApiTokenByIdV1","parameters":[{"name":"tokenId","in":"path","description":"Identifier of API token to be deleted.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Token successfully deleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"},"example":{"entity":{"deleted":{"allowNetwork":null,"claims":{"label":"string"},"expired":false,"expiresDate":1822623941000,"id":"string","issueDate":1728061510000,"issuer":"string","modificationDate":1728069870000,"notBeforeDate":false,"requestingIp":"string","requestingUserId":"string","revoked":true,"revokedDate":1728069870000,"subject":"string","tokenType":"string","userId":"string","valid":false}},"errors":[],"i18nMessagesMap":{},"messages":[],"pagination":null,"permissions":[]}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid user"},"404":{"description":"Token not found"},"500":{"description":"Unexpected server error"}}}},"/api/v1/apitoken/{userId}/tokens":{"get":{"tags":["API Token"],"summary":"Retrieves API tokens based on a user ID","description":"Accepts a user identifier and returns a list of API tokens associated with that user.\n\nThe returned list may optionally include or exclude tokens that have been revoked.\n\n","operationId":"getApiTokensByUserIdV1","parameters":[{"name":"userId","in":"path","description":"Identifier of user to check for tokens.","required":true,"schema":{"type":"string"}},{"name":"showRevoked","in":"query","description":"Determines whether revoked tokens are shown. Defaults to `false` if omitted.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"User's API tokens successfully retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"},"example":{"entity":{"tokens":[{"allowNetwork":null,"claims":{"label":"string"},"expired":false,"expiresDate":1822623941000,"id":"string","issueDate":1728061510000,"issuer":"string","modificationDate":1728061510000,"notBeforeDate":false,"requestingIp":"string","requestingUserId":"string","revoked":false,"revokedDate":null,"subject":"string","tokenType":"string","userId":"string","valid":true}]},"errors":[],"i18nMessagesMap":{},"messages":[],"pagination":null,"permissions":[]}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid user"},"403":{"description":"Forbidden"},"404":{"description":"Invalid user"},"500":{"description":"Unexpected server error"}}}},"/api/v1/apitoken/expiring":{"get":{"tags":["API Token"],"summary":"Retrieves API tokens that are about to expire","description":"Returns a list of API tokens that will expire within the configured number of days.\n\nFor admin users, returns all expiring tokens from all users.\nFor limited users, returns only their own expiring tokens.\n\nThe number of days to look ahead can be configured via the EXPIRING_TOKEN_LOOKAHEAD_DAYS property (default: 7).","operationId":"getExpiringApiTokensV1","responses":{"200":{"description":"Expiring API tokens successfully retrieved","content":{"application/json":{"example":{"entity":{"tokens":[{"expiresDate":1844834400000,"id":"apie3362144-8906-460d-b16e-e46a5bf69aef","issueDate":1750183464000,"userId":"dotcms.org.1"},{"expiresDate":1844835400000,"id":"apie46a5bf69aef-8906-460d-asde-e46a5bf69aef","issueDate":1750183464000,"userId":"dotcms.org.1"}]},"errors":[],"i18nMessagesMap":{},"messages":[],"pagination":null,"permissions":[]}}}},"401":{"description":"Invalid user"},"403":{"description":"Forbidden"},"500":{"description":"Unexpected server error"}}}},"/api/v1/apitoken/{tokenId}/jwt":{"get":{"tags":["API Token"],"summary":"Generates a new JWT for an existing token","description":"Returns a JSON web token. This overwrites the JWT value associated with the specified token object.","operationId":"getJwtFromApiTokenV1","parameters":[{"name":"tokenId","in":"path","description":"Identifier of API token to receive a new JWT.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"JSON web token successfully created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityJwtView"},"example":{"entity":{"jwt":"string"},"errors":[],"i18nMessagesMap":{},"messages":[],"pagination":null,"permissions":[]}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid user"},"403":{"description":"Forbidden"},"404":{"description":"Token not found"},"500":{"description":"Unexpected server error"}}}},"/api/v1/apitoken/remote":{"put":{"tags":["API Token"],"summary":"Generates a remote API token","description":"This endpoint takes as part of its payload authentication credentials for a user account on a remote dotCMS instance. It returns a token object that can be used to permit remote operation according to the role and permissions of the authenticated account.\n\nThis is used, for example, in configuring a [push publishing](https://www.dotcms.com/docs/latest/push-publishing) endpoint.\n\nUsable only by administrators.","operationId":"putGetRemoteTokenV1","requestBody":{"description":"PUT body consists of a JSON object containing three properties: `token`, concerning the token's direct properties; `remote`, defining the remote host, and `auth`, specifying remote user authentication.\n\nEach of these three top-level properties is itself an object containing further properties, listed fully below:\n\n| Properties | Value | Description |\n|----------------------------|---------|------------------------------------------------------------------------|\n| `token.network` | String | Network mask in which the token is active. |\n| `token.expirationSeconds` | String | Seconds until the token expires. |\n| `token.claims` | Object | Object containing the property `label`, defined below. |\n| `token.claims.label` | String | The name of the token generated. |\n| | | |\n| `remote.host` | String | Remote host for which to generate a token. |\n| `remote.port` | String | Port number for the remote host. |\n| `remote.protocol` | String | Web protocol used to connect to the remote host. |\n| | | |\n| `auth.login` | String | Email of account from which the remote token will derive permissions. |\n| `auth.password` | String | A string representing a base64-encoded password. |\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoteAPITokenForm"},"example":{"token":{"network":"0.0.0.0/0","expirationSeconds":"1000","claims":{"label":"Example"}},"remote":{"host":"dotcms-receiver.local","port":"8082","protocol":"http"},"auth":{"login":"admin@dotcms.com","password":"YWRtaW4="}}}},"required":true},"responses":{"200":{"description":"Remote token generated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityApiTokenWithJwtView"},"example":{"entity":{"jwt":"string","token":{"allowNetwork":"0.0.0.0/0","claims":{"label":"string"},"expired":false,"expiresDate":0,"id":"string","issueDate":0,"issuer":"string","modificationDate":0,"notBeforeDate":false,"requestingIp":"string","requestingUserId":"string","revoked":false,"revokedDate":0,"subject":"string","tokenType":"string","userId":"string","valid":true}},"errors":[],"i18nMessagesMap":{},"messages":[],"permissions":[]}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid user"},"403":{"description":"Forbidden"},"415":{"description":"Unsupported Media Type"},"500":{"description":"Unexpected server error"}}}},"/api/v1/apitoken":{"post":{"tags":["API Token"],"summary":"Issues an API token","description":"Issues an API token to an authorized user account.\n\nReturns an object representing the issued token.","operationId":"postIssueApiTokenV1","requestBody":{"description":"This method requires a POST body of a JSON object containing the following properties.\n\n| Property | Value | Description |\n|-----------------|-----------|-----------------------------------------------|\n| `userId` | String | **Required.** ID of user attempting receiving |\n| `expirationSeconds` | Integer | **Required.** TTL of token in seconds. |\n| `network` | String | Network mask in which token is valid. Defaults to `0.0.0.0/0`, or any local network. |\n| `claims` | Object | Contains `label` property. |\n| `claims.label` | String | Sets a user-defined name for token. |\n| `shouldBeAdmin` | Boolean | If `true`, the call only succeeds if the token is being issued to an admin account. Defaults to `false` if omitted. |\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenForm"},"example":{"userId":"string","expirationSeconds":0,"network":"string","claims":{"label":"string"},"shouldBeAdmin":false}}},"required":true},"responses":{"200":{"description":"Token successfully issued to user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityApiTokenWithJwtView"},"example":{"entity":{"jwt":"string","token":{"allowNetwork":"0.0.0.0/0","claims":{"label":"string"},"expired":false,"expiresDate":0,"id":"string","issueDate":0,"issuer":"string","modificationDate":0,"notBeforeDate":false,"requestingIp":"string","requestingUserId":"string","revoked":false,"revokedDate":0,"subject":"string","tokenType":"string","userId":"string","valid":true}},"errors":[],"i18nMessagesMap":{},"messages":[],"pagination":null,"permissions":[]}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid user"},"403":{"description":"Forbidden"},"415":{"description":"Unsupported Media Type"},"500":{"description":"Unexpected server error"}}}},"/api/v1/apitoken/{tokenId}/revoke":{"put":{"tags":["API Token"],"summary":"Revokes an API token","description":"Revokes a token by its identifier.\n\n Returned entity contains the property `revoked`, whose value is an object representing the revoked token.","operationId":"putRevokeTokenByIdV1","parameters":[{"name":"tokenId","in":"path","description":"Identifier of API token to be revoked","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Token revoked successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"},"example":{"entity":{"revoked":{"allowNetwork":null,"claims":{"label":"string"},"expired":false,"expiresDate":1822623941000,"id":"string","issueDate":1728061510000,"issuer":"string","modificationDate":1728069870000,"notBeforeDate":false,"requestingIp":"string","requestingUserId":"string","revoked":true,"revokedDate":1728069870000,"subject":"string","tokenType":"string","userId":"string","valid":false}},"errors":[],"i18nMessagesMap":{},"messages":[],"pagination":null,"permissions":[]}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid user"},"403":{"description":"Forbidden"},"404":{"description":"Token not found"},"500":{"description":"Unexpected server error"}}}},"/api/v1/authentication":{"post":{"tags":["Authentication"],"summary":"Verifies user or application authentication","description":"Takes a user's login ID and password and checks them against the user rolls.\n\nIf the user is found and authenticated, a session is created.\n\nOtherwise the system will return an 'authentication failed' message.\n\n","operationId":"postAuthenticationV1","requestBody":{"description":"This method takes a user's credentials and language preferences to authenticate them.\n\nRequires a POST body consisting of a JSON object containing the following properties:\n\n| **Property** | **Value** | **Description** |\n|--------------|-----------|-----------------------------------------------|\n| `userId` | String | **Required.** ID of user attempting to log in |\n| `password` | String | User password |\n| `language` | String | Preferred language for user |\n| `country` | String | Country where user is located |\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthenticationForm"}}},"required":true},"responses":{"200":{"description":"User authentication successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"}}}},"401":{"description":"User not authenticated"},"403":{"description":"Forbidden request"},"415":{"description":"Unsupported Media Type"},"500":{"description":"Unexpected error"}}}},"/api/v1/authentication/logInUser":{"get":{"tags":["Authentication"],"summary":"Retrieves user data","description":"Provides information about any users that are currently in a session.\n\nThis retrieved data will be formatted into a JSON response body.\n\n","operationId":"getLogInUserV1","responses":{"200":{"description":"User data successfully collected","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapMapView"}}}},"400":{"description":"Bad request"},"401":{"description":"Unauthorized request"},"404":{"description":"User not found"}}}},"/api/v1/forgotpassword":{"post":{"tags":["Authentication"],"summary":"Send password reset email","description":"Sends a password reset email to the specified user. Returns the email address where the reset link was sent.","operationId":"forgotPassword","requestBody":{"description":"Forgot password form containing user ID or email address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordForm"}}},"required":true},"responses":{"200":{"description":"Password reset email sent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityForgotPasswordView"}}}},"400":{"description":"Bad request - invalid email address or user not found (if configured to show)","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}}}},"/api/v1/loginform":{"post":{"tags":["Authentication"],"summary":"Get login form configuration","description":"Retrieves login form configuration including company details, available languages, and localized messages","operationId":"loginForm","requestBody":{"description":"Internationalization form containing language and country preferences","content":{"application/json":{"schema":{"$ref":"#/components/schemas/I18NForm"}}},"required":true},"responses":{"200":{"description":"Login form configuration retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityLoginFormView"}}}},"403":{"description":"Forbidden - security exception","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}}}},"/api/v1/logout":{"get":{"tags":["Authentication"],"summary":"Logout user","description":"Logs out the current user, invalidating their session and optionally providing a redirect URL","operationId":"logoutUser","responses":{"200":{"description":"User logged out successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"403":{"description":"Forbidden - security exception during logout","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}}}},"/api/v1/changePassword":{"post":{"tags":["Authentication"],"summary":"Reset user password","description":"Resets a user's password using a valid token received via email or other secure channel","operationId":"resetPassword","requestBody":{"description":"Reset password form containing token and new password","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordForm"}}},"required":true},"responses":{"200":{"description":"Password reset successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityPasswordResetView"}}}},"400":{"description":"Bad request - invalid login, token, or password","content":{"application/json":{}}},"403":{"description":"Forbidden - token expired or invalid","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}}}},"/api/v1/browser":{"post":{"tags":["Browser Tree"],"operationId":"getFolderContent","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/BrowserQueryForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}}},"/api/v1/browser/selectedfolder":{"get":{"tags":["Browser Tree"],"operationId":"getSelectFolder","responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}},"put":{"tags":["Browser Tree"],"operationId":"selectFolder","requestBody":{"content":{"*/*":{"schema":{"$ref":"#/components/schemas/OpenFolderForm"}}}},"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}}}},"/api/v1/browsertree/sitename/{sitename}/uri":{"get":{"tags":["Browser Tree"],"operationId":"loadAssetsUnder","parameters":[{"name":"sitename","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}},"deprecated":true}},"/api/v1/browsertree/sitename/{sitename}/uri/{uri}":{"get":{"tags":["Browser Tree"],"operationId":"loadAssetsUnder_1","parameters":[{"name":"sitename","in":"path","required":true,"schema":{"type":"string"}},{"name":"uri","in":"path","required":true,"schema":{"pattern":".+","type":"string"}}],"responses":{"default":{"description":"default response","content":{"application/json":{},"application/javascript":{}}}},"deprecated":true}},"/api/v1/categories":{"get":{"tags":["Categories"],"summary":"Get paginated list of categories","description":"Returns a paginated list of categories. Supports filtering by name, sorting, and optionally including the count of child categories for each result.","operationId":"getCategories","parameters":[{"name":"filter","in":"query","description":"Filter string to match against category names","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number (zero-based)","schema":{"type":"integer","format":"int32"}},{"name":"per_page","in":"query","description":"Number of items per page","schema":{"type":"integer","format":"int32"}},{"name":"orderby","in":"query","description":"Field to order results by","schema":{"type":"string","default":"category_name"}},{"name":"direction","in":"query","description":"Sort direction: ASC or DESC","schema":{"type":"string","default":"ASC"}},{"name":"showChildrenCount","in":"query","description":"Whether to include children count for each category","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Paginated categories retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryView"}}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"}}},"put":{"tags":["Categories"],"summary":"Update an existing category","description":"Updates a working version of an existing category. The form must contain the inode of the category to update.","operationId":"updateCategory","requestBody":{"description":"Category form with updated properties including inode","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryForm"}}},"required":true},"responses":{"200":{"description":"Category updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryView"}}}},"400":{"description":"Bad request"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions to update categories"},"404":{"description":"Category not found"}}},"post":{"tags":["Categories"],"summary":"Create a new category","description":"Creates a new category using the provided form data. The category name is required.","operationId":"createCategory","requestBody":{"description":"Category form with name and properties","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryForm"}}},"required":true},"responses":{"200":{"description":"Category created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryView"}}}},"400":{"description":"Bad request — category name is required"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"}}},"delete":{"tags":["Categories"],"summary":"Delete categories by inodes","description":"Deletes one or more categories and all their descendants at every depth. EDIT permission is validated on each selected category and every descendant before anything is deleted; a category that fails validation is skipped whole. Accepts a JSON array of category inodes. Inodes that could not be deleted are reported in the `fails` list of the result with the failure reason (category does not exist, insufficient permissions, or a permission-protected descendant). `successCount` counts the requested inodes that were deleted, while `deletedCount` counts every category actually removed, descendants included.","operationId":"deleteCategories","requestBody":{"description":"JSON payload containing a list of the inodes of categories to delete.","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Bulk delete result returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryBulkDeleteResultView"}}}},"400":{"description":"Bad request"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"}}}},"/api/v1/categories/_export":{"get":{"tags":["Categories"],"summary":"Export categories as CSV","description":"Exports categories to a CSV file. Optionally filter by name and scope to a parent category inode.","operationId":"exportCategories","parameters":[{"name":"contextInode","in":"query","description":"Context category inode to export from","schema":{"type":"string"}},{"name":"filter","in":"query","description":"Filter pattern to match category names","schema":{"type":"string"}}],"responses":{"200":{"description":"CSV file streamed successfully","content":{"text/csv":{}}},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"404":{"description":"Context category not found"}}}},"/api/v1/categories/{idOrKey}":{"get":{"tags":["Categories"],"summary":"Get a category by ID or key","description":"Retrieves a single category by either its inode (ID) or its unique key. First attempts to find by inode; if not found, searches by key.","operationId":"getCategoryByIdOrKey","parameters":[{"name":"idOrKey","in":"path","description":"Category ID (inode) or key","required":true,"schema":{"type":"string"}},{"name":"showChildrenCount","in":"query","description":"Whether to include children count","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Category retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryView"}}}},"400":{"description":"Bad request — idOrKey is required"},"401":{"description":"Authentication required"},"404":{"description":"Category not found"}}}},"/api/v1/categories/children":{"get":{"tags":["Categories"],"summary":"Get children of a category","description":"Returns a paginated list of child categories for the specified parent category inode. When 'allLevels' is true, returns categories at any depth; otherwise only immediate children.","operationId":"getCategoryChildren","parameters":[{"name":"filter","in":"query","description":"Filter text to search child categories","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number for pagination","schema":{"type":"integer","format":"int32"}},{"name":"per_page","in":"query","description":"Number of items per page","schema":{"type":"integer","format":"int32"}},{"name":"orderby","in":"query","description":"Field to order results by","schema":{"type":"string","default":"category_name"}},{"name":"direction","in":"query","description":"Sort direction (ASC or DESC)","schema":{"type":"string","default":"ASC"}},{"name":"inode","in":"query","description":"Parent category inode to get children for","schema":{"type":"string"}},{"name":"showChildrenCount","in":"query","description":"Whether to include children count for each category","schema":{"type":"boolean"}},{"name":"allLevels","in":"query","description":"Whether to include all nested levels","schema":{"type":"boolean"}},{"name":"parentList","in":"query","description":"Whether to include parent list hierarchy","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Children categories retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryWithChildCountView"}}}},"400":{"description":"Bad request"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"},"404":{"description":"Parent category not found"}}}},"/api/v1/categories/hierarchy":{"post":{"tags":["Categories"],"summary":"Get category hierarchy for multiple categories","description":"Retrieves the parent hierarchy for a set of categories specified by their keys. Returns parent lists for each category, starting from the top-level parent down to the direct parent. Categories that don't exist are ignored.","operationId":"getCategoryHierarchy","requestBody":{"description":"Category keys form containing array of category keys","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryKeysForm"}}},"required":true},"responses":{"200":{"description":"Category hierarchies retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyShortCategoriesResponseView"}}}},"400":{"description":"Bad request - invalid category keys form"},"401":{"description":"Unauthorized - user authentication required"}}}},"/api/v1/categories/_import":{"post":{"tags":["Categories"],"summary":"Import categories from a CSV file","description":"Imports categories from an uploaded CSV file. The 'exportType' parameter controls the import strategy: 'replace' deletes existing categories before importing, 'merge' adds or updates without removing existing ones.","operationId":"importCategories","requestBody":{"description":"CSV file containing categories to be imported.","content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CategoryImportFormSchema"}}},"required":true},"responses":{"200":{"description":"Import result returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBulkResultView"}}}},"400":{"description":"Bad request or invalid file"},"401":{"description":"Authentication required"},"403":{"description":"Insufficient permissions"}}}},"/api/v1/categories/_sort":{"put":{"tags":["Categories"],"summary":"Update category sort order","description":"Updates the sort order of one or more existing categories.","operationId":"updateCategorySortOrder","requestBody":{"description":"List of category inodes to delete","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryEditForm"}}},"required":true},"responses":{"200":{"description":"Sort order updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCategoryView"}}}},"400":{"description":"Bad request"},"403":{"description":"Insufficient permissions"},"401":{"description":"Authentication required"}}}},"/api/v1/configuration/branding":{"get":{"tags":["System Configuration"],"summary":"Get company configuration","description":"Returns the full company configuration including branding, authentication settings, and metadata for the admin editing UI.","operationId":"getCompanyConfig","responses":{"200":{"description":"Company configuration retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCompanyConfigView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - CMS Administrator role required","content":{"application/json":{}}}}},"put":{"tags":["System Configuration"],"summary":"Save company basic info and branding","description":"Updates the company's portal URL, email address, branding colors, logos, and background image. Navigation bar logo requires Enterprise license.","operationId":"saveBasicInfo","requestBody":{"description":"Company basic info and branding settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyBasicInfoForm"}}},"required":true},"responses":{"200":{"description":"Company basic info updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCompanyConfigView"}}}},"400":{"description":"Bad request - invalid parameters","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - CMS Administrator role required","content":{"application/json":{}}}}}},"/api/v1/configuration/_regenerateKey":{"post":{"tags":["System Configuration"],"summary":"Regenerate company security key","description":"Regenerates the company's security key and returns the SHA-256 digest of the new key. This operation cannot be undone.","operationId":"regenerateKey_1","responses":{"200":{"description":"Security key regenerated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityStringView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - CMS Administrator role required","content":{"application/json":{}}}}}},"/api/v1/configuration/authentication":{"put":{"tags":["System Configuration"],"summary":"Save company authentication type","description":"Updates the authentication method used for user login. Accepts 'emailAddress' or 'userId'.","operationId":"saveAuthType","requestBody":{"description":"Authentication type setting","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyAuthTypeForm"}}},"required":true},"responses":{"200":{"description":"Authentication type updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCompanyConfigView"}}}},"400":{"description":"Bad request - invalid auth type","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - CMS Administrator role required","content":{"application/json":{}}}}}},"/api/v1/configuration/locale":{"put":{"tags":["System Configuration"],"summary":"Save company locale info","description":"Updates the locale (language and timezone) for the current company. This sets the default language and timezone for the system.","operationId":"saveLocaleInfo","requestBody":{"description":"Locale settings to apply","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyLocaleForm"}}},"required":true},"responses":{"200":{"description":"Locale settings updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCompanyConfigView"}}}},"400":{"description":"Invalid locale parameters (e.g. invalid timezone)","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - CMS Administrator role required","content":{"application/json":{}}}}}},"/api/v1/containers/_archive":{"put":{"tags":["Containers"],"summary":"Archives a container","description":"Archives the specified container. The user must have Edit permissions on the container.","operationId":"archiveContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier to archive","schema":{"type":"string"}}],"responses":{"200":{"description":"Container archived successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Container ID is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks edit permissions"},"404":{"description":"Container not found"}}}},"/api/v1/containers/_bulkarchive":{"put":{"tags":["Containers"],"summary":"Archives multiple containers","description":"Archives a list of containers by their identifiers. Returns a summary of successful and failed archive operations. The user must have Edit permissions on each container.","operationId":"bulkArchiveContainers","requestBody":{"description":"List of container identifiers to archive","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Bulk archive results with success and failure counts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBulkResultView"}}}},"400":{"description":"Bad request - Container identifiers list is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks edit permissions"}}}},"/api/v1/containers/_bulkdelete":{"delete":{"tags":["Containers"],"summary":"Deletes multiple containers","description":"Deletes a list of containers by their identifiers. Returns a summary of successful and failed deletions. The user must have Edit permissions on each container.","operationId":"bulkDeleteContainers","requestBody":{"description":"List of container identifiers to delete","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Bulk delete results with success and failure counts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBulkResultView"}}}},"400":{"description":"Bad request - Container identifiers list is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"}}}},"/api/v1/containers/_bulkpublish":{"put":{"tags":["Containers"],"summary":"Publishes multiple containers","description":"Publishes a list of containers by their identifiers. Returns a summary of successful and failed publish operations. The user must have Publish permissions on each container.","operationId":"bulkPublishContainers","requestBody":{"description":"List of container identifiers to publish","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Bulk publish results with success and failure counts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBulkResultView"}}}},"400":{"description":"Bad request - Container identifiers list is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks publish permissions"}}}},"/api/v1/containers/_bulkunarchive":{"put":{"tags":["Containers"],"summary":"Unarchives multiple containers","description":"Unarchives a list of containers by their identifiers. Returns a summary of successful and failed unarchive operations. The user must have Edit permissions on each container.","operationId":"bulkUnarchiveContainers","requestBody":{"description":"List of container identifiers to unarchive","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Bulk unarchive results with success and failure counts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBulkResultView"}}}},"400":{"description":"Bad request - Container identifiers list is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks edit permissions"}}}},"/api/v1/containers/_bulkunpublish":{"put":{"tags":["Containers"],"summary":"Unpublishes multiple containers","description":"Unpublishes a list of containers by their identifiers. Returns a summary of successful and failed unpublish operations. The user must have Publish permissions on each container.","operationId":"bulkUnpublishContainers","requestBody":{"description":"List of container identifiers to unpublish","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"Bulk unpublish results with success and failure counts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBulkResultView"}}}},"400":{"description":"Bad request - Container identifiers list is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks publish permissions"}}}},"/api/v1/containers/{containerId}/content/{contentletId}":{"get":{"tags":["Containers"],"summary":"Renders content HTML within a container","description":"Generates the rendered HTML for a specific contentlet within a container. The container ID is provided as a path parameter.","operationId":"getContainerContentById","parameters":[{"name":"containerId","in":"path","description":"Container identifier (UUID or path)","required":true,"schema":{"type":"string"}},{"name":"contentletId","in":"path","description":"Contentlet identifier","required":true,"schema":{"type":"string"}},{"name":"pageInode","in":"query","description":"Page inode for context rendering","schema":{"type":"string"}}],"responses":{"200":{"description":"Content rendered successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityContainerObjectMapView"}}}},"400":{"description":"Bad request - Invalid parameters"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Container or contentlet not found"}}}},"/api/v1/containers/content/{contentletId}":{"get":{"tags":["Containers"],"summary":"Renders content HTML with container ID as query param","description":"Generates the rendered HTML for a specific contentlet within a container. The container ID is passed as a query parameter, which is useful for file-asset containers where the container ID is a path.","operationId":"getContainerContentByQueryParam","parameters":[{"name":"containerId","in":"query","description":"Container identifier (UUID or file-asset path)","schema":{"type":"string"}},{"name":"pageInode","in":"query","description":"Page inode for context rendering","schema":{"type":"string"}},{"name":"contentletId","in":"path","description":"Contentlet identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Content rendered successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityContainerObjectMapView"}}}},"400":{"description":"Bad request - Invalid parameters"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Container or contentlet not found"}}}},"/api/v1/containers/{containerId}/form/{formId}":{"get":{"tags":["Containers"],"summary":"Renders a form within a container","description":"Returns HTML content for a form rendered within the specified container. This is used to display forms with container styling and layout.","operationId":"containerForm","parameters":[{"name":"containerId","in":"path","description":"Container identifier (UUID or path)","required":true,"schema":{"type":"string"}},{"name":"formId","in":"path","description":"Form identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Form rendered successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityContainerObjectMapView"}}}},"400":{"description":"Bad request - Invalid container or form ID"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Container or form not found"},"500":{"description":"Internal server error"}}}},"/api/v1/containers/form/{formId}":{"get":{"tags":["Containers"],"summary":"Renders a form with container ID as query param","description":"Returns HTML content for a form rendered within the specified container. The container ID is passed as a query parameter, which is useful for file-asset containers where the container ID is a path.","operationId":"getContainerFormByQueryParam","parameters":[{"name":"containerId","in":"query","description":"Container identifier (UUID or file-asset path)","schema":{"type":"string"}},{"name":"formId","in":"path","description":"Form identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Form rendered successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityContainerObjectMapView"}}}},"400":{"description":"Bad request - Invalid parameters"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Container or form not found"}}}},"/api/v1/containers/{id}/_copy":{"post":{"tags":["Containers"],"summary":"Copies a container to the current host","description":"Creates a copy of the specified container on the current host. The user must have backend access and appropriate permissions.","operationId":"copyContainer","parameters":[{"name":"id","in":"path","description":"Container identifier to copy","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Container copied successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityContainerView"}}}},"400":{"description":"Bad request - Container ID is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Container not found"}}}},"/api/v1/containers":{"get":{"tags":["Containers"],"summary":"Retrieves a paginated list of Containers","description":"Returns a list of Container objects based on filtering and pagination parameters. Containers are layout components that define how content is displayed on pages.","operationId":"getContainers","parameters":[{"name":"filter","in":"query","description":"Filter containers by title pattern","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number for pagination (starting from 1)","schema":{"type":"integer","format":"int32"}},{"name":"per_page","in":"query","description":"Number of items per page","schema":{"type":"integer","format":"int32"}},{"name":"orderby","in":"query","description":"Field to order results by","schema":{"type":"string","default":"title"}},{"name":"direction","in":"query","description":"Sort direction: ASC or DESC","schema":{"type":"string","default":"ASC"}},{"name":"host","in":"query","description":"Filter containers by host ID","schema":{"type":"string"}},{"name":"system","in":"query","description":"Include system containers in results","schema":{"type":"boolean"}},{"name":"archive","in":"query","description":"Include archived containers in results","schema":{"type":"boolean"}},{"name":"content_type","in":"query","description":"Filter containers by content type ID or variable name","schema":{"type":"string"}}],"responses":{"200":{"description":"Containers retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityPaginatedArrayListMapView"}}}},"400":{"description":"Bad request - Invalid parameters"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"500":{"description":"Internal server error"}}},"put":{"tags":["Containers"],"summary":"Updates an existing container","description":"Updates a container's working version with the provided configuration. The container must exist and the user must have edit permissions.","operationId":"updateContainer","requestBody":{"description":"Updated container configuration data including identifier and modified properties","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerForm"}}},"required":true},"responses":{"200":{"description":"Container updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Invalid container data"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks edit permissions"},"404":{"description":"Container not found"},"500":{"description":"Internal server error"}}},"post":{"tags":["Containers"],"summary":"Creates a new container","description":"Creates and publishes a new container with the provided configuration. The container will be saved as both working and live versions.","operationId":"saveContainer","requestBody":{"description":"Container configuration data including title, code, content type structures, and display settings","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerForm"}}},"required":true},"responses":{"200":{"description":"Container created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Invalid container data"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks create permissions"},"500":{"description":"Internal server error"}}},"delete":{"tags":["Containers"],"summary":"Deletes a container","description":"Permanently deletes the specified container. The user must have Edit permissions on the container.","operationId":"deleteContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier to delete","schema":{"type":"string"}}],"responses":{"200":{"description":"Container deletion result (true if deleted, false otherwise)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"400":{"description":"Bad request - Container ID is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks edit permissions"},"404":{"description":"Container not found"}}}},"/api/v1/containers/live":{"get":{"tags":["Containers"],"summary":"Retrieves a live container by ID","description":"Returns the live (published) version of a container. Optionally includes associated content type information.","operationId":"getLiveContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier","schema":{"type":"string"}},{"name":"includeContentType","in":"query","description":"Include associated content type information","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Live container retrieved successfully. Returns ContainerView by default, or ContainerWithContentTypesView if includeContentType=true.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Invalid container ID"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Live container not found"},"500":{"description":"Internal server error"}}}},"/api/v1/containers/working":{"get":{"tags":["Containers"],"summary":"Retrieves a working container by ID","description":"Returns the working (draft) version of a container. Optionally includes associated content type information.","operationId":"getWorkingContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier","schema":{"type":"string"}},{"name":"includeContentType","in":"query","description":"Include associated content type information","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Working container retrieved successfully. Returns ContainerView by default, or ContainerWithContentTypesView if includeContentType=true.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Invalid container ID"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Working container not found"},"500":{"description":"Internal server error"}}}},"/api/v1/containers/_publish":{"put":{"tags":["Containers"],"summary":"Publishes a container","description":"Makes a container live by publishing it. The container must exist and the user must have publish permissions.","operationId":"publishContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier to publish","schema":{"type":"string"}}],"responses":{"200":{"description":"Container published successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Container ID is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks publish permissions"},"404":{"description":"Container not found"},"500":{"description":"Internal server error"}}}},"/api/v1/containers/delete/{containerId}/content/{contentletId}/uid/{uid}":{"delete":{"tags":["Containers"],"summary":"Removes content from a container","description":"Removes a specific contentlet from a container at a particular position. This affects the container's content layout and rendering.","operationId":"removeContentletFromContainer","parameters":[{"name":"containerId","in":"path","description":"Container identifier","required":true,"schema":{"type":"string"}},{"name":"contentletId","in":"path","description":"Contentlet identifier","required":true,"schema":{"type":"string"}},{"name":"order","in":"query","description":"Order position of the content","schema":{"type":"integer","format":"int64"}},{"name":"uid","in":"path","description":"Unique identifier for the content instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Content removed successfully","content":{"application/json":{"schema":{"type":"string","description":"Confirmation string 'ok'"}}}},"400":{"description":"Bad request - Invalid parameters"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks required permissions"},"404":{"description":"Container, content, or UID not found"},"500":{"description":"Internal server error"}}}},"/api/v1/containers/_unarchive":{"put":{"tags":["Containers"],"summary":"Unarchives a container","description":"Unarchives the specified container, restoring it to active status. The user must have Edit permissions on the container.","operationId":"unarchiveContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier to unarchive","schema":{"type":"string"}}],"responses":{"200":{"description":"Container unarchived successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Container ID is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks edit permissions"},"404":{"description":"Container not found"}}}},"/api/v1/containers/_unpublish":{"put":{"tags":["Containers"],"summary":"Unpublishes a container","description":"Removes a container from live status by unpublishing it. The container must exist and the user must have unpublish permissions.","operationId":"unpublishContainer","parameters":[{"name":"containerId","in":"query","description":"Container identifier to unpublish","schema":{"type":"string"}}],"responses":{"200":{"description":"Container unpublished successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntitySingleContainerView"}}}},"400":{"description":"Bad request - Container ID is required"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks unpublish permissions"},"404":{"description":"Container not found"},"500":{"description":"Internal server error"}}}},"/api/v1/contentrelationships/{params}":{"get":{"tags":["Content"],"summary":"Get content with relationships (deprecated)","description":"Retrieves content with relationships based on query parameters, identifier, or inode. This endpoint is deprecated - use /v1/content with depth parameter instead.","operationId":"getContentRelationships","parameters":[{"name":"params","in":"path","description":"Query parameters, identifier, or inode for content lookup","required":true,"schema":{"pattern":".*","type":"string"}}],"responses":{"200":{"description":"Content with relationships retrieved successfully","content":{"application/json":{"schema":{"type":"object","description":"Content with relationships in JSON format including contentlets and their related content"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"500":{"description":"Internal server error","content":{"application/json":{}}}},"deprecated":true}},"/api/v1/contentreport/folder/{folder}":{"get":{"tags":["Content Report"],"summary":"Generate folder content report","description":"Generates a detailed report of the different Content Types living under a Folder and the number of content items for each type. Supports both folder ID and folder path (requires site parameter).","operationId":"getFolderContentReport","parameters":[{"name":"folder","in":"path","description":"Folder ID or path to generate the report for","required":true,"schema":{"pattern":".*","type":"string"}},{"name":"site","in":"query","description":"Site ID or key (required when using folder path)","schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number for pagination","schema":{"type":"integer","format":"int32"}},{"name":"per_page","in":"query","description":"Number of items per page","schema":{"type":"integer","format":"int32"}},{"name":"orderby","in":"query","description":"Field to order results by","schema":{"type":"string","default":"upper(name)"}},{"name":"direction","in":"query","description":"Sort direction (ASC or DESC)","schema":{"type":"string","default":"ASC"}}],"responses":{"200":{"description":"Content Report for the specified Folder ID/path, or an empty list if either the Folder doesn't exist, or no content is found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentReportView"}}}}}}},"/api/v1/contentreport/site/{site}":{"get":{"tags":["Content Report"],"summary":"Generate site content report","description":"Generates a detailed report of the different Content Types living under a Site and the number of content items for each type. Useful for data analysis and deletion planning.","operationId":"getSiteContentReport","parameters":[{"name":"site","in":"path","description":"Site ID or key to generate the report for","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","description":"Page number for pagination","schema":{"type":"integer","format":"int32"}},{"name":"per_page","in":"query","description":"Number of items per page","schema":{"type":"integer","format":"int32"}},{"name":"orderby","in":"query","description":"Field to order results by","schema":{"type":"string","default":"upper(name)"}},{"name":"direction","in":"query","description":"Sort direction (ASC or DESC)","schema":{"type":"string","default":"ASC"}}],"responses":{"200":{"description":"Content Report for the specified Site ID/Key, or an empty list if either the Site doesn't exist, or no content is found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseSiteVariablesEntityView"}}}}}}},"/api/v1/content/_canlock/{inodeOrIdentifier}":{"get":{"tags":["Content"],"summary":"Check if a contentlet can be locked","description":"Checks if the contentlet specified by its inode or identifier can be locked by the current user.","operationId":"canLockContent","parameters":[{"name":"inodeOrIdentifier","in":"path","description":"Contentlet inode or identifier","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","description":"Language ID for content localization","schema":{"type":"string","default":"-1"}}],"responses":{"200":{"description":"Successfully retrieved lock status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid User"},"403":{"description":"Forbidden"},"404":{"description":"Content not found"},"500":{"description":"Internal Server Error"}}}},"/api/v1/content/{identifier}/languages":{"get":{"tags":["Content"],"summary":"Check content language versions","description":"Retrieves all available languages for a contentlet and indicates which languages have content versions","operationId":"checkContentLanguageVersions","parameters":[{"name":"identifier","in":"path","description":"Identifier of contentlet whose language status to display.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Language versions retrieved successfully","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"404":{"description":"Not found - contentlet identifier not found","content":{"application/json":{}}}}}},"/api/v1/content/{identifier}/references/count":{"get":{"tags":["Content"],"summary":"Get contentlet references count","description":"Retrieves the total number of references to a specific contentlet by its identifier","operationId":"getContentletReferencesCount","parameters":[{"name":"identifier","in":"path","description":"Content identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"References count retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityCountView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"404":{"description":"Not found - contentlet with identifier not found","content":{"application/json":{}}}}}},"/api/v1/content/{inodeOrIdentifier}":{"get":{"tags":["Content"],"summary":"Retrieves a contentlet by identifier or inode","description":"Returns a single contentlet based on its identifier or inode. This is the primary endpoint for fetching content data with support for language, variants, and relationship depth.","operationId":"getContent","parameters":[{"name":"inodeOrIdentifier","in":"path","description":"Contentlet identifier or inode","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","description":"Language ID for content localization","schema":{"type":"string","default":""}},{"name":"variantName","in":"query","description":"Variant name for A/B testing","schema":{"type":"string","default":"DEFAULT"}},{"name":"depth","in":"query","description":"Relationship depth to include (-1 for no relationships)","schema":{"type":"integer","format":"int32","default":-1}}],"responses":{"200":{"description":"Contentlet retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"}}}},"400":{"description":"Bad request - Invalid identifier format"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks read permissions"},"404":{"description":"Contentlet not found"},"500":{"description":"Internal server error"}}}},"/api/v1/content/{inodeOrIdentifier}/references":{"get":{"tags":["Content"],"summary":"Get contentlet references","description":"Retrieves all references to a specific contentlet, including pages, containers, and personas that reference it","operationId":"getContentletReferences","parameters":[{"name":"inodeOrIdentifier","in":"path","description":"Content inode or identifier","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","description":"Language ID for content localization","schema":{"type":"string","default":""},"example":1}],"responses":{"200":{"description":"References retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityContentReferenceListView"}}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"403":{"description":"Forbidden - user lacks read permission on the contentlet","content":{"application/json":{}}},"404":{"description":"Not found - contentlet not found","content":{"application/json":{}}}}}},"/api/v1/content/{identifier}/push/history":{"get":{"tags":["Content"],"summary":"Contentlet Push History","description":"Returns the push history of a contentlet","operationId":"getContentletPushHistory","parameters":[{"name":"identifier","in":"path","description":"ID of the Contentlet whose push history will be retrieved.","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum number or results being returned, for pagination purposes.","schema":{"type":"integer","format":"int32"}},{"name":"offset","in":"query","description":"Page number of the results being returned, for pagination purposes.","schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"History data retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityPaginatedDataView"}}}},"401":{"description":"Authentication required.","content":{"application/json":{}}},"404":{"description":"The specified identifier does not match any contentlet.","content":{"application/json":{}}},"500":{"description":"An internal dotCMS error has occurred.","content":{"application/json":{}}}}}},"/api/v1/content/_lock/{inodeOrIdentifier}":{"put":{"tags":["Content"],"summary":"Lock a given contentlet by the current user","description":"If the user is allowed to lock the contentlet specified by its inode or identifier, the contentlet will be locked.","operationId":"lockContent","parameters":[{"name":"inodeOrIdentifier","in":"path","description":"Contentlet inode or identifier","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","description":"Language ID for content localization","schema":{"type":"string","default":"-1"}}],"responses":{"200":{"description":"Successfully locked contentlet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityMapView"}}}},"400":{"description":"Bad request"},"401":{"description":"Invalid User"},"403":{"description":"Forbidden"},"404":{"description":"Content not found"},"500":{"description":"Internal Server Error"}}}},"/api/v1/content/related":{"post":{"tags":["Content"],"summary":"Pull Related Content","description":"Retrieves related content for a contentlet based on relationship field configuration and query conditions","operationId":"pullRelatedContent","requestBody":{"description":"Pull related content request parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PullRelatedForm"}}},"required":true},"responses":{"200":{"description":"Related content retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityListMapView"}}}},"400":{"description":"Bad request - contentlet does not have a relationship field","content":{"application/json":{}}},"401":{"description":"Unauthorized - authentication required","content":{"application/json":{}}},"404":{"description":"Not found - contentlet not found","content":{"application/json":{}}}}}},"/api/v1/content/_refresh/{identifierOrInode}":{"put":{"tags":["Content"],"summary":"Refresh a contentlet","description":"Reindexes and clears cache for the contentlet specified by its identifier or inode. This operation forces the content to be refreshed in both the search index and application cache.","operationId":"refreshContent","parameters":[{"name":"identifierOrInode","in":"path","description":"Contentlet identifier or inode","required":true,"schema":{"type":"string"}},{"name":"language","in":"query","description":"Language ID for content localization","schema":{"type":"string","default":"-1"}}],"responses":{"200":{"description":"Successfully refreshed contentlet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseEntityBooleanView"}}}},"400":{"description":"Bad request - Invalid identifier format"},"401":{"description":"Unauthorized - User not authenticated"},"403":{"description":"Forbidden - User lacks write permissions"},"404":{"description":"Content not found"},"500":{"description":"Internal Server Error"}}}},"/api/v1/content/_draft":{"put":{"tags":["Content"],"summary":"Saves a content draft","description":"Creates or updates a draft version of a contentlet without triggering workflow. Drafts allow content editors to save work in progress without publishing.\n\n**Block Editor (Story Block) fields:** send the value as a **Markdown or HTML** string — you do not need to hand-author the underlying ProseMirror/JSON document. dotCMS converts it to the Block Editor (ProseMirror JSON) structure automatically on save, so the field reads back as structured content with no editor round-trip required. A value that is already a valid Tiptap/ProseMirror JSON document is detected and stored unchanged. Example: `\"body\": \"## Intro\\n\\nHello **world**.\"`.\n\n**Rich blocks in Markdown:** blocks that plain Markdown cannot express are written as fenced code blocks whose info string is a `dotcms-*` label and whose body is a small JSON object. Example — embed a contentlet:\n\n```dotcms-content\\n{\"identifier\": \"| `query` | A simple query returning full or partial matches. |
| `types` | A comma-separated list of specific content type variables. |
| `sites` | A comma-separated list of site identifiers or keys. |