# Cohesivo Developer Documentation > Developer documentation for Cohesivo. # Cohesivo Developer Documentation # Cohesivo Developer Documentation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ## How to start? [Go through the First steps](https://doc.ibexa.co/en/saas/getting_started/first_steps/index.md) [Explore the APIs](https://doc.ibexa.co/en/saas/api/api/index.md) [Read the Product guides](https://doc.ibexa.co/en/saas/product_guides/product_guides/index.md) ## What's new in Cohesivo Cohesivo is delivered as a service, so new capabilities reach you without an upgrade project. The release notes list what has been delivered. [Release notes](https://doc.ibexa.co/en/saas/release_notes/index.md) ## Looking for the on-premise product? Cohesivo is also available as an on-premise, self-hosted product that you install and extend yourself. It has its own documentation. [About on-premise Cohesivo](https://doc.ibexa.co/en/saas/on_premise/index.md) ## What Cohesivo does ### [Content](https://doc.ibexa.co/en/saas/content_management/content_management/index.md) - [Content model](https://doc.ibexa.co/en/saas/content_management/content_model/index.md) - [Pages](https://doc.ibexa.co/en/saas/content_management/pages/pages/index.md) - [Forms](https://doc.ibexa.co/en/saas/content_management/forms/forms/index.md) - [RichText and Online Editor](https://doc.ibexa.co/en/saas/content_management/rich_text/rich_text/index.md) - [Images](https://doc.ibexa.co/en/saas/content_management/images/images/index.md) - [Taxonomy](https://doc.ibexa.co/en/saas/content_management/taxonomy/taxonomy/index.md) - [Editorial workflow](https://doc.ibexa.co/en/saas/content_management/workflow/workflow/index.md) ### [Sites and administration](https://doc.ibexa.co/en/saas/administration/administration/index.md) - [Multisite](https://doc.ibexa.co/en/saas/multisite/multisite/index.md) - [Site Factory](https://doc.ibexa.co/en/saas/multisite/site_factory/site_factory/index.md) - [Languages and translations](https://doc.ibexa.co/en/saas/multisite/languages/languages/index.md) - [URL management](https://doc.ibexa.co/en/saas/content_management/url_management/url_management/index.md) - [Back office](https://doc.ibexa.co/en/saas/administration/back_office/back_office/index.md) - [Users](https://doc.ibexa.co/en/saas/users/users/index.md) - [Permissions](https://doc.ibexa.co/en/saas/permissions/permissions/index.md) ### [Products and customers](https://doc.ibexa.co/en/saas/product_catalog/product_catalog/index.md) - [Products](https://doc.ibexa.co/en/saas/product_catalog/products/index.md) - [Catalogs](https://doc.ibexa.co/en/saas/product_catalog/catalogs/index.md) - [Prices](https://doc.ibexa.co/en/saas/product_catalog/prices/index.md) - [Quable integration](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md) - [Customer Portal](https://doc.ibexa.co/en/saas/customer_management/customer_portal/index.md) - [Data collection with Qualifio](https://doc.ibexa.co/en/saas/qualifio/qualifio/index.md) ### [APIs, search, and AI](https://doc.ibexa.co/en/saas/api/api/index.md) - [REST API](https://doc.ibexa.co/en/saas/api/api/index.md) - [REST API authentication](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_authentication/index.md) - [Search](https://doc.ibexa.co/en/saas/search/search/index.md) - [AI Actions](https://doc.ibexa.co/en/saas/ai/ai_actions/ai_actions/index.md) - [MCP servers](https://doc.ibexa.co/en/saas/ai/mcp/mcp/index.md) - [Recommendations](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector/index.md) - [Customer Data Platform](https://doc.ibexa.co/en/saas/raptor_cdp/raptor_cdp/index.md) ## Most popular pages - [RichText and Online Editor](https://doc.ibexa.co/en/saas/content_management/rich_text/rich_text/index.md) - [Content model](https://doc.ibexa.co/en/saas/content_management/content_model/index.md) - [Images](https://doc.ibexa.co/en/saas/content_management/images/images/index.md) - [Page blocks](https://doc.ibexa.co/en/saas/content_management/pages/page_blocks/index.md) # Cohesivo editions # Cohesivo On-premise > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo On-premise TODO: Combine Headless, Experience, Commerce into a product guide for On-Premise # Cohesivo editions > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Learn more about various Cohesivo editions' features to help yourself choose the right one for your project. Three Cohesivo product editions are available to help you accelerate your digital transformation at the speed and cost that work best for you. - [Ibexa Headless edition product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ibexa_products/ibexa_headless/): Get to know Ibexa Headless - an edition that focuses on content management. - [Ibexa Experience edition product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ibexa_products/ibexa_experience/): Learn about all the main attributes, features, and benefits of the customer-focused Ibexa Experience edition. ## Feature comparison Compare all features available in Ibexa Headless, Ibexa Experience, and Ibexa Commerce to help you choose the right products for your needs: | Feature | Ibexa Headless | Ibexa Experience | Ibexa Commerce | | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------- | ---------------- | -------------- | | [Content model](https://doc.ibexa.co/en/saas/content_management/content_model/index.md) | Yes | Yes | Yes | | [AI Actions](https://doc.ibexa.co/en/saas/ai/ai_actions/ai_actions_guide/index.md) | Yes | Yes | Yes | | [User management](https://doc.ibexa.co/en/saas/users/user_management_guide/index.md) | Yes | Yes | Yes | | [Focus Mode](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/discover_ui/#focus-mode) | Yes | Yes | Yes | | [Image editor](https://doc.ibexa.co/projects/userguide/en/saas/image_management/edit_images/) | Yes | Yes | Yes | | [Content scheduler](https://doc.ibexa.co/projects/userguide/en/saas/content_management/schedule_publishing/) | Yes | Yes | Yes | | [SEO](https://doc.ibexa.co/projects/userguide/en/saas/search_engine_optimization/seo/) | Yes | Yes | Yes | | [Content translation](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/) | Yes | Yes | Yes | | [Search](https://doc.ibexa.co/projects/userguide/en/saas/search/search_for_content/) | Yes | Yes | Yes | | [Editorial workflow](https://doc.ibexa.co/projects/userguide/en/saas/content_management/workflow_management/editorial_workflow/) | Yes | Yes | Yes | | [Digital Asset Management](https://doc.ibexa.co/projects/userguide/en/saas/dam/ibexa_dam/) | Yes | Yes | Yes | | [Product catalog capabilities](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/product_catalog/) | Yes | Yes | Yes | | [Date and time attribute type](https://doc.ibexa.co/en/saas/product_catalog/attributes/date_and_time/index.md) | Yes | Yes | Yes | | [Symbol attribute type](https://doc.ibexa.co/en/saas/product_catalog/attributes/symbol_attribute_type/index.md) | Yes | Yes | Yes | | [Recommendations](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector_guide/index.md) | Yes | Yes | Yes | | Migrations | Yes | Yes | Yes | | [Ibexa Connect](https://doc.ibexa.co/projects/connect/en/latest/) | Yes | Yes | Yes | | OAuth client | Yes | Yes | Yes | | OAuth Server | Yes | Yes | Yes | | [Site Factory](https://doc.ibexa.co/en/saas/multisite/site_factory/site_factory/index.md) | | Yes | Yes | | [Customizable Dashboard](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/dashboard/work_with_dashboard/#customize-dashboard) | | Yes | Yes | | [Page Builder](https://doc.ibexa.co/en/saas/content_management/pages/page_builder_guide/index.md) | | Yes | Yes | | [Form Builder](https://doc.ibexa.co/en/saas/content_management/forms/form_builder_guide/index.md) | | Yes | Yes | | [Scheduler tab](https://doc.ibexa.co/projects/userguide/en/saas/content_management/schedule_publishing/#scheduler-tab) | | Yes | Yes | | [Content Scheduler block](https://doc.ibexa.co/projects/userguide/en/saas/content_management/schedule_publishing/#content-scheduler-block) | | Yes | Yes | | [Corporate account management](https://doc.ibexa.co/projects/userguide/en/saas/customer_management/manage_customers/) | | Yes | Yes | | [Customer Portal](https://doc.ibexa.co/en/saas/customer_management/customer_portal_guide/index.md) | | Yes | Yes | | [Segments](https://doc.ibexa.co/en/saas/administration/admin_panel/segments_admin_panel/index.md) | | Yes | Yes | | [Recent activity](https://doc.ibexa.co/en/saas/administration/recent_activity/recent_activity/index.md) | | Yes | Yes | | [Qualifio add-on](https://doc.ibexa.co/projects/userguide/en/saas/qualifio/qualifio/) | | Yes | Yes | | [Raptor CDP (Customer Data Platform) add-on](https://doc.ibexa.co/en/saas/raptor_cdp/raptor_cdp_guide/index.md) | | Yes | Yes | ## LTS Updates LTS Updates are opt-in packages that bring additional features to the LTS releases that they enhance. The features brought by LTS Updates become standard parts of the next LTS release. | Feature | Ibexa Headless | Ibexa Experience | Ibexa Commerce | | -------------------------------------------------------------------------------------------------------------------------------- | -------------- | ---------------- | -------------- | | [Integrated help](https://doc.ibexa.co/en/saas/administration/back_office/integrated_help/index.md) | Yes | Yes | Yes | | [MCP servers](https://doc.ibexa.co/en/saas/ai/mcp/mcp_guide/index.md) | Yes | Yes | Yes | | [Translations management](https://doc.ibexa.co/en/saas/multisite/translations_management/translations_management_guide/index.md) | Yes | Yes | Yes | # Ibexa Headless edition product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Get to know Ibexa Headless - an edition that focuses on content management. ## What is Ibexa Headless The Headless edition of Cohesivo focuses on content management. It provides tools to collaboratively create content, and interfaces (API) to distribute this content. Multilingual, multichannel, extensible, Ibexa Headless is an advanced Content Management Framework (CMF) with product catalog capabilities, and a Digital Asset Management (DAM) repository. It's provided without a default front office, but with a complete back office and several APIs to manage and access content. ## Availability To start using Ibexa Headless you must purchase a product license. For more information, see [Ibexa Headless license pricing](https://www.ibexa.co/products/pricing?tab=1). You can [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [contact one of our partners](https://www.ibexa.co/partners). ## How it works ### Editorial stage You access with any web browser from any platform to a rich back office, the main place to - define users and their rights (for example, customers, subscribers, or editors), - organize content (content types, fields, tree, tags, languages, and more), - edit content in a collaborative workplace with versions and workflows. Then, content is available to end users through REST, GraphQL, or every output you can imagine like websites or apps. ### Technical backstage When you have a license, you install Ibexa Headless through Composer on an architecture including at least a web server with PHP and a relational database server. For performance, several bricks can be added to your stack such as a reverse proxy or a search engine. Ibexa Headless is based on Symfony. Any Symfony developer, or even PHP developer, can quickly learn how to extend it with the help of an online documentation. By using a version control system and environment variables, you can deploy your configuration and extensions on several environments including Ibexa Cloud. Standard web APIs and [Ibexa Connect](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_connect/) help establish interoperability, even if you aren't an advanced developer. APIs summary: - The REST and GraphQL APIs give access to the content in standardized ways. - The OAuth 2 Client and Server allow to connect to an SSO or be the SSO. - The design engine and its theme templates mechanism allows to serve the content in several shapes. - The PHP API opens Ibexa Headless to extendability to fit your needs. For example, content can be computed, edited, or served in specific ways such as scheduled/live imports/exports, automated edition tasks, or specific controllers to communicate with other applications. ## Capabilities and benefits Ibexa Headless is a tool box with a back office. It comes without a default front office. You don't lose time to develop a theme for a provided front office before discovering it doesn't fit your needs. No distraction. Ibexa Headless helps you focus on the content, create and organize with its straightforward user interface (UI), imagine its inputs/outputs, and implement them with its various layers' APIs. ### Core features The core of Ibexa Headless offers everything to structure your content repositories and access them. #### Content model Content modeling and management are the foundation of Cohesivo with the following main layers: - Content items are organized as a tree in a repository. - An item can have multiple locations in this tree. - Content items are typed. - Content types are sets of typed data fields, with optional conditions on the possible values. - Rich Text field type comes with an [online editor](https://doc.ibexa.co/en/saas/content_management/rich_text/online_editor_guide/index.md). - Multilingual, it can store a content in several languages, the content model defines which field must be translated, and which don't vary. For more information, see [Content management product guide](https://doc.ibexa.co/en/saas/content_management/content_management_guide/index.md). #### User management User and user group rights are set by roles with thin granular limited permission policies in a safe deny-by-default security system. Users are content items as well, so your knowledge about content management is reused. For more information, see [User management product guide](https://doc.ibexa.co/en/saas/users/user_management_guide/index.md). #### Content access There are many paths to access the content in many shapes: - The REST API and GraphQL API support access to, and edition of the content. - Ibexa Headless offers a complete PHP API to extend the ways to access content. - A design engine and a view controller offer to create plain text content views (such as HTML, JSON, XML, CSS, JS, CSV, or Markdown), and to factorize those views by using theme cascades. This design engine is used in the back office which is equally extendable. - Multichannel, content can be accessed through several channel configurations, such as the domain name it replies to, the sub-part of the content tree it starts from, the users rights, or the design theme. The back office itself is such a channel. - Multi-repository, the same platform can use separate databases if data isolation is needed between channel groups. ### Advanced features On top of this strong core, Ibexa Headless brings tools to increase user experience, from final front users to back office contributors. #### Complete platform Ibexa Headless is a complete platform, which comes with the following components to enhance user's journey: - [Recommendations](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector_guide/index.md) connector, which allows you to recommend content to end users according to their behavior, or, when authenticated, by matching with their segment/group. - Content scheduler, which allows you to establish the future of the content and use events to have a living front application, even when the editorial team is absent or reduced. This way, visitors can discover new content at midnight, during weekends or vacations. A calendar summarises those scheduled content events. Like everything in the back office, the calendar is extendable: you can add an event source to coordinate content events with other company events. #### Many ways to structure and organize content [Product catalog](https://doc.ibexa.co/en/saas/product_catalog/product_catalog_guide/index.md) helps organize complex products and their catalogs: - Products are organized by using product types, variants, catalogs, categories, and tags. - Product attributes are grouped and factorized among product types. For example, fabric + color + size can be shared by many clothing product types. - Product variants can rapidly be created by the automatic declination of attributes that have a defined set of values. - With taxonomy, you can tag content items to organize them by topics in a much intuitive way for the editor than a content tree with multiple locations would. Tags themselves are organized in a tree. Tag organization can be handled by a supervisor who doesn't need to move content items around a corporate content tree. At search time, tags can be keywords with a high value in relevance score to help the end user having results closer to the searched topic. #### Collaboration Several features help end users collaborate on the content, such as: - Version comparison helps track changes and solve concurrent editing conflicts. - Workflows helps with collaborative editing chain. A built-in “Quick review“ workflow allows an editor to send a content draft to a colleague for review, and comment or publishing. But, as a framework, more complex workflows can be imagined, with several steps and paths, even some automated tasks. #### Accelerated content editing - Ibexa Headless's content tree has several actions available directly on its items. For example, no need to open a content to hide it, you can do it directly from the content tree. - An Image Editor offers to crop and flip images. When serving the image in various context, you can even set a focal point to indicate to automated cropping which part of the image should be kept. - A Digital Asset Management (DAM) helps you crawl through your image resources to use and reuse them in your content. And a DAM connector allows you to search for images hosted on third party DAM servers. - [AI Actions](https://doc.ibexa.co/en/saas/ai/ai_actions/ai_actions_guide/index.md) help you automate time-consuming editorial tasks. #### Network integration ##### Intranets and extranets - Ibexa Connect's role is to create application interconnections with low code and drag-and-drop, in a compelling visual interface. Complex data flows can be easily implemented with a huge library of connectors and actions for famous to specific applications. For more information, see [Ibexa Connect product guide](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_connect/). - An OAuth 2 server offers the possibility to use the platform as the authentication service for other applications. - An OAuth 2 client supports authentication with a third-party OAuth 2 server. - A DAM Connector, previously mentioned, helps to access any image repository when needing to illustrate a content. - Ibexa Headless uses Solr as its search engine, which powers full-text search, Search Criteria, Sort Clauses, and aggregations. - Ibexa Headless offers to export and import from command line part of the content model or content items. For example, it can be used to move new content types and items from a staging instance to the production one. ##### Internet, delivery, web search engines, and social networks - Ibexa Headless comes with the support of Fastly content delivery network (CDN). The HTTP cache varies on current user's role and is purged when content changes. With its huge network of points of presence (POP) around the world, Fastly is quickly delivering cached content from nearest server for a better user experience. - A Search Engine Optimization (SEO) field implements best practices about web search engine indexing and social network sharing. It covers canonical URLs which are mandatory if multiple locations are used for a same content item to avoid duplicate content, Open Graph protocol to better describe a content item to social networks and search engine, and Twitter Cards. ## Use cases As a content repository with an omnipotent back office, many APIs to absorb, compute and distribute content, even a recommendation engine to deliver the right content to various readers, Ibexa Headless can be used in several cases. Here are few examples. ### Brick and mortar, but with an online showcase If you prefer the human warmth of a retail store, if your products' numerous complex options should be discussed, or if you're not ready yet to sell online, Ibexa Headless helps to build an exposition of your product catalog and your philosophy, an online presence to keep earlier customers interested and gather new ones. It can be a structuring first step to test customer's adoption of your website, before increasing user experience with Ibexa Experience, and finally becoming an online store with Ibexa Commerce. ### Large network with multiple inputs and outputs Departments, subsidiaries, and even partners now produce content in the same repository from the same collaborative workspace. Thanks to migration feature and PHP API, existing content has been imported from previous repositories. Fine-tuned user rights and workflows ensure that each collaborator can focus on their own tasks without the risk to disturb the content model or content organization. Content is distributed on several websites and applications, some running on the Ibexa platform itself, some on third parties' servers, some as native mobile apps. Part of the content has multiple locations or is translated, and reused from place to place. While the back office offers to search into the whole repository, the front end apps have correctly circumscribed search capabilities. # Ibexa Experience edition product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Learn about all the main attributes, features, and benefits of the customer-focused Ibexa Experience edition. ## What is Ibexa Experience Ibexa Experience is a Cohesivo edition that focuses on the customer. It offers smooth consumer journey and great online experience. In everything you do, it places your clients first. With Experience edition you can empower Editors to quickly create new pages or personalized content, and improve their daily work. It also provides tools for using segmentation and targeting, and it can be widely used in B2B thanks its features and integrations. ## Availability To start using Ibexa Experience, you need to purchase a product license. For more information, see [Ibexa Experience license pricing](https://www.ibexa.co/products/pricing?tab=2). You can also [contact us](https://www.ibexa.co/about-ibexa/contact-us) or [one of our partners](https://www.ibexa.co/partners). ## How it works ### Technical backstage Ibexa Experience is based on [Symfony](https://symfony.com/doc/7.4). With a help of documentation and trainings, any developer familiar with Symfony or simply PHP may learn how to use available extension points and extend the platform. Ibexa Experience is built on top of [Ibexa Headless](https://doc.ibexa.co/en/saas/ibexa_products/ibexa_headless/index.md), therefore it includes all bundles, APIs, and [features that come with Headless edition](https://doc.ibexa.co/en/saas/ibexa_products/ibexa_headless/#core-features), but also more advanced features for digital experience management. Version control systems and environment variables allow you to deploy your projects and settings on several environments, such as Ibexa Cloud. ## Capabilities and benefits With Ibexa Experience you can focus on your customers and treat each one as a VIP. It has everything that you may need to offer a transformative digital experience, from developing new websites or portals, through eye-catching landing pages and personalized product suggestions, to managing SEO strategies across several locations. ### Core features Ibexa Experience comes with a variety of new features designed to help you create an exceptional customer experience. #### Page Builder Ibexa Experience brings the [Page Builder](https://doc.ibexa.co/en/saas/content_management/pages/page_builder_guide/index.md), a powerful visual tool that helps you design and modify pages, without requiring advanced technical skills. With its intuitive and user-friendly interface, you can develop pages, tailor content, and create perfectly targeted landing pages. You build pages from ready-to-use elements called blocks, which can be easily configured and customized to suit your needs. Before you start building a page, you also need to select a layout. It has a significant impact on how the content pieces in the drop zones are arranged. #### Form Builder [Form Builder](https://doc.ibexa.co/en/saas/content_management/forms/form_builder_guide/index.md) is an intuitive tool that allows you to transform user engagement on your website. With this tool, you can design, deploy, and manage online forms quickly. You can create a variety of forms that consist of different fields, including sign-up forms, surveys, or questionnaires. Additionally, you can monitor and manage the information obtained from website visitors and adjust your forms if needed. #### Site Factory [Site Factory](https://doc.ibexa.co/en/saas/multisite/site_factory/site_factory/index.md) is a site management interface, integrated with the back office. It enables you to configure new sites without leaving the administration interface and editing SiteAccess configuration. With this feature you can create and deploy multiple websites at lightning speed and at scale. It allows you to manage expenses and resources while industrializing your web presence. Additionally, together with localized information and tailored product catalogs and prices, it helps you to quickly enter new markets. #### Customizable dashboard Starting from Experience edition of Cohesivo you can [customize the dashboard](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/dashboard/work_with_dashboard/#customize-dashboard), and you do it with the Dashboard Builder. You can tailor dashboard to your specific needs by choosing from a set of widgets. You can easily preview the sections that you use more often and omit the less significant ones. #### Publish Later You can take complete control of where and when your content blocks are visible to your predefined audiences and [schedule content publication](https://doc.ibexa.co/projects/userguide/en/saas/content_management/schedule_publishing/). Ibexa Experience comes with a Publish Later feature that allows you to schedule personalized content and reach different user groups at optimal dates and times to boost performance. What's more, you can turn specific content pages and blocks on and off to meet the needs of your marketing campaigns and promotions. Publish Later feature combined with Page Builder allows you to see all changes that you plan for the future. To do it, just use the slider to see all the upcoming changes. #### Customer Portal Use the [Customer Portal](https://doc.ibexa.co/en/saas/customer_management/customer_portal/index.md) and customer management capabilities that come with it, to establish new corporate accounts, manage existing ones, and communicate with your partners within a personalized space. With the help of this feature, you can create customized areas that give users a smooth, integrated experience and provide them with access to a variety of resources, apps, and services from a single point of entry. Using this tool, your customers can change their organization details, invite and see members, self-register, and more. #### Segments [Segmentation](https://doc.ibexa.co/en/saas/administration/admin_panel/segments_admin_panel/index.md) allows you to split up the user base. By assigning users to segments, you can display specific content to selected visitors and tailor the content that they can see. One of the tools that you can use right out of the box is the Targeting block that is available in the Page Builder. Segmentation is also useful with the [Recommendations](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector_guide/index.md). You can assign users to different recommendation groups and create advanced logic with operators to provide your audience with the best recommendations. #### Raptor CDP (Customer Data Platform) [Raptor CDP](https://doc.ibexa.co/en/saas/raptor_cdp/raptor_cdp_guide/index.md) is an add-on available for the Experience edition of Cohesivo. To use it, you must make arrangements with Ibexa to define the initial configuration. Once you activate Raptor CDP, you can create complete customer profiles, including their interactions, behavior, and preferences. It helps you improve user engagement, conversion rates, and return on investment by segmenting your audience and delivering tailored campaigns and experiences. Additionally, you can manage and analyze campaigns, evaluate customer data, and identify the best ways to improve performance. By using Raptor CDP you can store and manage large volumes of customer data in a structured manner. This central data storage supports business growth with a scalable infrastructure, helping to futureproof your business. ![CDP](https://doc.ibexa.co/en/saas/raptor_cdp/img/cdp.png) #### Qualifio Another add-on available for the Experience edition is [Qualifio](https://doc.ibexa.co/en/saas/qualifio/qualifio/index.md). To use it, you must make arrangements with Ibexa to define the initial configuration, and then get and set up a user account. Qualifio is a data collection tool. It gives you the ability to use the [Qualifio](https://qualifio.com/) tools to engage your audiences. You can use Qualifio's existing templates and interactive elements, such as quizzes, pools, and forms, to create visually appealing, customized campaigns and collect important data. To promote your campaign, you can add a Campaign block to a page in Page Builder or embed a campaign within the Rich Text field by using a Campaign custom tag. ### Use cases With Ibexa Experience, your customers are the main focus of all that you do. It makes it simpler than ever to create the different touchpoints that your customers have with your brand, giving you the ability to guide them through your significant business procedures. #### Build new pages and integrated forms User interface of Ibexa Experience is intuitive and plain. With its new features - Page and Form Builder - you can build new pages or forms quickly efficiently. Page Builder comes with predefined layouts, blocks, and templates to streamline your design process, while Form Builder provides ready-to-use elements for easy form creation. You can integrate your custom forms and surveys into the website and reuse content from existing sites on new ones. With Site Factory, you can publish as many sites as you like, there are no limits. #### Target customers in their preferred channels To make your products attractive, you must remember each of your customers is unique and special, and tailor your marketing strategy to their needs and preferences. Ibexa Experience allows you to deliver personalized content and recommendations through different channels. With segmentation, you can define audiences to distribute specific content through the right channels, at the right time. Available add-ons give you even more possibilities. You can analyze customer behaviours, use interactive content, and collect important data. #### Build your future Planning and scheduling is a part of management. With scheduling tools available in Experience edition, you can prepare content publishing timetables, schedule how your website can evolve, and test or preview it before publication. Additionally, you can use editorial calendars for an easier collaboration. # Cohesivo SaaS product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Learn about all the main attributes, features, and benefits of the Cohesivo SaaS version. ## What is Cohesivo SaaS? Cohesivo SaaS is the fully managed version of Cohesivo for organizations that want to manage their content through the Cohesivo back office and deliver it to websites and other digital channels through APIs. Cohesivo SaaS is a good solution when you don't need custom platform code or heavy customization. It's designed for medium-sized mid-market B2B teams that run several brand sites across multiple languages. Cohesivo SaaS is headless-only - you input and manage content through the back office, and deliver it through the REST and MCP APIs. An agency or in-house team can build the front end, for example, in Next.js, and host it independently of Cohesivo SaaS. Ibexa operates the infrastructure and the application, while you provide the content and build your front end. You can configure everything that the back office exposes, including content types, Page Builder blocks, layout overrides, site settings, and other available configuration. There's no PHP to write, no Composer packages to install, no database scripts to run, and no server or filesystem access. ## Availability To access the Cohesivo SaaS instance, [contact the sales team](https://www.ibexa.co/about-ibexa/contact-us), who prepare a demo environment, and later provision the first account with administrator permissions during onboarding. The environment is ready for you within a single working day. Your administrator can then invite other members of the team, up to the number of seats included in the plan. To start using Cohesivo SaaS, you need to purchase a product license. For more information, see [Ibexa license pricing](https://www.ibexa.co/products/pricing). ## How does Cohesivo SaaS work? Cohesivo SaaS is a multi-tenant setup. Each organization uses an isolated database, search core, cache, and asset storage. Ibexa SSO provides preconfigured identity management and automatic user provisioning. Under the bonnet, Ibexa runs the infrastructure on [Upsun](https://upsun.com/) systems located in the EU and takes care of automatic upgrades, backups, disaster recovery, and monitoring. ![Cohesivo SaaS framework](https://doc.ibexa.co/en/saas/ibexa_products/img/saas_framework_purple.png "Cohesivo SaaS framework") You access a single environment, which is always a production one. While there are no staging or preview environments, you can limit access to different parts of the content structure by using [user permissions](https://doc.ibexa.co/projects/userguide/en/saas/permission_management/permission_system/). It's the same approach that is present in PaaS and on-premise projects, where you grant users access rights on the need-to-see basis, rather than by creating separate environments. From the administrator's standpoint, all configuration is done through the back office. This includes [content types](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_model/), [Page Builder blocks](https://doc.ibexa.co/projects/userguide/en/saas/content_management/block_reference/) and [layouts](https://doc.ibexa.co/projects/userguide/en/saas/content_management/configure_ct_field_settings/#available-page-layouts) exposed by the available configuration screens. Content is authored in the back office and delivered through the REST API and MCP server, with both interfaces secured out-of-the-box with OAuth2. Once you've received the first administrator account created, you can start setting up the content model, creating content and making it available through the APIs. ![Cohesivo SaaS operating principle](https://doc.ibexa.co/en/saas/ibexa_products/img/saas_principle_purple.png "Cohesivo SaaS operating principle") You're free to build and host your front end on a framework of your choice, which means that Ibexa can't estimate or control the time required to build the data-consuming application. ## Capabilities The following capabilities are available to every Cohesivo SaaS customer. Some capabilities integrate with other products in the wider Ibexa portfolio. In these cases, the integrated product, such as Raptor, Quable or Qualifio, requires its own license. ### Site Factory Configure, instantiate and manage websites [from the back office](https://doc.ibexa.co/projects/userguide/en/saas/website_organization/work_with_sites/). Sites can share content and assets, while granular [user permissions](https://doc.ibexa.co/projects/userguide/en/saas/permission_management/permission_system/) can be used to control access to particular parts of the content tree. ### Agentic AI With [AI Assistant](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/#ai-assistant) as the entry point, you can use an [MCP tool set](https://doc.ibexa.co/en/saas/ai/mcp/mcp_usage/#use-built-in-tools) identical across the Ibexa ecosystem. The MCP server allows AI tools and agents to interact with Cohesivo capabilities through a standardized interface rather than requiring a separate integration for each agent or tool. ### Secured remote MCP endpoint Cohesivo SaaS provides a secured, bi-directional MCP server out of the box. [AI agents](https://doc.ibexa.co/en/saas/ai/mcp/mcp_guide/index.md) can use the available tools to retrieve information from Cohesivo SaaS and, where supported, return modified content to the SaaS tenant. ### Automated translation Translate your content with [language management tools](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#manage-translation-services-and-language-pairs) such as AI-assisted machine translation, and use a [side-by-side editing view](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#side-by-side-translation-view) to review and edit translated content. ### Product catalog Use the built-in Product Information Management (PIM) capability to manage products and their specifications, attributes, variants, assets, pricing, availability, categories, catalogs, and completeness scoring. You can use the product catalog independently within Cohesivo SaaS, or connect it to third-party commerce platforms, including [Quable](https://www.quable.com/en). When the Quable connector is enabled, you can view, select and embed its products in Cohesivo SaaS, while you handle product management operations in Quable. ### Raptor CDP integration The Raptor connector provides an integration with the [Raptor recommendation engine](https://www.raptorservices.com/) and [Customer Data Platform](https://www.raptorservices.com/) to help you deliver personalized experiences across digital channels. ### Rich-text editing Use the advanced rich-text editing tools, such as the [Headless Page Builder](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_pages/). ### Back office-based configuration Configure your instance by setting up Content Types and Page Builder through back-office features. Compared to other variants of the Cohesivo range, there's no need to maintain YAML configuration or deploy platform changes. ### Webhooks Transfer data to and from Cohesivo SaaS in real time. ### Migration and growth If you're an existing Ibexa customer and have a PaaS or on-premise Cohesivo installation, or you're on a competitive solution, and you find Cohesivo SaaS attractive, Ibexa Professional Services and/or Certified Partners can help you draw a migration path and support you throughout the process. Cohesivo comes equipped with multiple remote APIs that can be used to streamline the migration where appropriate. In the future, should your project grow and need to be custom-tailored with broader than out-of-the-box functionality, migration to PaaS or on-premise installation is straightforward because Cohesivo SaaS uses the same codebase and content model. ## Benefits Cohesivo SaaS lets you focus on managing digital content and experiences without having to operate the Cohesivo platform itself. Ibexa takes care of the application and infrastructure, while you manage your content, configuration, and frontend applications. ### No platform team required With configuration through the back office, you don't have to worry about platform code changes, deployments or infrastructure maintenance. Ibexa operates the application and underlying infrastructure, including upgrades, backups, disaster recovery, and monitoring. Your team can focus on content, configuration and the frontend applications that consume it. ### Short time-to-value Onboarding is handled internally and can happen within one working day, including provisioning the tenant and setting up the first administrator account. From that point, you can start creating content immediately, and content can be consumed through the APIs as soon as it's available. While a complete client-facing website may take more time to be live, we call it "same-day time-to-first-content". ### One platform for multiple sites and languages Site Factory, content management and language management features provide a common back office for organizations that manage several websites and languages. You can share content and assets across sites, while you use granular user permissions to control access to particular parts of the content tree. ### Enterprise-grade reliability without overhead Cohesivo SaaS provides minimal downtime, 24/7 support, backups and disaster recovery up to the [Ibexa Cloud](https://www.ibexa.co/products/ibexa-cloud) standard, together with managed infrastructure and monitoring. You don't have to provision or maintain the infrastructure yourself. ### Secured APIs and MCP endpoint The REST API and MCP endpoints are secured and tenant-scoped out of the box. The authentication layer is provided by Ibexa, so you don't have to deal with its configuration. ### True multi-tenancy Each organization or tenant has isolated data, search and cache, as well as their own asset storage. This way you can use the service without having to operate a dedicated Cohesivo infrastructure yourself. ### Preconfigured identity Ibexa SSO provides preconfigured identity management and automatic user provisioning. Identity management is therefore available as part of the SaaS setup, so you don't need to configure it specifically for Cohesivo. ### Faster access to new capabilities Cohesivo SaaS follows the fastest release cycle, so new features land here before they reach PaaS and on-premise customers. ### EU data residency Cohesivo SaaS is always hosted on infrastructure located in the EU, ensuring strict legal compliance with the GDPR. This data residency model is specifically targeted at organizations that need to protect themselves from regulatory penalties, foreign government surveillance, and the loss of customer trust. Even if your company is located outside of the EU, it's a benefit rather than a limitation, as customers from anywhere in the world experience the same level of protection. ## Use case ### Mid-market B2B organization with multiple brand sites An EU-based hotelier company runs several boutique accommodations that are primarily targeted at B2B customers. A marketing team that consists of twelve people manages several websites that advertise their aesthetically distinct venues. Each of the websites is dedicated to a different clientele, but all must be available in multiple languages. With primarily visual storytelling in focus, websites that present photo galleries, room layouts, amenities, and dining menus, don't require custom code. At the same time, individual customer profiles can contain sensitive data, so the company prefers to use secure EU data residency. Ibexa provisions and manages the Cohesivo SaaS instance. The company receives administrator access during onboarding. It can then invite the remaining users up to the number of seats included in their licensing plan. With Cohesivo SaaS, the marketing team can add and edit content, and handle other configuration through the back office. The team can manage their websites through the Site Factory, share content and media assets between them where appropriate, and set user permissions to distinguish offerings and presences according to visitor type. Translation management tools help support the languages, while the available content and Page Builder templates allow the team to structure the sites without having to maintain any code. The company's digital agency builds the websites and hosts them independently. The agency builds and maintains Next.js-based front ends and consumes the content that comes from Cohesivo through the REST API. # Getting started # Getting started > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Get started working with Cohesivo by taking your first steps after you log in. To get started working with Cohesivo, see what first steps to take to familiarize yourself with the platform. - [First steps](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/getting_started/first_steps/): Take your first steps in Cohesivo after you log in to the back office. # First steps > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Take your first steps in Cohesivo after you log in to the back office. This page lists first steps you can take after you log in to Cohesivo for the first time. These steps are the most common actions you may need to take in a new site. ## Add a content type 1. In your browser, log in to the back office. 2. In the upper-right corner, click the avatar icon and in the drop-down menu disable the [Focus mode](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/discover_ui/#focus-mode). 3. Select content and go to content types. 4. Enter the content group and create a new content type. ![Creating a content type](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-create-ct.png) 5. Input the content type's name, for example "Blog Post", and identifier: `blog_post`. 6. Below, add a field definition of the type Text Line. Name it "Title" and give it identifier `title`. 7. Add another field definition: Text (type Rich text) with identifier `text`. > **Note: Note** > > Make sure all fields are marked as *Translatable*. This setting is required to enable [content translation](#add-a-language-and-translate-content) for all fields in the created content type. 8. Save the content type. For more information, see [Content model](https://doc.ibexa.co/en/saas/content_management/content_model/index.md). ## Create content 1. Go to the back office, select **Content** -> **Content structure**, and create a new content item by clicking **Create content**. ![Creating a Blog Post](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-create-content.png) 2. Select a Blog Post content type. Fill in the content item and publish it. Cohesivo is headless, so the published content item is delivered over HTTP rather than rendered by the platform. You can now fetch it with the REST API and display it in your own front end. For more information, see [REST API](https://doc.ibexa.co/en/saas/api/api/index.md) and [REST API authentication](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_authentication/index.md). ## SiteAccesses A SiteAccess is a named context in which a request is served. By using more than one SiteAccess you can serve several sites, or several versions of one site, from the same content. Each incoming request is assigned to a SiteAccess based on the input data. SiteAccesses can be gathered in groups, and many settings are SiteAccess-aware, which means that they can have a different value for each SiteAccess, and fall back to the value set for the group or for all SiteAccesses. For more information, see [Multisite](https://doc.ibexa.co/en/saas/multisite/multisite/index.md) and [SiteAccess](https://doc.ibexa.co/en/saas/multisite/siteaccess/siteaccess/index.md). ## Add a language and translate Content One of the most common use cases for SiteAccesses is having different language versions of a site. 1. Go to the back office and select **Admin** > **Languages**. Add a new language called "German", with the language code `ger-DE`. Make sure it's enabled. ![Creating a language](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-create-language.png) 2. Next, go to the **Content structure** and open the blog post you had created earlier. Switch to the **Translations** tab and add a new translation. ![Adding a translation](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-add-translation.png) 3. Select German as the target language and base the translation on the English source text. Edit the content item and publish it. The content item now exists in two languages. For more information, see [Languages](https://doc.ibexa.co/en/saas/multisite/languages/languages/index.md). ## Set up permissions To allow a group of users to edit only a specific content type (in this example, blog posts), you need to set up permissions for them. Users and user groups are assigned roles. A role can contain a number of policies, which are rules that permit the user to perform a specific function. Policies can be additionally restricted by limitations. 1. Go to **Admin** -> **Users**. Create a new user group (the same way you create regular content). Call the group "Bloggers". 2. In the new group create a user. Remember their username and password. Mark the user as "Enabled". ![Creating a User](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-create-user.png) 3. Go to **Admin** -> **Roles**. Create a new role called "Blogger". 4. Add the following policies to ensure the user can log in and access content: - `User/Login` - `Content/Read` - `Content/Versionread` - `Section/View` - `Content/Reverserelatedlist` When creating these policies, don't add any limitations and click **Save** to proceed. 5. Now add policies that allow the user to create and publish content, limited to Blog Posts: - `Content/Create` with limitation for content type Blog Post - `Content/Edit` with limitation for content type Blog Post - `Content/Publish` with limitation for content type Blog Post ![Adding limitations to a policy](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-policy-limitations.png) 6. In the **Assignments** tab assign the "Blogger" role to the "Bloggers" group. ![Assigning a role](https://doc.ibexa.co/en/saas/getting_started/img/first-steps-assign-roles.png) You can now log out and log in again as the new user. You're able to create Blog Posts only. For more information, see [Permissions](https://doc.ibexa.co/en/saas/permissions/permissions/index.md). # API # API > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo is an API-first product and provides APIs to handle content and repository information. Cohesivo is an API-first product and provides a REST API to handle content and repository information. - [REST API usage](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/api/rest_api/rest_api_usage/rest_api_usage/): The REST API covers objects in the Cohesivo Repository with regular and custom HTTP methods, such as GET or PUBLISH, and HTTP headers. - [MCP Servers](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/mcp/mcp/): Overview of MCP resources in Cohesivo # REST API usage > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The REST API covers objects in the Cohesivo Repository with regular and custom HTTP methods, such as GET or PUBLISH, and HTTP headers. The REST API in Cohesivo allows you to interact with the Cohesivo installation by using the HTTP protocol, following a [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) interaction model. Each resource (URI) interacts with a part of the system (like content, users or search). Every interaction with the repository that you can do from the back office can also be done with the REST API. The REST API uses HTTP methods (such as `GET` and `PUBLISH`), and HTTP headers to specify the type of request. ## OpenAPI support The REST API meets the [OpenAPI](https://www.openapis.org/) standard. You can download the OpenAPI specification in: - [YAML format](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/openapi.yaml) - [JSON format](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/openapi.json) Use the specification file with [available OpenAPI tools](https://tools.openapis.org/) to work faster with the API, for example, by generating libraries and clients for the API. ## URIs The REST API is designed in such a way that the client can explore the Repository without constructing any URIs to resources. Starting from the [root resource](#rest-root), every response includes further links (`href`) to related resources. ### URI prefix [REST reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html), for the sake of readability, uses no prefixes in the URIs. In practice, the `/api/ibexa/v2` prefixes all REST hrefs. This prefix immediately follows the domain. If you need to the select a SiteAccess, see the [`X-Siteaccess` HTTP header](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_requests/#siteaccess). ### URI parameters URI parameters (query string) can be used on some resources. They usually serve as options or filters for the requested resource. As an example, the request below would paginate the results and return the first 5 relations for version 3 of the content item 59: ```http GET /content/objects/59/versions/3/relations?limit=5 HTTP/1.1 Accept: application/vnd.ibexa.api.RelationList+xml ``` #### Working with value objects IDs Resources that accept a reference to another resource expect the reference to be given as a REST URI, not a single ID. For example, the URI requesting a list of user groups assigned to the role with ID 1 is: ```http GET /api/ibexa/v2/user/groups?roleId=/api/ibexa/v2/user/roles/1 HTTP/1.1 ``` ### REST root The `/` root route is answered by a reference list with the main resource routes and media-types. It's presented in XML by default, but you can also switch to JSON output. ```bash curl https://api.example.com/api/ibexa/v2/ curl -H "Accept: application/json" https://api.example.com/api/ibexa/v2/ ``` ### Country list Alongside regular Repository interactions, there is a REST service providing a list of countries with their names, [ISO-3166](https://en.wikipedia.org/wiki/ISO_3166) codes and International Dialing Codes (IDC). You can use it when presenting a country options list from any application. This country list's URI is `/services/countries`. The ISO-3166 country codes can be represented as: - two-letter code (alpha-2) — recommended as the general purpose code - three-letter code (alpha-3) — related to the country name - three-digit numeric code (numeric-3) — use it if you need to avoid using Latin script For details, see the [ISO-3166 glossary](https://www.iso.org/glossary-for-iso-3166.html). # REST requests > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). REST API requests can have a generic or a custom header. It defines additional options in the request, such as the accepted content type of response. ## Request method Depending on the HTTP method used, different actions are possible on the same resource. Example: | Action | Description | | --------------------------------------- | ------------------------------------------------------------------ | | `GET /content/objects/2/versions/3` | Fetches data about version #3 of content item #2 | | `PATCH /content/objects/2/versions/3` | Updates the version #3 draft of content item #2 | | `DELETE /content/objects/2/versions/3` | Deletes the (draft or archived) version #3 from content item #2 | | `COPY /content/objects/2/versions/3` | Creates a new draft version of content item #2 from its version #3 | | `PUBLISH /content/objects/2/versions/3` | Promotes the version #3 of content item #2 from draft to published | | `OPTIONS /content/objects/2/versions/3` | Lists all the methods usable with this resource, the 5 ones above | The following list of available methods gives an overview of the kind of action a method triggers on a resource, if available. For method action details per resource, see the [REST API reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html). | HTTP method | Status | Description | Safe | | -------------------------------------------------------------------- | -------- | ---------------------- | ---- | | [OPTIONS](https://datatracker.ietf.org/doc/html/rfc2616#section-9.2) | Standard | List available methods | Yes | | [GET](https://datatracker.ietf.org/doc/html/rfc2616#section-9.3) | Standard | Collect data | Yes | | [HEAD](https://datatracker.ietf.org/doc/html/rfc2616#section-9.4) | Standard | Check existence | Yes | | [POST](https://datatracker.ietf.org/doc/html/rfc2616#section-9.5) | Standard | Create an item | No | | [PATCH](https://datatracker.ietf.org/doc/html/rfc5789) | Custom | Update an item | No | | COPY | Custom | Duplicate an item | No | | [MOVE](https://datatracker.ietf.org/doc/html/rfc2518) | Custom | Move an item | No | | SWAP | Custom | Swap two locations | No | | PUBLISH | Custom | Publish an item | No | | [DELETE](https://datatracker.ietf.org/doc/html/rfc2616#section-9.7) | Standard | Remove an item | No | > **Note: Caution with custom HTTP methods** > > Using custom HTTP methods can cause issues with several HTTP proxies, network firewall/security solutions and simpler web servers. To avoid such issuess, REST API allows you to set these by using the HTTP header `X-HTTP-Method-Override` alongside the standard `POST` method instead of using a custom HTTP method. For example: `X-HTTP-Method-Override: PUBLISH` > > If applicable, both methods are always mentioned in the specifications. ### OPTIONS method Any REST API URI responds to an `OPTIONS` request. The response contains an [`Allow` header](https://www.rfc-editor.org/rfc/rfc9110.html#name-allow), which lists the methods accepted by the resource. ```bash curl -IX OPTIONS https://api.example.com/api/ibexa/v2/content/objects/1 ``` ```http OPTIONS /content/objects/1 HTTP/1.1 Host: api.example.com ``` ```http HTTP/1.1 200 OK Allow: PATCH,GET,DELETE,COPY ``` ```bash curl -IX OPTIONS https://api.example.com/api/ibexa/v2/content/locations/1/2 ``` ```http OPTIONS /content/locations/1/2 HTTP/1.1 Host: api.example.com ``` ```http HTTP/1.1 200 OK Allow: GET,PATCH,DELETE,COPY,MOVE,SWAP ``` ## Request headers You can use the following HTTP headers with a REST request: - [`Accept`](https://datatracker.ietf.org/doc/html/rfc2616#section-14.1) describing the desired response type and format - [`Content-Type`](https://datatracker.ietf.org/doc/html/rfc2616#section-14.17) describing the payload type and format - [`X-Siteaccess`](#siteaccess) specifying the target SiteAccess - `X-HTTP-Method-Override` allowing to pass a custom method while using `POST` method as previously seen in [HTTP method](#request-method) - [`Destination`](#destination) specifying where to move an item - [`X-Expected-User`](#expected-user) specifying the user needed for the request execution Other headers related to authentication methods can be found in [REST API authentication](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_authentication/index.md). ### SiteAccess To specify a SiteAccess when communicating with the REST API, provide a custom `X-Siteaccess` header. Otherwise, the default SiteAccess is used. The following example shows what could be a SiteAccess called `restapi` dedicated to REST API accesses: ```http GET / HTTP/1.1 Host: api.example.com Accept: application/vnd.ibexa.api.Root+json X-Siteaccess: restapi ``` One of the principles of REST is that the same resource (such as content item, location, content type) should be unique. It allows caching your REST API with a reverse proxy such as Varnish. If the same resource is available in multiple locations, cache purging is noticeably more complex. This is why SiteAccess matching with REST isn't enabled at URL level (or domain). ### Media types On top of methods, HTTP request headers allow you to personalize the request's behavior. On every resource, you can use the `Accept` header to indicate which format you want to communicate in, JSON or XML. This header is also used to specify the response type you want the server to send when multiple types are available. - `Accept: application/vnd.ibexa.api.Content+xml` to get `Content` (full data, fields included) as **[XML](https://www.w3.org/XML/)** - `Accept: application/vnd.ibexa.api.ContentInfo+json` to get `ContentInfo` (metadata only) as **[JSON](https://www.json.org/)** Media types are also used with the [`Content-Type` header](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_responses/#content-type-header) to characterize a [request body](#request-body) or a [response body](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_responses/#response-body). See [Creating content with binary attachments](#creating-content-with-binary-attachments) below. Also see Creating session examples. If the resource only returns one media type, it's also possible to skip it and to specify the format with `application/xml` or `application/json`. A response indicates `href`s to related resources and their media types. ### Destination The `Destination` request header is the request counterpart of the `Location` response header. It's used for a `COPY`, `MOVE` or `SWAP` operation to indicate where the resource should be moved, copied to or swapped with by using the ID of the parent or target location. Examples of such requests are: - [copying a Content](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-copy-content) - [moving a Location and its subtree](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-move-subtree) - [swapping a Location with another](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-swap-location) ### Expected user The `X-Expected-User` header specifies the user needed for the request execution. With this header, if the current username on server side isn't equal to `X-Expected-User` value, a `401 Unauthorized` error is returned. Without this header, the request is executed with the current user who might be unexpected (like the Anonymous user if a previous authentication has expired) and an ambiguous response might be returned as a success not informing about a wrong user. For example, it prevents a Content request to be executed with Anonymous user in the case of an expired authentication, and the response being a `200 OK` but missing content items due to access rights difference with the expected user. ## Request body You can pass some short scalar parameters in the URIs or as GET parameters, but other resources need heavier structured payloads passed in the request body, in particular the ones to create (`POST`) or update (`PATCH`) items. In the [REST API reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html), request payload examples are given when needed. One example is the creation of an authentication session. When creating a content item, a special payload is needed if the content type has some [Image](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imagefield/index.md) or [BinaryFile](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/binaryfilefield/index.md) fields as files need to be attached. See the example of a [script uploading images](#creating-content-with-binary-attachments) below. When searching for content items (or locations), the query grammar is also particular. See the [Search section](#search-views) below. ### Creating content with binary attachments To create content with a binary attachment, such as an image, post the content data to [`/content/objects`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Objects/operation/api_contentobjects_post) to create a draft, then publish it through [`/content/objects/{contentId}/versions/{versionNo}`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-publish-a-content-version). Authenticate the requests as described in HTTP basic authentication. ### Search (`/views`) The `/views` route allows you to [search in the repository](https://doc.ibexa.co/en/saas/search/search/index.md). The model allows combining criteria using the logical operators `AND`, `OR` and `NOT`. Most [Search Criteria](https://doc.ibexa.co/en/saas/search/criteria_reference/search_criteria_reference/#search-criteria) are available in REST API. The suffix `Criterion` is added when used with REST API. Most [Sort Clauses](https://doc.ibexa.co/en/saas/search/sort_clause_reference/sort_clause_reference/#sort-clauses) are available too. They require no additional prefix or suffix. The search request has a `Content-Type: application/vnd.ibexa.api.ViewInput+xml` or `+json` header to specify the format of its body's payload. The root node is `` and it has two mandatory children: `` and ``. You can add `version=1.1` to the `Content-Type` header to support the distinction between `ContentQuery` and `LocationQuery` instead of `Query` which implicitly looks only for content items. The following examples search for `article` and `news` typed content items everywhere or for content items of all types directly under location `123`. All those content items must be in the `standard` section. **XML** ```http POST /views HTTP/1.1 Content-Type: application/vnd.ibexa.api.ViewInput+xml ``` ```xml test article news 123 standard 10 0 ascending ``` **XML; 1.1** ```http POST /views HTTP/1.1 Content-Type: application/vnd.ibexa.api.ViewInput+xml; version=1.1 ``` ```xml test article news 123 standard 10 0 ascending ``` **JSON** ```http POST /views HTTP/1.1 Content-Type: application/vnd.ibexa.api.ViewInput+json ``` ```json { "ViewInput": { "identifier": "test", "Query": { "Filter": { "AND": { "OR": { "ContentTypeIdentifierCriterion": [ "article", "news" ], "ParentLocationIdCriterion": 123 }, "SectionIdentifierCriterion": "standard" } }, "limit": "10", "offset": "0", "SortClauses": { "ContentName": "ascending" } } } } ``` **JSON; 1.1** ```http POST /views HTTP/1.1 Content-Type: application/vnd.ibexa.api.ViewInput+json; version=1.1 ``` ```json { "ViewInput": { "identifier": "test", "ContentQuery": { "Filter": { "AND": { "OR": { "ContentTypeIdentifierCriterion": [ "article", "news" ], "ParentLocationIdCriterion": 123 }, "SectionIdentifierCriterion": "standard" } }, "limit": "10", "offset": "0", "SortClauses": { "ContentName": "ascending" } } } } ``` > **Note: Note** > > In JSON, the structure for `ContentTypeIdentifierCriterion` with multiple values has a slightly different format as keys must be unique. In JSON, if there is only one item in `SortClauses`, it can be passed directly without an array to wrap it. You can omit logical operators. If Criteria are of mixed types, they're wrapped in an implicit `AND`. If they're of the same type, they're wrapped in an implicit `OR`. For example, the `AND` operator from previous example's `Filter` could be removed. **XML ExplicitAND** ```xml article news 123 standard ``` **XML ImplicitAND** ```xml article news 123 standard ``` **JSON ExplicitAND** ```json "Filter": { "AND": { "OR": { "ContentTypeIdentifierCriterion": [ "article", "news" ], "ParentLocationIdCriterion": 123 }, "SectionIdentifierCriterion": "standard" } }, ``` **JSON ImplicitAND** ```json "Filter": { "OR": { "ContentTypeIdentifierCriterion": [ "article", "news" ], "ParentLocationIdCriterion": 123 }, "SectionIdentifierCriterion": "standard" }, ``` # REST Responses > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). REST API response code defines the status of the received response. ## Response code The following list of available HTTP response status codes gives an overview of the meaning of each code. For code details per resource, see the [REST API reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html). | Code | Message | Description | | ----- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `200` | OK | The resource has been found. | | `201` | Created | The request to create a new item has succeeded. The response `Location` header indicates where you can find the created item. | | `204` | No Content | The request has succeeded and there is no additional information in the response header or body (for example when publishing or deleting). | | `301` | Moved Permanently | The resource shouldn't be accessed this way. The response `Location` header indicates the proper way. | | `307` | Temporary Redirect | The resource is available at another URL considered as its main. The response `Location` header indicates this main URL. | | `400` | Bad Request | The input (payload) doesn't have the proper schema for the resource. | | `401` | Unauthorized | The user doesn't have the permission to make this request. | | `403` | Forbidden | The user has the permission but action can't be performed because of Repository logic (for example, when trying to create an item with an already existing ID or identifier, when attempting to update a version in another state than draft). | | `404` | Not Found | The requested object (or a request data like the parent of a new item) hasn't been found. | | `405` | Method Not Allowed | The requested resource doesn't support the HTTP verb that was used. | | `406` | Not Acceptable | The request's `Accept` header isn't supported. | | `409` | Conflict | The request is in conflict with another part of the repository (for example, trying to create a new item with an identifier already used). | | `415` | Unsupported Media Type | The request payload media type doesn't match the media type specified in the request header. | | `500` | Internal Server Error | The server encountered an unexpected condition, usually an exception, which prevents it from fulfilling the request, like database down, permissions or configuration error. | | `501` | Not Implemented | Returned when the requested method hasn't yet been implemented. For Cohesivo, most of users, user groups, content items, locations and content types have been implemented. Some of their methods, and other features, may return a 501. | ## Response headers A resource's response may contain metadata in its HTTP headers. > **Note: Note** > > For information about the `Allow` response header, see the [`OPTIONS` method](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_requests/#options-method). ### Content-Type header When a response contains an actual HTTP body, the `Content-Type` header specifies what the body contains. The `Content-Type` header's value is a [media type](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_requests/#media-types), like with the request `Accept` and `Content-Type` headers. For example, the first following request without an `Accept` header returns a default format indicated in the response `Content-Type` header, while the second request shows that the response is in the requested format. ```http GET /content/objects/52 HTTP/1.1 ``` ```http HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.ContentInfo+xml ``` ```http GET /content/objects/52 HTTP/1.1 Accept: application/vnd.ibexa.api.Content+json ``` ```http HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.Content+json ``` ### Accept-Patch header When available, the `Accept-Patch` tells how the received item could be modified with `PATCH`. The following examples also shows that the format (XML or JSON) is adapted: ```http GET /content/objects/52 HTTP/1.1 ``` ```http HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.ContentInfo+xml Accept-Patch: application/vnd.ibexa.api.ContentUpdate+xml ``` ```http GET /content/objects/52 HTTP/1.1 Accept: application/vnd.ibexa.api.Content+json ``` ```http HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.Content+json Accept-Patch: application/vnd.ibexa.api.ContentUpdate+json ``` Those example `Accept-Patch` headers above indicate that the content could be modified by sending a `ContentUpdateStruct` in XML or JSON. ### Location header For example, [creating content](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#managing-content-create-content-type) and [getting a content item's current version](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Objects/operation/api_contentobjects_contentIdcurrentversion_get) both send a `Location` header to provide you with the requested resource's ID. Those particular headers generally match a specific list of HTTP response codes. `Location` is mainly sent alongside `201 Created`, `301 Moved permanently`, `307 Temporary redirect responses`. In the following example, the content item's remote ID 34720ff636e1d4ce512f762dc638e4ac corresponds to the ID 52: ```http GET /content/objects?remoteId=34720ff636e1d4ce512f762dc638e4ac" HTTP/1.1 ``` ```http HTTP/1.1 307 Temporary Redirect Location: /content/objects/52 ``` In the following example, an erroneous slash has been added to demonstrate the 301 case: ```http GET /content/objects?remoteId=34720ff636e1d4ce512f762dc638e4ac" HTTP/1.1 ``` ```http HTTP/1.1 301 Moved Permanently Location: /content/objects?remoteId=34720ff636e1d4ce512f762dc638e4ac ``` cURL can follow those redirections. On CLI, there is the `--location` option (or its shorthand `-L`). The following command-line example follows the two redirections above and the `Accept` header is propagated: ```bash curl --head --location --header "Accept: application/vnd.ibexa.api.Content+json" "https://api.example.com/api/ibexa/v2/content/objects/?remoteId=34720ff636e1d4ce512f762dc638e4ac" ``` ```http HTTP/1.1 200 OK Content-Type: application/vnd.ibexa.api.Content+json ``` ## Response body The response body (both JSON and XML) contain two types of nodes: - final nodes that fully give an information as a scalar value - reference nodes which link to `href` where a new resource of a given `media-type` can be explored if you need to know more ```bash curl https://api.example.com/content/objects/52 --header 'Accept: application/vnd.ibexa.api.ContentInfo+xml'; ``` ```xml Ibexa Digital Experience Platform Ibexa Digital Experience Platform
2015-09-17T09:22:23+00:00 2015-09-17T09:22:23+00:00 eng-GB 1 true false PUBLISHED ``` # Testing REST API > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). You can test operations in the REST API by using command line, PHP or JS code. A standard web browser isn't sufficient to fully test the API. You can, however, try opening the root resource located at `/api/ibexa/v2/`. Depending on how your browser understands XML, it either downloads the XML file, or opens it in the browser. The following examples show how to interrogate the REST API with cURL, PHP or JS. ## CLI For examples of using `curl`, refer to: - [REST root](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_api_usage/#rest-root) - [OPTIONS method](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_requests/#options-method) - [Location header](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_responses/#location-header) - [ContentInfo body](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_responses/#response-body) ## JS The REST API can help you implement JavaScript / AJAX interaction. The following example of an AJAX call retrieves `ContentInfo` (that is, metadata) for a content item. To test it, copy-paste this code into your browser console alongside a page from your website (to share the domain): **Fetch API** ```javascript const resource = '/api/ibexa/v2/content/objects/52'; fetch(resource, { headers: {'Accept': 'application/vnd.ibexa.api.ContentInfo+json'}, }).then((response) => { console.log(...response.headers); return response.json(); }).then((data) => { console.log(data); }); ``` **XMLHttpRequest** ```javascript const resource = '/api/ibexa/v2/content/objects/52'; const request = new XMLHttpRequest(); request.open('GET', resource, true); request.setRequestHeader('Accept', 'application/vnd.ibexa.api.ContentInfo+json'); request.onload = function () { console.log(request.getAllResponseHeaders(), JSON.parse(request.responseText)); }; request.send(); ``` By default, `52` is the Content ID of the home page. If necessary, substitute `52` with the Content ID of an item in your system. # REST API authentication > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). To authenticate REST API communication you can use session (default), JWT, basic, OAuth and client certificate (SSL) authentication. This page refers to [REST API reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html), where you can find detailed information about REST API resources and endpoints. > **Caution: SiteAccess login** > > The anonymous user is used to perform authentification requests. Therefore, the "Anonymous" role must have `user/login` permission on the SiteAccess that matches the REST domain or is passed through the [`X-Siteaccess` header](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_requests/#siteaccess). ## OAuth TODO: Oauth is the only authentication method. Add an example showing the whole flow. For more information, see [OAuth 2.0 protocol for authorization](https://oauth.net/2/). # Administration # Administration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Administer and configure your Cohesivo installation. Administer and configure your Cohesivo installation. - [Admin panel](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/admin_panel/): Cohesivo back office contains managements options for permissions, users, languages, content types, and system information. - [Configuration](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/configuration/configuration/): In Cohesivo you store and manage configuration in project files, typically in YAML format. - [Back office](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/back_office/back_office/): Back office holds the administrator and editor interface and allows creating, publishing and managing content, users, settings, and more. # Admin panel > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo back office contains managements options for permissions, users, languages, content types, and system information. Once you set up your environment you can start your work as an administrator. You can find key tools in **Admin** panel. To access **Admin** panel, click the icon: ![Admin panel Icon](https://doc.ibexa.co/en/saas/administration/img/admin_panel_icon.png). - [Users](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/users_admin_panel/): You can access all users and user groups in the Users tab. - [Roles](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/roles_admin_panel/): To give users an access to your website you need to assign them roles in the Admin Panel. - [URL Management](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/url_management_admin_panel/): URL Management lets you manage external URL addresses and URL wildcards. - [Languages](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/languages_admin_panel/): Cohesivo offers the ability to create multiple translations of your website. - [Segments](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/segments_admin_panel/): You can use segments to display specific content to specific users. - [Corporate](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/corporate_admin_panel/): You can manage companies profiles in the Admin Panel. - [Workflow](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/workflow_admin_panel/): The workflow functionality passes a content item version through a series of stages. - [System Information](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/admin_panel/system_information_admin_panel/): System information provides basic system information such as versions of all installed packages. # Users > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). You can access all users and user groups in the Users tab. [Users](https://doc.ibexa.co/en/saas/users/users/index.md) in Cohesivo are treated the same way as content items. They're organized in groups such as *Guests*, *Editors*, *Anonymous*, which makes it easier to manage them and their permissions. You can access all users and user groups in the **Admin** panel by selecting **Users**. ![Users and user groups](https://doc.ibexa.co/en/saas/administration/img/admin_panel_users.png "Users and user groups") > **Caution: Caution** > > Be careful not to delete an existing user account. If you do this, content created by this user can be broken and the application can face malfunction. # Roles > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). To give users an access to your website you need to assign them roles in the Admin Panel. To give users an access to your website you need to assign them roles in the **Admin** panel. ![Roles](https://doc.ibexa.co/en/saas/administration/img/admin_panel_roles.png "Roles") Each role consists of: ## Policies ![Policies](https://doc.ibexa.co/en/saas/administration/img/admin_panel_policies.png "Policies") Policies are the rules that give users access to different function in a module. You can restrict what user can do with limitations. The available limitations depend on the chosen policy. When policy has more than one limitation, all of them have to apply. See [example use case](https://doc.ibexa.co/en/saas/permissions/permission_use_cases/#restrict-editing-to-part-of-the-tree). > **Note: Note** > > Limitation specifies what a user can do, not what they can't do. A `Location` limitation, for example, gives the user access to content with a specific location, not prohibits it. > > For more information, see [Limitation reference](https://doc.ibexa.co/en/saas/permissions/limitation_reference/index.md). ## Assignments ![Assignments](https://doc.ibexa.co/en/saas/administration/img/admin_panel_assignments.png "Assignments") After you created all policies, you can assign the role to users and/or user groups with possible additional limitations. Every user or user group can have multiple roles. A user can also belong to many groups, for example, Administrators, Editors, Subscribers. Best practice is to avoid assigning roles to users directly. Model your content (for example, content types, sections, or locations) in a way that can be accessed by generic roles. That way system is be more secure and easier to manage. This approach also improves performance. Role assignments and policies are taken into account during search/load queries. For more information, see [Permissions overview](https://doc.ibexa.co/en/saas/permissions/permissions/index.md) and [Permission use cases](https://doc.ibexa.co/en/saas/permissions/permission_use_cases/index.md). # URL Management > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). URL Management lets you manage external URL addresses and URL wildcards. You can manage external URL addresses and URL wildcards in the **Admin** panel. Configure URL aliases to have human-readable URL addresses throughout your system. For more information, see [URL management](https://doc.ibexa.co/en/saas/content_management/url_management/url_management/index.md). ![URL Management](https://doc.ibexa.co/en/saas/administration/img/admin_panel_url_management.png "URL Management") # Languages > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo offers the ability to create multiple translations of your website. Cohesivo offers the ability to create multiple translations of your website. Which version is shown to a visitor depends on the way your installation is set up. You can add a new language version for the website in the [Admin Panel](https://doc.ibexa.co/en/saas/administration/admin_panel/admin_panel/index.md) in the **Languages** tab. Every new language must have a name and a language code, written in the `xxx-XX` format, for example `eng-GB`. ![Languages](https://doc.ibexa.co/en/saas/administration/img/admin_panel_languages.png "Languages") The multilanguage system operates based on a global translation list that contains all languages available in the installation. After adding a language you may have to reload the application to be able to use it. Depending on your set up, additional configuration may be necessary for the new language to work properly, especially with SiteAccesses. See [Languages](https://doc.ibexa.co/en/saas/multisite/languages/languages/index.md) for further information. # Segments > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). You can use segments to display specific content to specific users. You can use segments to display specific content to specific [users](https://doc.ibexa.co/en/saas/users/users/index.md). They're used out of the box in the Targeting block in the page. You can collect segments in segment groups: ![Segment groups](https://doc.ibexa.co/en/saas/administration/img/admin_panel_segment_groups.png) Each segment group can contain segments that you can target content for. ![Segment](https://doc.ibexa.co/en/saas/administration/img/admin_panel_segment.png) You can assign users to segments over the [REST API](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_api_usage/index.md). # Corporate > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). You can manage companies profiles in the Admin Panel. You can manage companies profiles in the **Admin** panel. There, in the **Corporate** section, you can find basic information about existing companies, for example, details, versions, locations, translations, a list of members, billing addresses, and technical details regarding the organization, such as visibility, IDs, or relations. ![Corporate section](https://doc.ibexa.co/en/saas/administration/img/admin_panel_corporate.png "Corporate section") For more information, see [Customer management](https://doc.ibexa.co/projects/userguide/en/saas/customer_management/manage_customers/). # Workflow > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The workflow functionality passes a content item version through a series of stages. The workflow functionality passes a content item version through a series of stages. Each workflow consists of stages and transitions between them. For more information, see [Workflow](https://doc.ibexa.co/en/saas/content_management/workflow/workflow/index.md). ![Workflow](https://doc.ibexa.co/en/saas/administration/img/admin_panel_workflow.png "Workflow") # System Information > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). System information provides basic system information such as versions of all installed packages. The System Information panel in the back office is sourced in the [`ibexa/system-info` repository](https://github.com/ibexa/system-info). There you can also find basic system information such as versions of all installed packages. ![System Information](https://doc.ibexa.co/en/saas/administration/img/admin_panel_system_info.png "System Information") # Sections > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Sections are used to divide content items in the tree. Sections are used to divide content items in the tree into groups that are more manageable by content editors. Division into sections allows you, among others, to set [permissions](https://doc.ibexa.co/en/saas/permissions/permission_overview/index.md) for only a part of the tree. ![Sections screen](https://doc.ibexa.co/en/saas/administration/img/admin_panel_sections.png "Sections screen") Technically, a section is a number, a name, and an identifier. Content items are placed in sections by being assigned the section ID. One item can be in only one section. When a new content item is created, its section ID is set to the default section (which is usually Standard). When the item is published it is assigned to the same section as its parent. Because content must always be in a section, unassigning happens by choosing a different section to move it into. If a content item has multiple location assignments then it is always the section ID of the item referenced by the parent of the main location that is used. In addition, if the main location of a content item with multiple location assignments is changed then the section ID of that item is updated. When content is moved to a different location, the item itself and all of its subtree are assigned to the section of the new location. It works only for copy and move. Assigning a new section to a parent content item doesn't affect the subtree, meaning that subtree cannot currently be updated this way. Sections can only be removed if no content items are assigned to them. Even then, it should be done carefully. When a section is deleted, it's only its definition itself that is removed. Other references to the section remain and thus the system most likely loses consistency. > **Caution: Caution** > > Removing sections may corrupt permission settings, template output and other things in the system. Section ID numbers aren't recycled. If a section is removed, its ID number cannot be reused when a new section is created. # Content types > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). A content type is a base for new content items. A content type is a base for new content items. It defines what fields are available in the content item. ![Content types](https://doc.ibexa.co/en/saas/administration/img/admin_panel_content_types.png "Content types") For example, a new content type called *Article* can have fields such as title, author, body, or image. Based on this content type, you can create any number of content items. Content types are organized into groups. ![Content type groups](https://doc.ibexa.co/en/saas/administration/img/admin_panel_content_type_groups.png "Content type groups") You can add your own groups here to keep your content types in better order. For a full tutorial, see [Add a content type](https://doc.ibexa.co/en/saas/getting_started/first_steps/#add-a-content-type) or follow [User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_types/). For a detailed overview of the content model, see [Content model overview](https://doc.ibexa.co/en/saas/content_management/content_model/index.md). ## Content type metadata Each content type is characterized by a set of metadata which define the general behavior of its instances: **Name** – a user-friendly name that describes the content type. This name is used in the interface, but not internally by the system. It can consist of letters, digits, spaces, and special characters (it's mandatory and the maximum length is 255 characters). > **Note: Note** > > Even if your content type defines a field intended as a name for the content item (for example, a title of an article or product name), don't confuse it with this Name, which is a piece of metadata, not a field. **Identifier** – an identifier for internal use in configuration, for example, files, templates, or PHP code. It must be unique, can only contain lowercase letters, digits, and underscores (it's mandatory and the maximum length is 50 characters). **Description** – a detailed description of the content type (optional). **Content name pattern** – a pattern that defines what name a new content item based on this content type gets. The pattern usually consists of field identifiers that tell the system which fields it should use when generating the name of a content item. Each field identifier has to be surrounded with angle brackets. Text outside the angle brackets is included literally. If no pattern is provided, the system automatically uses the first field (optional). **URL alias name pattern** – a pattern which controls how the virtual URLs of the locations are generated when content items are created based on this content type. Only the last part of the virtual URL is affected. The pattern works in the same way as the content name pattern. Text outside the angle brackets is converted with the selected method of URL transformation. If no pattern is provided, the system automatically uses the name of the content item itself (optional). > **Tip: Changing URL alias and content name patterns** > > If you change the content name pattern or the URL alias name pattern, existing content items cannot be modified automatically. The new pattern is only applied after you modify the content item and save a new version. > > The old URL aliases continue to redirect to the same content items. **Container** – a flag which indicates if content items based on this content type are allowed to have sub-items or not (mainly relevant for actions via the UI, not validated by every PHP API). > **Note: Note** > > This flag was added for convenience and only affects the interface. In other words, it doesn't control any actual low-level logic, it simply controls the way the graphical user interface behaves. **Sort children by default by** – rule for sorting sub-items. If the instances of this content type can serve as containers, their children are sorted according to what is selected here. **Sort children by default in order** – another rule for sorting sub-items. This decides the sort order for the criterion chosen above. **Make content available even with missing translations** – a flag which indicates if content items of this content type should be available even without a corresponding language version. See [Content availability](https://doc.ibexa.co/en/saas/content_management/content_availability/index.md). ![Creating a new content type](https://doc.ibexa.co/en/saas/content_management/img/admin_panel_new_content_type.png) ## Field definitions Aside from the metadata, a content type may contain any number of field definitions (but has to contain at least one). They determine what fields of what field types are included in all content items based on this content type. ![Field definitions](https://doc.ibexa.co/en/saas/administration/img/admin_panel_field_definitions.png) ![Diagram of an example content type](https://doc.ibexa.co/en/saas/content_management/img/content_model_type_diagram.png) > **Note: Note** > > You can assign each field defined in a content type to a group by selecting one of the groups in the Category drop-down. > **Caution: Caution** > > In case of content types containing many field types you should be aware of possible memory-related issues with publishing/editing. You may also experience performance problems with such large content types, in particular when you have many content items. If you're experincing too many issues, consider rearranging your project to avoid them. ## Modifying content types A content type and its field definitions can be modified after creation, even if there are already content items based on it in the system. When a content type is modified, each of its instances are changed as well. If a new field definition is added to a content type, this field appears (empty) in every relevant content item. If a field definition is deleted from the content type, all the corresponding fields are removed from content items of this type. ## Removing content types System content types are by default used for the File Uploads and removing them can cause errors. Don't remove the `file` or `image` content types, or change their identifiers. # Object states > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Object states are user-defined states that can be assigned to content items. Object states are user-defined states that can be assigned to content items. They're contained in groups. ![Object State group](https://doc.ibexa.co/en/saas/administration/img/admin_panel_object_state_groups.png "Object state group") If a state group contains any states, each content item is automatically assigned a state from this group. You can assign states to content in the back office in the content item's **Technical details** tab. ![Assigning an object state to a content item](https://doc.ibexa.co/en/saas/administration/img/assigning_an_object_state.png "Assigning an object state to a content item") By default, Cohesivo contains one object state group: **Lock**, with states **Locked** and **Not locked**. ![Lock Object state](https://doc.ibexa.co/en/saas/administration/img/object_state_lock.png "Lock object state") Object states can be used in conjunction with [permissions](https://doc.ibexa.co/en/saas/permissions/permission_overview/index.md), in particular with the [object state limitation](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation). Their specific use cases depend on your needs and the setup of your permission system. # Configuration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). In Cohesivo you store and manage configuration in project files, typically in YAML format. TODO: Rework this to describe the SiteAccess UI, and siteacces-aware settings. Merge the content from docs/multisite/siteaccess/siteaccess_aware_configuration.md ## `admin` SiteAccess The predefined `admin` SiteAccess in `admin_group` serves the back office. # Back office > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Back office holds the administrator and editor interface and allows creating, publishing and managing content, users, settings, and more. The back office is the web interface where editors and administrators work with content. - [Integrated help](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/back_office/integrated_help/): Integrated help provides quick access to documentation, training, and support resources. - [Product tour](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/administration/back_office/product_tour/): Product tours provide interactive guided walkthroughs to help users learn Cohesivo features. # Integrated help > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Integrated help provides quick access to documentation, training, and support resources. Integrated help brings documentation, training resources, and product roadmap-related information into the back office, together with user onboarding capabilities. With this feature, users can click the ![Help icon](https://doc.ibexa.co/en/saas/administration/back_office/img/about-info.png) icon to access relevant content straight from the UI. ![Integrated help menu](https://doc.ibexa.co/en/saas/administration/back_office/img/5_0_integrated_help_menu.png) ## Product tours Product tours are interactive guided walkthroughs that help back office users discover Cohesivo features. They provide step-by-step guidance directly within the application interface, accelerating user adoption and reducing training time. Developers can create custom onboarding journeys tailored to specific client implementations, user roles, or business processes. For more information, see [Product tour](https://doc.ibexa.co/en/saas/administration/back_office/product_tour/index.md). The help center is enabled by default for all back office users. If needed, they can [disable it in user settings](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/discover_ui/#disable-help-center). # Product tour > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Product tours provide interactive guided walkthroughs to help users learn Cohesivo features. Product tour is an in-app onboarding tool that helps back office contributors discover Cohesivo features through interactive, step-by-step guided walkthroughs. Unlike static documentation, product tours provide real-time, contextual guidance directly within the application interface. With product tours, you can create customized onboarding journeys tailored to specific client implementations, user roles, or business processes. This accelerates user adoption, reduces training time, and helps users confidently navigate the platform. To use product tours, you must first enable [Integrated help](https://doc.ibexa.co/en/saas/administration/back_office/integrated_help/index.md). ## Key concepts Product tour consists of three main elements: - **Scenario** - a complete onboarding scenario containing multiple steps that guide users through a specific feature or workflow - **Step** - an individual instruction or explanation within a scenario, containing blocks, displayed as an overlay or tooltip - **Block** - a content element within a step, such as text, images, videos, or links that provide information to the user ## Scenario types Cohesivo supports two types of scenarios, each designed for different use cases: ### General scenarios General tours display information in centered modals without targeting specific UI elements. These tours provide an overview of features or concepts and do not require interaction with particular interface elements. General tours are ideal for: - Introducing new users to the platform - Explaining high-level concepts or feature overviews - Welcoming users with customizable background images and branding ![General scenario type](https://doc.ibexa.co/en/saas/administration/back_office/img/product_tour/general_scenario.png "General scenario type") ### Targetable scenarios Targetable scenarios highlight specific UI elements on the page and guide users through interactive workflows. Each step targets a particular element by using a CSS selector, and can draw attention to buttons, navigation elements, or other interface components. Targetable scenarios are ideal for: - Demonstrating specific features or workflows - Guiding users through multi-step processes - Teaching users how to interact with particular UI elements The steps building the scenario support three interaction modes: - **Standard** - Users navigate between steps by clicking **Previous** and **Next** buttons - **Clickable** - Users must click the highlighted element to proceed to the next step - **Draggable** - Users must drag and drop an element to continue the scenario ![Targetable scenario type](https://doc.ibexa.co/en/saas/administration/back_office/img/product_tour/targetable_scenario.png "Targetable scenario type") ## Scenario lifecycle Depending on scenario configuration, they automatically appear to users when they first log in or visit a specific page. Each scenario appears only once for each user. Users can complete a tour with one of the following actions: - by finishing all steps - by skipping it with the **Skip** button in general tours and **Exit tour** in targetable tours - by skipping it with the **Escape** key For **Standard** scenario steps, users can move freely between the previous and next steps. For **Clickable** and **Draggable** steps, users can't go back to the previous step without restarting the scenario and starting from the beginning. At any time, users can manually restart completed tours from their [user settings](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/get_started/#user-settings). # Recent activity > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Log and monitor activity through UI, PHP API and REST API. Recent activity log displays last actions in the repository (whatever their origin is, for example, back office, REST). ![Recent activity](https://doc.ibexa.co/en/saas/administration/img/admin_panel_recent_activity.png) To learn more about its back office usage and the actions logged by default, see [Recent activity in User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/recent_activity/recent_activity/). ## Permission and security The [`activity_log/read`](https://doc.ibexa.co/en/saas/permissions/policies/#activity-log) policy gives a role the access to the **Admin** -> **Activity list**, the dashboard's **Recent activity** block, and the user profile's **Recent activity**. It can be limited to "Only own logs" ([`ActivityLogOwner`](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#activity-log-owner-limitation)). The policy should be given to every roles having access to the back office, at least with the `ActivityLogOwner` owner limitation, to allow them to use the "Recent activity" block in the dashboard. This policy is required to view [activity log in user profile](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/get_started/#view-and-edit-user-profile), if the user profile is enabled. > **Caution: Caution** > > Don't assign `activity_log/read` permission to the Anonymous role, even with the owner limitation, because this role is shared among all unauthenticated users. ## User privacy > **Caution: Caution** > > A username of the User who performs the action is logged. When acting through the web server, the User's IP address is also logged. Other access, such as console commands, doesn't log an IP. Your Data Protection Officer or GDPR representative should be aware of this, so they can ensure users are informed if needed, depending on your use case, jurisdiction, and company policy. > > For example, if a content edition feature, such as reader's comments, is available in the front office, the recent activity log records the front users' IPs. ## REST API You can browse activity logs with REST API. For more information, see the [REST API reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log). # Content management # Content management > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Manage content in Cohesivo by learning about the content model, field types, pages, forms, workflows, and more. - [Content management product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/content_management_guide/): Read the content management product guide and learn how to create, modify, and display information to the target audience. - [Content model](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/content_model/): Cohesivo's content model relies on content items that are instances of content types and contain content fields. - [Locations](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/locations/): Locations hold published content items and can be used to control visibility. - [Field type reference](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/field_types/field_type_reference/field_type_reference/): Cohesivo offers a range of built-in field types that cover most common needs when creating content. - [Pages](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/pages/pages/): Pages are block-based special types of content that editors can create and modify by using a visual drag-and-drop editor. - [Forms](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/forms/forms/): Forms are a type of content item that you can use to improve the functionality of your website. - [Taxonomy](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/taxonomy/taxonomy/): A taxonomy uses tags to categorize and organize content - [Workflow](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/workflow/workflow/): Workflow controls how content items pass between stages and allows setting up editorial flows, for example for reviews and proofreading. # Content management product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Read the content management product guide and learn how to create, modify, and display information to the target audience. ## What is content management The term “content management” covers all the tasks that you need to perform to create, edit and present content to its intended audience. The content management model applied in Cohesivo lies at the foundation of the entire system. A system that relies on roles and permissions controls access to content items and is granular and powerful enough to be used in managing user accounts, corporate accounts, products, or process definitions. ## How does it work Cohesivo revolves around content management. Many things here are content items, including: - sites - folders - pages - articles or posts - products - forms - media (for example, images or videos) - user accounts You can set up content structure, define the templates to be filled with content, and assign different areas of the structure to your editors. Next steps would be to create the actual content, and then classify content items, and organize them as necessary. You can then build an external systems that uses Cohesivo as a headless CMS, a single source of truth for anything related to content. ## Content structure All content in Cohesivo is organized hierarchically, into what is called a **content tree**. This tree-like structure repeats throughout the system, and applies to content, taxonomies, categories, and the like. Traditional as the structure may look, with relations and multiple location support, a single content item can be referenced by another content item and accessed from different places of the tree, which allows you to build complex architectures with multiple locales and output channels. ![Content structure in a Content Browser](https://doc.ibexa.co/en/saas/content_management/img/content_tree.png) ## Content model A structure of elements that *store* content information is referred to as the **content model**. Cohesivo comes with a predefined content model that includes a broad set of various field types and several content types. You can customize and adapt the content model to your organization's needs and the type of output channel that you use. Content managers or even editors can then apply such field types when they modify existing or create new content types. The editing interface lets all users, including those with no coding experience, create or modify certain areas of the content model. For technical details, see [a Content model](https://doc.ibexa.co/en/saas/content_management/content_model/#content-model). ### Field types [Field types](https://doc.ibexa.co/en/saas/content_management/field_types/field_types/index.md) are the smallest elements of the content model’s structure. Cohesivo comes with many built-in field types that cover most common needs, for example, Text line, RichText, Integer, Measurement, or Map location. Their role is to: - store data - validate input data - make the data searchable - display fields of a given field type For a complete list of available field types, see [field type reference](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/field_type_reference/index.md). ![Field types and fields](https://doc.ibexa.co/en/saas/content_management/img/field_types.png) ### Fields Once you use a field type to design and build a content type definition, and define its settings, it becomes a field. Fields can be as simple as Name, based on a Text line field type, or as complex as page, based on a landing page field type, with multiple options to set and choose from: ![Landing page field settings](https://doc.ibexa.co/en/saas/content_management/img/fields.png) ### Content types Life gets easier when you have templates to fill in with content. Content types are such templates, which editors use to create content items. Content types define what fields are available in the content item. Cohesivo comes with several basic content types, and creating new ones, editing, and deleting them is done by using a visual interface, with no coding skills needed. ![Content types vs. content items](https://doc.ibexa.co/en/saas/content_management/img/content_types.png) ### Content items Content items are pieces of content, such as, for example, products, articles, blog posts, or media. In Cohesivo, everything is a content item — not only pages, articles or products, but also all media (for example, images or videos) or even user accounts. Each content item, apart from its name and identifier, contains a composition of fields, which differs depending on the type of content. For example, articles might have for example, a title, an author, a body, and an image, while products may have, for example, a name, category, price, size, or color. ### Forms Forms could be seen as a special kind of content items, because their role is to gather information from website users and not present it. You create them from basic form fields available in Cohesivo. By adding forms to the website, you can increase the website’s functionality and improve user experience. Cohesivo comes with a visual [Form Builder](https://doc.ibexa.co/projects/userguide/en/saas/content_management/work_with_forms/). ## Content management capabilities Each content item has at least one location within the content tree, and can have several versions and multiple translations. It can also have related assets, such as images or other media, and assigned keywords, or tags. You can use these characteristics in combination with system features to create the most comprehensive and functional digital presence for your organization. ### Content characteristics #### Locations When a content item is created and published, it's assigned a place in the content tree, designated by a location ID. A single content item can have more than one location ID, which means that the same content can be found on different branches of the tree. However, a single location can have only one content item assigned to it. ![Locations](https://doc.ibexa.co/en/saas/content_management/img/locations.png) Locations can be used to control the availability of content items to end users: you can [hide specific locations](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_organization/manage_locations_urls/#hide-locations) of a content item, while others remain available. By [swapping locations](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_organization/manage_locations_urls/#swap-locations), you can immediately replace an obsolete version of a content item with an updated one. #### Versions Content items can have several [versions](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_versions/). By default, there are three version statuses available: draft, published, and archived. Before they're published, drafts can be routed between different user roles for review and approval. ![Versions](https://doc.ibexa.co/en/saas/content_management/img/versions.png) Editors can [compare different content item versions](https://doc.ibexa.co/projects/userguide/en/saas/content_management/workflow_management/work_with_versions/#compare-versions) by using the Compare versions feature. #### Translations Content items can have more than one [translation](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/). If a website has different fronts, for different locales, and different language versions of content exist, Cohesivo serves the one that matches the locale. ![Translations](https://doc.ibexa.co/en/saas/content_management/img/translations.png) Editors can compare different translations of the same content items with the Compare versions feature mentioned above. #### Relations A [relation](https://doc.ibexa.co/en/saas/content_management/content_relations/index.md) can exist between any two content items in the content tree. For example, blog posts featured in the website's main page are in a relation with the page that they're embedded in. Or, instead of direct attachments, an article can use images that are separate content items outside the article, and are referenced through a relation. ## Content arrangement In Cohesivo, content items can be moved and copied between branches of the content tree. These operations, like in your computer’s file system, can apply both to individual content items and folders or groups. ![Content organization operations](https://doc.ibexa.co/en/saas/content_management/img/content_arrangement.png) Content items can be hidden when necessary, for example, until a certain event, like a Holiday Sale, or Board announcement comes. Hidden content items aren't visible to website visitors and are greyed out in the content tree. ![Hidden content item](https://doc.ibexa.co/en/saas/content_management/img/hidden_content_item.png) Editors can also move obsolete content items to Trash, and ultimately delete them. ![Delete confirmation dialog box](https://doc.ibexa.co/en/saas/content_management/img/delete_confirmation.png) ## Content classification There are multiple tools within Cohesivo that help content managers classify content or restrict access to content to certain recipients. ### Taxonomy With taxonomy you can create tags or keywords within a tree structure and assign them to content items. This way you can classify content and make it easier for end users to find the content they need, or browse and view content from a category that suits them best. ![Taxonomy principles](https://doc.ibexa.co/en/saas/content_management/img/taxonomy.png) ### Access control When your Cohesivo instance has multiple contributors and visitors, administrators can give them access to different areas of the website and different capabilities. It's done by creating roles, with each role having a different set of [permissions](https://doc.ibexa.co/en/saas/permissions/permission_overview/index.md), the most fitting example being the `content/edit` permission limited to an `Articles/BookReviews/Historical` subtree of the content tree. In the next steps, after you create user groups, you’d assign roles to these groups, and add individual users to each of such groups. For more technical information about permissions and limitations, see [Permission use cases](https://doc.ibexa.co/en/saas/permissions/permission_use_cases/index.md). There are, however, mechanisms to control access to content with even more convenience. ### Sections You can divide your content tree into nominal parts to better organize it. Once you have defined sections, for example, Media or Forms, and assigned them to content items, you can decide which roles have access to which section of the tree. The setting is inherited, which means that a child content item inherits a value of this setting from its parent. Changing a section setting doesn't result in moving a content item to a different location within a content tree. ![Members of the Media Section](https://doc.ibexa.co/en/saas/content_management/img/sections.png) ### Object states While reviewing the details of each individual content item in your content tree, you can assign a state to it, for example, “Locked” or “Not locked”. Then you can set a permission that allows or denies users access to content items in a specific state. This setting isn't inherited. ![Object states in content item’s Details](https://doc.ibexa.co/en/saas/content_management/img/object_states.png) ### User segments Although segments aren't meant to classify content, they could fall into this category, because their role is about targeting users, and not controlling their access to content. With segments, you can reach specific groups, or categories, of visitors with specific information about content or products that could be of their interest. For example, you can build Pages that contain different recommendations, depending on who is visiting them. ![A segment group with two user segments](https://doc.ibexa.co/en/saas/content_management/img/user_segments.png) ## How to get started With your Cohesivo instance ready, you can employ the content management features to good use. Since content management is an ongoing process, and, in your implementation, you might prefer focusing on other areas of configuration, the order of operations below is by all means conventional. **1. Create a content model** Any content that you might want to deliver to a viewer can be structured and split into smaller elements. Reverse-engineer the intended concepts into individual fields, which can be categorized, and then picked from categories and combined into content items. Reuse existing field types, then [create content types](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/). **2. Define permissions** Although this step isn't directly related to content management, it's a good time to [set up user roles and permissions](https://doc.ibexa.co/projects/userguide/en/saas/permission_management/work_with_permissions/), which users would need to work with content. **3. Author content** [Create various content items](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/), such as pages, articles, forms, or media. While you fill fields with content, several actions are there to help you with your task. You can pause and resume the work, preview the results, or send content for review. ![Send to review](https://doc.ibexa.co/en/saas/content_management/img/send_to_review.png) **4. Publish** Again, this isn't part of content management, but at this point you can [publish](https://doc.ibexa.co/projects/userguide/en/saas/content_management/publish_instantly/) it right away or [schedule content for publication](https://doc.ibexa.co/projects/userguide/en/saas/content_management/schedule_publishing/). **5. Organize content** Organize the content of your website by copying or moving content items, [controlling Locations and URL addresses](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_organization/manage_locations_urls/). Then work with Tags, sections and object states to [classify](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_organization/classify_content/#sections) it. ## Benefits The most important benefits of using Content management capabilities of Cohesivo can be gathered into the following groups: 1. Content management capabilities help reduce the effort required to maintain, administer, and distribute digital content, so that you can focus on business operations. 2. Segmentation, translations, and taxonomy make it possible to assist and target visitors from different backgrounds and markets. 3. Granular access control ensures that no content in your control lands before the unauthorized eyes. ## Use cases Cohesivo’s capabilities prove indispensable in many applications. ### Corporate website The most common use case for a comprehensive content management system like Cohesivo would be creating and maintaining a multinational company’s digital presence, with both public and intranet channels, multiple websites with overlapping content structures, and business partners and end-customers alike wanting to connect through different channels to access public and classified content. ### B2C web store Content management could lie at a foundation of a successful global web store, where customers connect through localized websites and branded mobile apps: individual products can have multiple variants with differing related assets, product descriptions must be available in multiple language versions, and access to certain areas of the store depends on both a country and a segment that the customer comes from. ### B2B store Extensive content management capabilities would prove themselves in a setting, where multiple buyers from different partner companies connect to an industry leader’s trading website, and they expect to find well organized product code (SKU) catalogs that contain basic product information. From there they would like to access detailed specifications, white papers and application notes. The same products could come with different brands and at different price points, depending on the customer segment or origin. # Content model > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo's content model relies on content items that are instances of content types and contain content fields. ## Content model overview The content structure in Cohesivo is based on content items. A content item represents a single piece of content, for example, an article, a blog post, an image, or a product. Each content item is an instance of a content type. > **Tip: Tip** > > An introduction to the content model for non-developer users is available in [User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_model/). ## Content items A content item consists of: - [Content information](#content-information) - [Fields](#fields), defined by the [content type](https://doc.ibexa.co/en/saas/administration/content_organization/content_types/index.md). The fields can cover data ranging from single variables and text lines to media files or blocks of formatted text. ### Content information General information about a content item is stored in a `ContentInfo` object. `ContentInfo` doesn't include fields. It contains following information: **`id`** - the unique ID of the Content object. These numbers aren't recycled, so if an item is deleted, its ID isn't reused when a new one is created. **`contentTypeId`** - the unique numerical ID of the content type, on which the content item is based. **`name`** - the name is generated automatically based on a [pattern specified in the content type definition](https://doc.ibexa.co/en/saas/administration/content_organization/content_types/#content-name-pattern). The name is in the main language of the content item. > **Note: Note** > > `name` is always searchable, even if the field(s) used to generate it aren't. **`sectionId`** - the unique number of the section to which the content item belongs. New content items are placed in the Standard section by default. This behavior can be changed, but content must always belong to some section. For more information, see [Sections](https://doc.ibexa.co/en/saas/administration/content_organization/sections/index.md). **`currentVersionNo`** - current version number is the number of the published version or of a newly created draft (which is 1). **`published`** - true if a published version exists, otherwise false. **`ownerId`** - ID of the user who initially created the content item. It's set by the system the first time the content item is published. The ownership of an item cannot be modified and doesn't change even if the owner is removed from the system. **`modificationDate`** - date and time when the content item was last modified. It's set by the system and cannot be modified manually, but changes every time the item is published again. **`publishedDate`** - date and time when the content item was published for the first time. It's set by the system and cannot be modified. **`alwaysAvailable`** - indicates if the content item is shown in the main language when it's not present in another requested language. It's [set per content type](https://doc.ibexa.co/en/saas/content_management/content_availability/index.md). **`remoteId`** - a global unique ID of the content item. Accepts up to 100 characters. Cannot contain non-printable characters and control sequences (anything in ASCII range `\x00` - `\x1F`). It's recommended to either let this value be generated by the Public PHP API as an MD5 hash, or at least to generate it as a hash (for example, one from SHA family). **`mainLanguageCode`** - the main language code of the content item. If the `alwaysAvailable` flag is set to true, the content item is shown in this language when the requested language doesn't exist. **`mainLocationId`** - identifier of the content item's main [location](https://doc.ibexa.co/en/saas/content_management/locations/index.md). **`status`** - status of the content item. It can have three statuses: 0 – *draft*, 1 – *published* and 2 – *archived*. When an item is created, its status is set to *draft*. After publishing the status changes to *published*. When a published content item is moved to Trash, the item becomes *archived*. If a published item is removed from the Trash (or removed without being put in the Trash first), it's permanently deleted. ![Diagram of an example content item](https://doc.ibexa.co/en/saas/content_management/img/content_model_item_diagram.png) The fields of a content item are defined by the content type to which the content item belongs. ## Fields A field is the smallest unit of storage in the content model and the building block of all content items. Every field belongs to a field type. ### Field value validation The values entered in a field may undergo validation, which means the system makes sure that they're correct for the chosen field type and can be used without a problem. Validation depends on the settings of a particular field type. It cannot be turned off for a field if its field type supports it. ### Field details Aside from the field type, the field definition in a content type provides the following information: **Name** – a user-friendly name that describes the field. This name is used in the interface, but not internally by the system. It can consist of letters, digits, spaces, and special characters (the maximum length is 255 characters). If no name is provided, a unique one is automatically generated. **Identifier** – an identifier for internal use, for example, in configuration files, templates, or PHP code. It can only contain lowercase letters, digits and underscores (the maximum length is 50 characters). This identifier is also used in name patterns for the content type. **Description** – a detailed description of the field. **Required** – a flag which indicates if the field is required for the system to accept the content item. By default, if a field is flagged as Required, a user isn't able to publish a content item without filling in this field. > **Note: Note** > > You can use the `ContentService::validate()` method to decide whether the required fields or whole content items are checked for completeness at other stages of the editing process. > > The Required flag is in no way related to field validation. A field's value is validated whether the field is set as required or not. **[Searchable](https://doc.ibexa.co/en/saas/search/search/index.md)** – a flag which indicates if the value of the field is indexed for searching. The Searchable flag isn't available for some fields, because some field types don't allow searching through their values. **[Translatable](https://doc.ibexa.co/en/saas/multisite/languages/languages/index.md)** – a flag which indicates if the value of the field can be translated. It's independent of the field type, which means that even fields such as "Float" or "Image" can be set as translatable. Depending on the field type, there may also be other, specific information to fill in. For example, the "Country" field type allows you to select the default country, and to allow selecting multiple countries at the same time. ![Diagram of content model](https://doc.ibexa.co/en/saas/content_management/img/content_model_diagram.png) ## Content versions Each content item can have multiple versions. Each version has one of the following statuses: *draft*, *archived* or *published*. A new version is created every time a content item is edited. The previous published version isn't modified. Only one version can be published at the same time. When you publish a new version, the previous published version changes its status to Archived. The number of preserved archived versions is set in `ibexa.repositories.default.options.default_version_archive_limit`. By default it's set to 5. A new version is also created when a new [language](https://doc.ibexa.co/en/saas/multisite/languages/languages/index.md) is added to the content item. ## Products Products are a special type of content that holds products you can manage with the product catalog capabilities. For more information, see [Product catalog](https://doc.ibexa.co/en/saas/product_catalog/product_catalog/index.md). # Locations > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Locations hold published content items and can be used to control visibility. When a new content item is published, it's automatically placed in a new location. All locations form a tree which is the basic way of organizing content in the system. Every published content item has a location and, as a consequence, also a place in this tree. ![Content tree - locations](https://doc.ibexa.co/en/saas/content_management/img/content_management_tree_locations.png "Content tree - locations") A content item receives a location only once it has been published. This means that a new unpublished draft doesn't have a location yet. You can find drafts in the **Drafts** tab in the **Content** menu. ![Drafts](https://doc.ibexa.co/en/saas/content_management/img/content_management_drafts.png "Drafts") A content item can have more than one location. It's then present in two or more places in the tree. For example, an article can be at the same time under "Local news" and "Sports news". Even in such a case, one of these places is always the main location. You can change the main location in the back office in the **Locations** tab. ![Locations](https://doc.ibexa.co/en/saas/content_management/img/content_management_locations.png "Locations") ## Top level locations The content tree is hierarchical. It has an empty root location at the top and a structure of dependent locations below it. Every location (aside from the root) has one parent location and can have any number of children. Top level locations are direct children of the root of the tree. The root has location ID 1, isn't related to any content items and should not be used directly. Under this root there are preset top level locations in each installation which cannot be deleted. ### Content The top level location for the actual contents of a site can be viewed by selecting the **Content structure** tab in the Content mode interface. ![Content structure](https://doc.ibexa.co/en/saas/content_management/img/content_management_tree.png "Content structure") This part of the tree is typically used, for example, for organizing folders, articles, or information pages. The default ID number of this location is 2. It contains a Folder content item. ### Media **Media** is the top level location which stores and organizes information that is frequently used by content items located below the **Content** node. ![Media](https://doc.ibexa.co/en/saas/content_management/img/content_management_media.png "Media") It's a folder that contains images, animations, documents and other files. ### Users **Users** is the top level location that contains the built-in system for managing user accounts. ![Users in Admin panel](https://doc.ibexa.co/en/saas/administration/img/admin_panel_users.png "Users in Admin panel") A user is simply a content item of the user account content type. The users are organized within user group content items below this location. In other words, the **Users** location contains the actual users and user groups, which can be viewed by selecting the **Users** tab in the **Admin** Panel. ### Forms **Forms** is the top level location that is intended for Forms created using the [Form Builder](https://doc.ibexa.co/projects/userguide/en/saas/content_management/work_with_forms/#create-forms). ![Forms](https://doc.ibexa.co/en/saas/content_management/img/content_management_forms.png "Forms") ### Other top level locations You should not add any more content directly below location 1, but instead store any content under one of those top-level locations. ## Location visibility Location visibility allows you to control which parts of the content tree are available on the front page. ![Location visibility](https://doc.ibexa.co/en/saas/content_management/img/content_management_visibility.png "Location visibility") Once a content item is published, it cannot be un-published. When the location of a content item is hidden, the system doesn't display it on the website. > **Caution: Visibility and permissions** > > The [visibility switcher](https://doc.ibexa.co/en/saas/content_management/locations/#location-visibility) is a convenient feature for withdrawing content from the frontend. It acts as a filter in the frontend by default. You can choose to respect it or ignore it in your code. It isn't permission-based, and **doesn't restrict access to content**. Hidden content can be read through other means, like the REST API. > > If you need to restrict access to a given content item, you could create a role that grants read access for a given [**Section**](https://doc.ibexa.co/en/saas/administration/content_organization/sections/index.md) or [**Object State**](https://doc.ibexa.co/en/saas/administration/content_organization/object_states/index.md), and set a different section or object state for the given content. Or use other permission-based [**Limitations**](https://doc.ibexa.co/en/saas/permissions/limitations/index.md). If a content item is hidden, it's invisible in all its locations. If a location is hidden, all of its descendants in the tree are hidden as well. This means that there are three different visibility statuses: - Visible - Hidden - Hidden by superior All locations and content items are visible by default. If a location is made invisible manually, its status is set to Hidden. All locations under it change status to Hidden by superior. A content item is Hidden by superior only in locations in which it has a parent location with the Hidden status. In the following example, the **Content item 1** is Hidden by superior in the **Location A** while still visible in the **Location B**. ![Visibility in two locations](https://doc.ibexa.co/en/saas/content_management/img/locations_visibility.png) From the visitor's perspective a location behaves the same whether its status is Hidden or Hidden by superior – it's unavailable on the front page. The difference is that a location Hidden by superior cannot be revealed separately from their parent(s). It only becomes visible once all of its parent locations are made visible again. A Hidden by superior status doesn't override a Hidden status. This means that if a location is Hidden manually and later one of its ancestors is hidden as well, the first location's status doesn't change – it remains Hidden (not Hidden by superior). If the ancestor location is made visible again, the first location still remains hidden. The way visibility works can be illustrated using the following scenarios: ### Hiding a visible location ![Hiding a visible location](https://doc.ibexa.co/en/saas/content_management/img/node_visibility_hide.png) When you hide a location that was visible before, it gets the status Hidden. Its child locations are Hidden by superior. The visibility status of child locations that were already Hidden or Hidden by superior doesn't change. ### Hiding a location which is Hidden by superior ![Hiding a location which is Hidden by superior](https://doc.ibexa.co/en/saas/content_management/img/node_visibility_hide_invisible.png) When you explicitly hide a location which was Hidden by superior, it gets the status Hidden. Since the underlying locations are already either Hidden or Hidden by superior, their visibility status doesn't changed. ### Revealing a location with a visible ancestor ![Revealing a location with a visible ancestor](https://doc.ibexa.co/en/saas/content_management/img/node_visibility_unhide1.png) When you reveal a location which has a visible ancestor, this location and its children become visible. However, child locations that were explicitly hidden by a user keep their Hidden status (and their children remain Hidden by superior). ### Revealing a location with a Hidden ancestor ![Revealing a location with a Hidden ancestor](https://doc.ibexa.co/en/saas/content_management/img/node_visibility_unhide2.png) When you reveal a location that has a Hidden ancestor, it **doesn't** become Visible itself. Because it still has invisible ancestors, its status changes to Hidden by superior. > **Tip: In short** > > A location can only be Visible when all of its ancestors are Visible as well. ### Visibility mechanics The visibility mechanics are controlled by two flags: Hidden flag and Invisible flag. The Hidden flag informs whether the node has been hidden by a user or not. A raised Invisible flag means that the node is invisible either because it was hidden by a user or by the system. Together, the flags represent the three visibility statuses: | Hidden flag | Invisible flag | Status | | ----------- | -------------- | ------------------------------------------------------------------------------------------------------------------------ | | - | - | The location is visible. | | 1 | 1 | The location is invisible and it was hidden by a user (Hidden). | | - | 1 | The location is invisible and it was hidden by the system because its ancestor is hidden/invisible (Hidden by superior). | > **Note: Note** > > Displaying visible or hidden locations in governed by the [`Visibility` Search Criterion](https://doc.ibexa.co/en/saas/search/criteria_reference/visibility_criterion/index.md) # Content Relations > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Content Relations control links between different content items, either created explicitly or by linking inside RichText fields. Content items are located in a tree structure through the locations they're placed in. However, content items themselves can also be related to one another. ![Content Relations](https://doc.ibexa.co/en/saas/content_management/img/content_management_relations.png "Content Relations") A **Relation** can exist between any two content items in the repository. For example, images are linked to news articles they're used in. Instead of using a fixed set of image attributes, the images are stored as separate content items outside the article. In the system you can find different types of Relations. Content can have Relations on item or on field level. *Relations at field level* are created using one of two special field types: Content relation (single) and Content relations (multiple). These fields allow you to select one or more other content items in the field value, which are linked to these fields. *Relations at content item level* can be of three different types: - *Common Relations* are created between two content items using the public PHP API. - *RichText linked Relations* are created using a field of the RichText type. When an internal link (a link to another location or content item) is placed in a RichText field, the system automatically creates a Relation. The Relation is automatically removed from the system when the link is removed from the content item. - *RichText embedded Relations* also use a RichText field. When an Embed element is placed in a RichText field, the system automatically creates a Relation between the embedded content item and the one with the RichText field. The Relation is automatically removed from the system when the link is removed from the content item. # Content availability > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Control the availability of content items with relation to translations by using the Default content availability flag. The Default content availability flag enables you to control whether content is available when its translation is missing. You can set the flag in content type definition by checking the "Make content available even with missing translations" option. It's automatically applied to any new content item of this Type. ![Default content availability](https://doc.ibexa.co/en/saas/content_management/img/availability_flag.png "Default content availability") A content item with this flag is available in its main language even if it's not translated into the language of the current SiteAccess. Without the flag, a content item isn't available at all if it doesn't have a language version corresponding to the current SiteAccess. > **Note: Note** > > There is currently no way in the back office to edit the Content availability flag for an already published content item. The Default availability flag is used for the out-of-the box content types representing content that should always be visible to the user, such as media files or user content items. You can also use it for organizational content types. For example, you can assign the flag to a Blog content type which is intended to contain Blog Posts in multiple languages. If the Blog is in English only, it would not be visible for readers using the Norwegian or German SiteAcceses. However, if you set the default availability flag for the Blog content type, it's displayed to them in English (if it's set as a main language) and enables the users to browse individual posts in other languages. # Taxonomy > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). A taxonomy uses tags to categorize and organize content Taxonomies (**Tags**) allow you to organize content to make it easy for your site users to browse and to deliver content appropriate for them. Taxonomies are classifications of logical relationships between content. The system enables creating any entities with a tree structure and assign them to a content item. The content type associated with taxonomy is called `tag`. ## Taxonomy suggestions With taxonomy suggestions, editors can pick from suggestions generated by an AI service based on selected fields like the product's or content item's name and description instead of having to manually browse through taxonomy trees and selecting [product categories](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/work_with_product_categories/#assign-product-categories-by-editing-product-details) or [tags](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/#add-taxonomy-entries). # Images > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Manage image assets. Images are an integral part of any website. They can serve as decoration and convey information. ## Reuse images You can store images in the media library as independent content items of a generic Image [content type](https://doc.ibexa.co/en/saas/administration/content_organization/content_types/index.md) to reuse them across the system. You do this by uploading images to an [ImageAsset](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imageassetfield/index.md) field type. For an ImageAsset field to be reused, you must publish it. Only then is notification triggered, which states that an image has been published under the location and can now be reused. After you establish a media library, you can create [Relations](https://doc.ibexa.co/en/saas/content_management/content_relations/index.md) between the image content item and the main content item that uses it. ## Edit images When a content item contains fields of the [`ibexa_image`](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imageassetfield/index.md) type, users can perform basic image editing functions with the Image Editor. For more information, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/image_management/edit_images/). ## Embedding images in Rich Text The [RichText](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/richtextfield/index.md) field allows you to embed other content items within the field. Content items that are identified as images are rendered in the Rich Text field. # Configure Image Editor > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Configure image editor to crop, flip, and modify images. When a content item contains fields of the [`ibexa_image`](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imageassetfield/index.md) type, users can perform basic image editing functions with the Image Editor. For more information, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/image_management/edit_images/). > **Note: Note** > > The Image Editor doesn't support images that come from a Digital Asset Management (DAM) system. # RichText > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). RichText is a type of field that you add in any content item in Cohesivo and edit in Online Editor. RichText is a type of field that you add in any content item in Cohesivo and edit in Online Editor. - [Online Editor product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/rich_text/online_editor_guide/): Learn how to use the Online Editor, a tool that allows you to edit RichText Fields in any content item in Cohesivo. # Online Editor product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Learn how to use the Online Editor, a tool that allows you to edit RichText Fields in any content item in Cohesivo. ## What is Online Editor Online Editor is the interface for editing RichText fields in any content item in Cohesivo. ## Availability Online Editor is available in all supported Cohesivo versions. ## How to get started Online Editor is the default editing interface for all RichText fields. To start using it, create any content item with a RichText field (for example, based on the built-in Article content type) and edit this field. ## Capabilities ### Rich Text editor Online Editor covers all fundamental formatting options for rich text, such as headings, lists, tables, inline text formatting, anchors, and links. It also allows embedding other content from the repository, but also from Facebook, Twitter, or YouTube. #### Links All links added to a RichText field by using the link element are listed and can be managed in the [Link manager](https://doc.ibexa.co/en/saas/content_management/url_management/url_management/index.md). #### Distraction free mode While editing Rich Text fields, you can switch to distraction free mode that expands the workspace to full screen. ![Distraction free mode](https://doc.ibexa.co/en/saas/content_management/img/distraction_free_mode.png) For more information, see [Distraction free mode](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/#distraction-free-mode). ## Benefits ### Familiar editing tools Online editor offers rich text editing tools familiar to most editors and contributors, which allows quick adoption to the editorial flow. ![Familiar editing tools](https://doc.ibexa.co/en/saas/content_management/rich_text/img/familiar_editing_tools.png) ## Use cases ### Product marketing campaigns With the Online Editor, editors can embed products from the product catalog directly into RichText fields. Products can be embedded as block-level or inline elements. You can use it to weave marketing content around your product data, showcasing your product capabilities and bringing it closer to your customers. See [Embed products in content](https://doc.ibexa.co/en/saas/product_catalog/products/#embed-products-in-content) for details. # Binary and Media download > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Create route to to enable binary and media files download. You can restrict files stored in BinaryFile or Media fields to certain user roles. These files aren't publicly downloadable from disk, and are instead served by a route that runs the necessary checks. This route is automatically generated as the `url` property for those field values. ## REST API: `uri` property The `uri` property of Binary fields in REST contains a valid download URL, prefixed with the same host as the REST Request. For [more information about REST API see the documentation](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_usage/rest_api_usage/index.md). # Pages > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Pages are block-based special types of content that editors can create and modify by using a visual drag-and-drop editor. Pages are block-based special types of content that editors can create and modify by using a visual drag-and-drop editor. - [Page Builder product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/pages/page_builder_guide/): Read about the Page Builder - a powerful tool for creating and modifying pages in Cohesivo. - [Page blocks](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/pages/page_blocks/): Use blocks to customize the content of a Page with dynamic content. # Page Builder product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Read about the Page Builder - a powerful tool for creating and modifying pages in Cohesivo. ## What is page [Page](https://doc.ibexa.co/en/saas/content_management/pages/pages/index.md) is a block-based type of content. You can create and modify it with a visual drag-and-drop editor - Page Builder. Page is divided into zones into which you can drop various dynamic blocks. By editing pages you can customize the layout and content of your website. ### Create page To create a new page: 1. In the main menu, go to **Content**. 2. Select **Content structure**. 3. On the right-side toolbar, click **Create content**. 4. From the list of content items select **Landing Page**. 5. Select the layout and click **Create**. ![Create page](https://doc.ibexa.co/en/saas/content_management/img/create_page.png) ### Edit page You can edit any existing page with the Page Builder. To do it, in the back office go to **Content** and select **Content structure**. Then, from the content tree choose the page and click **Edit**. ## What is Page Builder Page Builder is a visual tool that allows you to create and edit any page in Cohesivo. It's more than managing: it's about building pages, creating customized content and fully-targeted landing pages. Creating pages in Page Builder involves composing content from ready-to-use elements - blocks. It's also important to choose a layout - it determines the arrangement of drop zones that contain content elements. ![Page Builder - diagram](https://doc.ibexa.co/en/saas/content_management/img/page_builder_diagram.png) ### Availability Page Builder is available in Cohesivo. ### How does Page Builder work #### Page Builder interface Page Builder has plain and intuitive interface. You can create a Page without having advanced technical skills. ![Page Builder interface](https://doc.ibexa.co/en/saas/content_management/img/page_builder_interface.png) Page Builder user interface consists of: A. Drop zone B. Page blocks / Structure view toolbar C. Settings toolbar (including Fields, Visibility and Schedule settings) D. Mode toolbar (including PC, tablet and mobile mode) E. Buttons: | Button | Description | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------- | | Edit and preview switch | Access main properties of the page, like title and description. | | Preview segments | Access preview of the page for a given segment. | | Timeline button | Access the timeline to preview how the page changes with time. You can also view the list of all upcoming scheduled events. | | View toggler | Toggle through to see how the page is rendered on different devices. | | Page blocks menu | Move Page blocks / Structure view to the other side of the screen. | | Undo | Undo latest change. | | Redo | Redo latest change. | F. Saving options | Option | Description | | ----------------------- | -------------------------------------------------- | | Close | Close the page without saving it. | | Send to review | Save the page and send it to review. | | Publish / Publish later | Publish the page or schedule publishing for later. | | Save draft | Save the page draft\*. | | Delete draft | Delete the page draft. | \*To help you preserve your work, system saves drafts of content items automatically. For more information, see [Autosave](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_versions/#autosave). Page Builder has two main views that you can use while creating a page: - Page blocks toolbar - consists of all available elements that you can use by dragging them and dropping on a drop zone. ![Page blocks](https://doc.ibexa.co/en/saas/content_management/img/page_blocks_toolbar.png) - Structure view - shows a structure of the page, including its division into zones and the blocks that it contains. It follows the behavior of the content tree. Structure view has ability to reorder blocks using drag and drop. ![Structure view](https://doc.ibexa.co/en/saas/content_management/img/structure_view.png) ##### Choose layout For newly created Page you can choose a [layout](https://doc.ibexa.co/projects/userguide/en/saas/content_management/configure_ct_field_settings/#available-page-layouts) which defines the available zones. Applying a layout divides the Page into the defined zones. The zones are placeholders for content items. On the Page creation modal, select the layout and click **Create draft**. Now you're ready to add blocks of content to the Page. The page layouts that an editor has access to are up to you to choose. In the `Select layouts` section, you can select layouts that you want to be available for the Page. ![Switch layout](https://doc.ibexa.co/en/saas/content_management/img/switch_layout_window.png) #### Add blocks To customize your page in Page Builder you need to add blocks. To do it, access Page blocks toolbar, drag page block that you want to use, and drop it on the empty place on a drop zone. When you add a new block to the drop zone, drop it in the blue highlighted area. Before you drop it, a bold line appears - it helps you see the position of the newly added block in relation to other, already added blocks. ![Drop zone line](https://doc.ibexa.co/en/saas/content_management/img/drop_zone_line.png) Ready-to-use blocks available in Cohesivo have their own, unique functions. All available tools and settings, that Page Builder comes with, enable you to customize the content appearing on the page. You can check all ready-to-use blocks available in Page Builder in User Documentation, [Block reference page](https://doc.ibexa.co/projects/userguide/en/saas/content_management/block_reference/). #### Work with blocks Working with blocks is intuitive. You don't have to worry about placing blocks in the proper place from the start - you can reorder them at any time. You can reorder blocks in a few ways: - drag and drop block in the desired location on a drop zone - select block and use up and down arrow on the keyboard - access Structure view and use 'Move up' and 'Move down' function in the settings of the block or drag and drop to change the position in the structure ![Structure view - drag and drop](https://doc.ibexa.co/en/saas/content_management/img/structure_view_drag_drop.png) You can manage each block by accessing its settings. To do it, click settings icon next to the block's name. ![Block settings](https://doc.ibexa.co/en/saas/content_management/img/block_settings.png) Available settings are: - Move up - allows you to change position of the block on the page by moving it up - Move down - allows you to change position of the block on the page by moving it down - Configuration - allows you to access configuration window - Duplicate - duplicates a block with its settings, by creating a copy of it that appears below the original block - Refresh - refreshes preview of the block - Delete - deletes existing block #### Distraction free mode While configuring blocks that include Rich Text section, for example, Text block, you can switch to distraction free mode that expands the workspace to full screen. ![Distraction free mode](https://doc.ibexa.co/en/saas/content_management/img/distraction_free_mode.png) For more information, see [Distraction free mode](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/#distraction-free-mode). #### Schedule content Page Builder comes with a Scheduler, it allows you to schedule content appearance. You can schedule content to be revealed, or hidden in Page Builder in two ways with: - **Scheduler tab** - it's available in the configuration of all Page blocks. In this tab you can set the date and time when the block becomes visible and when it disappears from a Page. ![Scheduler tab](https://doc.ibexa.co/en/saas/content_management/img/scheduler_tab.png) - **Content Scheduler** - it's one of the blocks available in Page Builder Page blocks menu. To proceed with the schedule, go to **Basic** tab of the block, then click **Select content** and confirm your choice. Then set date and time in the **Content airtime settings** window. ![Content Scheduler](https://doc.ibexa.co/en/saas/content_management/img/content_scheduler.png) For more information, see [Schedule publication](https://doc.ibexa.co/projects/userguide/en/saas/content_management/schedule_publishing/). ## Benefits ### Manage your pages without technical skills Thanks to intuitive and plain Page Builder interface, you can create and manage your website without the need of having advanced technical skills. Page blocks toolbar, visible page zones and Structure view - these are the elements that make working with Page Builder really intuitive and quick. ### Self schedule content, special offers and campaigns One of the most important tools that Page Builder offers, is a Scheduler. It allows you to set and schedule a specific date and time for the content to be published or hidden. As a result, you can manage timeline of publications, without the need of manual publishing, or hiding each of them. ### Create high-converting and fully-targeted landing pages Page Builder allows you to create highly customizable websites. You can build modifiable and targeted landing pages that meet your needs. Each dynamic blocks has its own settings, properties and design that you can set up in your way to customize the content appearing on the page. Additionally, if you feel comfortable with your technical skills, you can configure your own elements, for example, a new customized layout, or block. ### Increase sales with highly personalized campaigns Personalized campaigns are one of the factors that can increase your sales. With Page Builder you can achieve it, by using customization and time Scheduler. Anytime you can edit your page and change a position of a block to enhance visibility. Additionally, Page Builder offers you a selection of ready-to-use page blocks that can help you to create content tailored to each individual customer: A. **Default** blocks: - Targeting - embeds a content item based on the segment the user belongs to. B. **PIM** blocks: - Catalog - displays products from a specific catalog to a selected customer group. - Product collection - displays a list of specifically selected products. - Product embed - displays a specific product. C. [**Recommendations** blocks](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/recommendation_blocks/index.md) - presents content recommendations delivered by Raptor integration. # Page blocks > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Use blocks to customize the content of a Page with dynamic content. Cohesivo ships with a number of page blocks. For a list of all page blocks that are available out-of-the-box, see [Page block reference](https://doc.ibexa.co/projects/userguide/en/saas/content_management/block_reference/) in the user documentation. # Forms > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Forms are a type of content item that you can use to improve the functionality of your website. Forms are a type of content item that you can use to improve the functionality of your website. - [Form Builder product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/forms/form_builder_guide/): See the Form Builder product guide and learn how to create various forms to increase the functionality of your website. # Form Builder product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). See the Form Builder product guide and learn how to create various forms to increase the functionality of your website. ## What is Form Builder Form Builder is a tool that lets you build forms consisting of different fields. By adding forms on the website, you can increase its functionality and improve user experience. Use Form Builder to create various forms, such as survey, questionnaire, sign-up form, using basic form fields available in the Form Builder. You can also manage your forms and review the results gathered from the website users. ## How does Form Builder work ### Form Builder interface Form Builder user interface consists of: A. Drop zone B. Form fields toolbar C. Save button D. Search bar E. Discard button ![Form Builder interface](https://doc.ibexa.co/en/saas/content_management/forms/img/form_builder_interface.png) ### Form fields To create forms, use the available form fields: | Field name | Icon | Description | | ------------------- | ------------------- | -------------------------------------------------------------------------- | | Single line input | Single line input | Single line field for short text. | | Multiple line input | Multiple line input | Multiple line field for longer text. | | Number | Number | Field to set up a number using arrows. | | Checkbox | Checkbox | Single checkbox element with one option value available. | | Checkboxes | Checkboxes | Multiple checkboxes with more than one option values available. | | Radio | Radio | List with multiple option values available and visible. | | Dropdown | Dropdown | Dropdown list with multiple option values available. | | Email | Email | Field to insert an email address. | | Date | Date | Field to insert a date. | | URL | URL | Field to insert an URL address. | | File | File | Interactive field to upload file. | | Captcha | Captcha | Field with captcha and additional blank line to rewrite it. | | Button | Button | Form submit button. | | Hidden field | Hidden field | Field used to submit metadata that should not be visible in rendered form. | ### Create a form Editors can use the created form anywhere on the website. Forms can be used in page blocks, embedded in the online editor or even used as a field relation. The same form can be placed at multiple locations on the website. To learn more, see [Work with forms](https://doc.ibexa.co/projects/userguide/en/saas/content_management/work_with_forms/). ### Forms management Form is one of available [content items](https://doc.ibexa.co/projects/userguide/en/saas/content_management/content_items/) that you can find in the platform. You can work with it as with other regular items, for example, create new one, edit existing one, or move. You can manage all the existing forms. To do it, in a selected place of the content tree find your form and click on it. In this window you can see all the information about your form, view submissions, create versions, and more Using the buttons in the right corner, you can also edit, move, copy, hide, or send your form to the trash. ![Forms management](https://doc.ibexa.co/en/saas/content_management/forms/img/forms_management.png) ### View results You can preview the results of each published form. To do it, go to **Submissions** tab in the content item view: ![View results](https://doc.ibexa.co/en/saas/content_management/forms/img/view_results.png) Here you can view the details of each submission or delete any of them. The **Download submissions** button enables you to download all the submissions in a .CSV (comma-separated value) file. ## Benefits ### General overview With Form Builder you're allowed to build an unlimited number of forms. These forms can be used anywhere on the website and are ready to start collecting information. Form Builder interface is plain, which makes the creation of forms fast and intuitive. ### Forms management Forms can be managed simply and effectively: you can copy them, move, organize into folders, create versions, and delete if necessary. Each field can be configured so that the form collects the exact details that you need. ### Analytic tool All the submissions can are visible in **Submissions** tab. You can download them as a .CSV file for additional analysis. # Workflow > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Workflow controls how content items pass between stages and allows setting up editorial flows, for example for reviews and proofreading. The workflow functionality passes a content item version through a series of stages. For example, an editorial workflow can pass a content item from draft stage through design and proofreading. Cohesivo comes pre-configured with a Quick Review workflow. Workflows are permission-aware. ## Reviewers When moving a content item through a transition, the user can select a reviewer. To be able to search for users for review, the user must have the `content/read` policy without any limitation, or with a limitation that allows reading users. This means that, in addition to your own settings for this policy, you must add the /Users subtree to the limitation and add users in the [content type limitation](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation). ### Draft locking You can configure draft assignment in a way that when a user sends a draft to review, only the first editor of the draft can either edit the draft or unlock it for editing, and no other user can take it over. Use the [Version Lock limitation](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#version-lock-limitation), set to "Assigned only", together with the `content/edit` and `content/unlock` policies to prevent users from editing and unlocking drafts that are locked by another user. ## Workflow event timeline Workflow event timeline displays workflow transitions. ## Permissions You can limit access to workflows at stage and transition level. The `workflow/change_stage` policy grants permission to change stages in a specific workflow. You can limit this policy with the [Workflow Transition limitation](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#workflow-transition-limitation) to only allow sending content in the selected transition. # URL management > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Manage URL aliases and wildcards, and validate external URLs. You can manage external URL addresses and URL wildcards in the back office, **Admin** tab, the **URL Management** node. Configure URL aliases to have human-readable URL addresses throughout your system. ## Link manager When developing a site, users can enter links to external websites in either RichText or URL fields. Each such link is then displayed in the URL table. You can view and update all external links that exist within the site, without having to modify and re-publish the individual content items. The **Link manager** tab contains all the information about each link, including its status (valid or invalid) and the time the system last attempted to validate the URL address. Click an entry in the list to display its details and check which content items use this link. Edit the entry to update the URL address in all the occurrences throughout the website. > **Note: Note** > > When you edit the details of an entry to update the URL address, the status automatically changes to valid. ## URL aliases You can define URL aliases for individual content items, for example, when you reorganize the content, and want to provide users with continuity. For each URL alias definition the history of changes is preserved, so that users who have bookmarked the URL addresses of content items can still find the information they desire. > **Caution: Storage limitation** > > URL aliases that initially had the same name in multiple languages aren't archived. URL aliases aren't SiteAccess-aware. When creating an alias, you can select a SiteAccess to base it on. If the SiteAccess root path (configured in `content.tree_root.location_id`) is different than the default, the prefix path that results from the configured content root is prepended to the final alias path. # Field types > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Field types define the fields that a content item is built of. Field types are the smallest building blocks of content. Cohesivo comes with many [built-in field types](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/field_type_reference/#available-field-types) that cover most common needs, for example, Text line, Email address, Author list, Content relation, Map location, or Float. Field types are responsible for: - Storing data - Validating input data - Making the data searchable (if applicable) - Displaying fields of this type # Field type reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo offers a range of built-in field types that cover most common needs when creating content. A field type is the underlying building block of the content model. It consists of two entities: field value and field definition. Field value is determined by values entered into the content field. Field definition is provided by the content type, and holds any user defined rules used by field type to determine how a field value is, for example, validated, stored, retrieved, or formatted. Cohesivo comes with a collection of field types that can be used to build powerful and complex content structures. > **Tip: Tip** > > For general field type documentation, see [field type](https://doc.ibexa.co/en/saas/content_management/field_types/field_types/index.md). The following table gives an overview of the supported field types that come with Cohesivo. Each field type reference page describes the JSON structure that the REST API returns for a field of that type, and that you send when you create or update it. The **Internal name** column holds the value that the REST API uses as `fieldTypeIdentifier` in field payloads and as `fieldType` in field definitions. ## Available field types | Field type | Internal name | Description | Searchable | | ------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------- | ---------- | | [Address](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/addressfield/index.md) | `ibexa_address` | Stores an address. | No | | [Author](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/authorfield/index.md) | `ibexa_author` | Stores a list of authors, each consisting of author name and author email. | Yes | | [BinaryFile](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/binaryfilefield/index.md) | `ibexa_binaryfile` | Stores a file. | Yes | | [Checkbox](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/checkboxfield/index.md) | `ibexa_boolean` | Stores a boolean value. | Yes | | [Country](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/countryfield/index.md) | `ibexa_country` | Stores country names as a string. | Yes | | [Customer group](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/customergroupfield/index.md) | `ibexa_customer_group` | Stores customer group to which a user belongs. | Yes | | [DateAndTime](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/dateandtimefield/index.md) | `ibexa_datetime` | Stores a full date including time information. | Yes | | [Date](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/datefield/index.md) | `ibexa_date` | Stores date information. | Yes | | [EmailAddress](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/emailaddressfield/index.md) | `ibexa_email` | Validates and stores an email address. | Yes | | [Float](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/floatfield/index.md) | `ibexa_float` | Validates and stores a floating-point number. | Yes | | [Form](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/formfield/index.md) | `ibexa_form` | Stores a form. | Yes | | [Image](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imagefield/index.md) | `ibexa_image` | Validates and stores an image. | Yes | | [ImageAsset](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imageassetfield/index.md) | `ibexa_image_asset` | Stores images in independent content items of a generic Image content type. | Yes | | [Integer](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/integerfield/index.md) | `ibexa_integer` | Validates and stores an integer value. | Yes | | [ISBN](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/isbnfield/index.md) | `ibexa_isbn` | Handles International Standard Book Number (ISBN) in 10-digit or 13-digit format. | Yes | | [Keyword](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/keywordfield/index.md) | `ibexa_keyword` | Stores keywords. | Yes | | [MapLocation](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/maplocationfield/index.md) | `ibexa_gmap_location` | Stores map coordinates. | Yes | | [Matrix](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/matrixfield/index.md) | `ibexa_matrix` | Represents and handles a table of rows and columns of data. | No | | [Measurement](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/measurementfield/index.md) | `ibexa_measurement` | Validates and stores a unit of measure, and either a single measurement value, or a pair of range values. | Yes | | [Media](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/mediafield/index.md) | `ibexa_media` | Validates and stores a media file. | Yes | | [Page](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/pagefield/index.md) | `ibexa_landing_page` | Stores a Page with a layout consisting of multiple zones. | N/A | | [ProductSpecification](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/productspecificationfield/index.md) | `ibexa_product_specification` | Stores product attributes and VAT | Yes | | [Relation](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/relationfield/index.md) | `ibexa_object_relation` | Validates and stores a relation to a content item. | Yes | | [RelationList](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/relationlistfield/index.md) | `ibexa_object_relation_list` | Validates and stores a list of relations to content items. | Yes | | [RichText](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/richtextfield/index.md) | `ibexa_richtext` | Validates and stores structured rich text in XML. | Yes | | [Selection](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/selectionfield/index.md) | `ibexa_selection` | Validates and stores a single selection or multiple choices from a list of options. | Yes | | [TaxonomyEntry](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/taxonomyentryfield/index.md) | `ibexa_taxonomy_entry` | Stores information about the Taxonomy tree. | Yes | | [TaxonomyEntryAssignment](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/taxonomyentryassignmentfield/index.md) | `ibexa_taxonomy_entry_assignment` | Makes content taggable by Taxonomy. | Yes | | [TextBlock](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/textblockfield/index.md) | `ibexa_text` | Validates and stores a larger block of text. | Yes | | [TextLine](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/textlinefield/index.md) | `ibexa_string` | Validates and stores a single line of text. | Yes | | [Time](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/timefield/index.md) | `ibexa_time` | Stores time information. | Yes | | [Url](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/urlfield/index.md) | `ibexa_url` | Stores a URL / address. | Yes | | [User](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/userfield/index.md) | `ibexa_user` | Validates and stores information about a user. | No | # Address field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field represents and handles address fields. It allows you to customize address fields per country. | Name | Internal name | | --------- | --------------- | | `Address` | `ibexa_address` | ## Field value The field value is an object with the following keys: | Key | Type | Description | Example | | --------- | -------- | ------------------------------------------ | ----------------- | | `name` | `string` | Name of the address. | `My home address` | | `country` | `string` | Country code in ISO 3166-1 alpha-2 format. | `NO` | | `fields` | `object` | Additional fields, keyed by identifier. | See below. | The keys available under `fields` depend on the address format configured for the country and on the `type` field definition setting. ```json { "fieldDefinitionIdentifier": "billing_address", "languageCode": "eng-GB", "fieldValue": { "name": "Headquarters", "country": "NO", "fields": { "region": "Company HQ location region", "locality": "Company HQ location city", "street": "Company HQ location street and building", "postal_code": "00000", "email": "company@email.invalid", "phone_number": "+47 000 000 000" } } } ``` ## Validation This field type doesn't perform any special validation of the input value. The REST API accepts an address in which `name`, `country`, or both, are `null`. ## Settings The field definition of this field type can be configured with a single option: | Name | Type | Default value | Description | | ------ | -------- | ------------- | ---------------------------------------------------- | | `type` | `string` | `"personal"` | Identifier of the address format used by this field. | ```json { "fieldSettings": { "type": "personal" } } ``` # Author field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type allows the storage and retrieval of one or more authors. For each author, it can handle a name and an email address. It's typically used to store information about additional authors who have written/created different parts of a content item. | Name | Internal name | | -------- | -------------- | | `Author` | `ibexa_author` | ## Field value The field value is an array of author objects, each with the following keys: | Key | Type | Description | Example | | ------- | -------- | --------------------------------------------------------------------- | ----------------------- | | `id` | `string` | Identifier of the author entry. An integer is also accepted on input. | `1` | | `name` | `string` | Name of the author. | `Boba Fett` | | `email` | `string` | Email address of the author. | `boba.fett@example.com` | ```json { "fieldDefinitionIdentifier": "authors", "languageCode": "eng-GB", "fieldValue": [ { "id": "1", "name": "Boba Fett", "email": "boba.fett@example.com" }, { "id": "2", "name": "Darth Vader", "email": "darth.vader@example.com" } ] } ``` ## Validation This field type doesn't perform any special validation of the input value. ## Settings The field definition of this field type can be configured with a single option: | Name | Type | Default value | Description | | --------------- | --------- | ------------- | ------------------------------------------------------------------------------------------- | | `defaultAuthor` | `integer` | `0` | Default field value used by the editing interface. `0` means empty, `1` means current user. | ```json { "fieldSettings": { "defaultAuthor": 1 } } ``` # BinaryFile field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents and handles a single binary file. It also counts the number of times the file has been downloaded. It's capable of handling virtually any file type and is typically used for storing document types, for example, PDF files, Word documents, or spreadsheets. The maximum allowed file size is determined by the `FileSizeValidator` configuration of the field definition. | Name | Internal name | | ------------ | ------------------ | | `BinaryFile` | `ibexa_binaryfile` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | --------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | | `id` | `string` | Binary file identifier. | `application/63cd472dd7.pdf` | | `fileName` | `string` | The human-readable file name, as exposed to the outside. Used when sending the file for download to name the file. | `20130116_whitepaper.pdf` | | `fileSize` | `integer` | File size, in bytes. | `1077923` | | `mimeType` | `string` | The file's MIME type. | `application/pdf` | | `uri` | `string` | Download URL of the file, prefixed with the same host as the REST request. See [Binary and Media download](https://doc.ibexa.co/en/saas/content_management/file_management/binary_and_media_download/index.md). | `https://example.com/content/download/210/file/20130116_whitepaper.pdf` | | `url` | `string` | Same value as `uri`. Kept for backward compatibility, use `uri` instead. | See `uri`. | | `downloadCount` | `integer` | Number of times the file was downloaded. | `0` | | `inputUri` | `string` | Internal storage path of the file. Read-only on output. | `var/site/storage/original/application/63cd472dd7.pdf` | | `path` | `string` | Same value as `inputUri`. Kept for backward compatibility. | See `inputUri`. | ```json { "fieldDefinitionIdentifier": "file", "languageCode": "eng-GB", "fieldValue": { "id": "application/63cd472dd7.pdf", "fileName": "20130116_whitepaper.pdf", "fileSize": 1077923, "mimeType": "application/pdf", "uri": "https://example.com/content/download/210/file/20130116_whitepaper.pdf", "downloadCount": 0 } } ``` ### Uploading a file To send file contents, provide them as a base64-encoded string under the `data` key, together with `fileName`: ```json { "fieldDefinitionIdentifier": "file", "languageCode": "eng-GB", "fieldValue": { "fileName": "My file.pdf", "fileSize": 17589, "data": "JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBS..." } } ``` To keep the existing file while updating other keys, send the field value without the `data` key, and remove the `url` key. > **Caution: Remove theurlkey before you send the value back** > > The API returns both `uri` and `url`, but it doesn't accept `url` as input. Sending the value back unchanged fails with `500 Property 'url' not found on class 'Ibexa\Core\FieldType\BinaryFile\Value'`. ## Validation The field type supports `FileSizeValidator`, defining the maximum size of the file in bytes: | Name | Type | Default value | Description | | ------------- | --------- | ------------- | ---------------------------------- | | `maxFileSize` | `integer` | `null` | Maximum size of the file in bytes. | ```json { "validatorConfiguration": { "FileSizeValidator": { "maxFileSize": 10485760 } } } ``` # Checkbox field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Checkbox field type stores the current status for a checkbox input, checked or unchecked. | Name | Internal name | | ---------- | --------------- | | `Checkbox` | `ibexa_boolean` | ## Field value The field value is a boolean: `true` when the checkbox is checked, `false` when it isn't. It's never considered empty. ```json { "fieldDefinitionIdentifier": "enable_comments", "languageCode": "eng-GB", "fieldValue": true } ``` # Country field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents one or multiple countries. | Name | Internal name | | --------- | --------------- | | `Country` | `ibexa_country` | ## Field value The field value is an array of [Alpha-2](https://www.iso.org/iso-3166-country-codes.html) country codes, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "country", "languageCode": "eng-GB", "fieldValue": ["NO", "PL"] } ``` On input, each entry can be a country Name, Alpha-2, or Alpha-3 code. The stored and returned value always uses Alpha-2 codes. ## Validation This field type validates whether multiple countries are allowed by the field definition, and whether the [Alpha2](https://www.iso.org/iso-3166-country-codes.html) is valid according to the countries configured in Cohesivo. ## Settings The field definition of this field type can be configured with a single option: | Name | Type | Default value | Description | | ------------ | --------- | ------------- | ------------------------------------------------------------------------------------------ | | `isMultiple` | `boolean` | `false` | This setting allows (if true) or prohibits (if false) the selection of multiple countries. | ```json { "fieldSettings": { "isMultiple": true } } ``` # Customer group field > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents a customer group that a user belongs to. | Name | Internal name | | ---------------- | ---------------------- | | `Customer group` | `ibexa_customer_group` | ## Field value The field value is an object with a single key, or `null` when the field is empty: | Key | Type | Description | Example | | ------------------- | --------- | ------------------------- | ------- | | `customer_group_id` | `integer` | ID of the customer group. | `1` | ```json { "fieldDefinitionIdentifier": "customer_group", "languageCode": "eng-GB", "fieldValue": { "customer_group_id": 1 } } ``` # DateAndTime field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents a full date and time information. | Name | Internal name | | ------------- | ---------------- | | `DateAndTime` | `ibexa_datetime` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | ----------- | --------- | ---------------------------------------------------------------------------------------------------- | --------------------------------------- | | `timestamp` | `integer` | Time information in [Unix format timestamp](https://en.wikipedia.org/wiki/Unix_time). | `1400856992` | | `rfc850` | `string` | Time information as a string in [RFC 850 date format](https://datatracker.ietf.org/doc/html/rfc850). | `"Friday, 23-May-14 14:56:14 GMT+0000"` | ```json { "fieldDefinitionIdentifier": "event_start", "languageCode": "eng-GB", "fieldValue": { "timestamp": 1400856992, "rfc850": "Friday, 23-May-14 14:56:14 GMT+0000" } } ``` On input, you can provide any one of the following keys. `rfc850` takes precedence over `timestring`, which takes precedence over `timestamp`: | Key | Type | Description | Example | | ------------ | --------- | ------------------------------------------------------ | --------------------------------------- | | `rfc850` | `string` | Date and time as an RFC 850 string. | `"Friday, 23-May-14 14:56:14 GMT+0000"` | | `timestring` | `string` | Date and time as a string in any commonly used format. | `"2017-08-28 12:20 Europe/Berlin"` | | `timestamp` | `integer` | Date and time as a Unix timestamp. | `1346149200` | ## Validation This field type doesn't perform any special validation of the input value. ## Settings The field definition of this field type can be configured with several options: | Name | Type | Default value | Description | | -------------- | --------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `useSeconds` | `boolean` | `false` | Used to control displaying of seconds in the output. | | `defaultType` | `string` | `"DEFAULT_EMPTY"` | Default field value used by the editing interface. See the values below. | | `dateInterval` | `object` | `null` | Complements the `defaultType` setting and is used only when the latter is set to `"DEFAULT_CURRENT_DATE_ADJUSTED"`. The default input value is then adjusted by the given interval. | | Value | Description | | --------------------------------- | -------------------------------------------------------------------------------------------- | | `"DEFAULT_EMPTY"` | Default value is empty. | | `"DEFAULT_CURRENT_DATE"` | Default value uses current date. | | `"DEFAULT_CURRENT_DATE_ADJUSTED"` | Default value uses current date, adjusted by the interval defined in `dateInterval` setting. | ```json { "fieldSettings": { "useSeconds": false, "defaultType": "DEFAULT_CURRENT_DATE" } } ``` # Date field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents a date without time information. Time information is **not stored**. Before storing, the provided input value is set to the beginning of the day in the given or the environment timezone. | Name | Internal name | | ------ | ------------- | | `Date` | `ibexa_date` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | ----------- | --------- | ---------------------------------------------------------------------------------------------------- | --------------------------------------- | | `timestamp` | `integer` | Date information in [Unix format timestamp](https://en.wikipedia.org/wiki/Unix_time). | `1400856992` | | `rfc850` | `string` | Date information as a string in [RFC 850 date format](https://datatracker.ietf.org/doc/html/rfc850). | `"Friday, 23-May-14 14:56:14 GMT+0000"` | ```json { "fieldDefinitionIdentifier": "publication_date", "languageCode": "eng-GB", "fieldValue": { "timestamp": 1400856992, "rfc850": "Friday, 23-May-14 14:56:14 GMT+0000" } } ``` On input, you can provide any one of the following keys. `rfc850` takes precedence over `timestring`, which takes precedence over `timestamp`: | Key | Type | Description | Example | | ------------ | --------- | --------------------------------------------- | --------------------------------------- | | `rfc850` | `string` | Date as an RFC 850 string. | `"Friday, 23-May-14 14:56:14 GMT+0000"` | | `timestring` | `string` | Date as a string in any commonly used format. | `"2012-08-28 12:20 Europe/Berlin"` | | `timestamp` | `integer` | Date as a Unix timestamp. | `1346149200` | ## Validation This field type doesn't perform any special validation of the input value. ## Settings The field definition of this field type can be configured with a single option: | Name | Type | Default value | Description | | ------------- | -------- | ----------------- | ------------------------------------------------------------------------ | | `defaultType` | `string` | `"DEFAULT_EMPTY"` | Default field value used by the editing interface. See the values below. | | Value | Description | | ------------------------ | -------------------------------- | | `"DEFAULT_EMPTY"` | Default value is empty. | | `"DEFAULT_CURRENT_DATE"` | Default value uses current date. | ```json { "fieldSettings": { "defaultType": "DEFAULT_CURRENT_DATE" } } ``` # EmailAddress field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The EmailAddress field type represents an email address, in the form of a string. | Name | Internal name | | -------------- | ------------- | | `EmailAddress` | `ibexa_email` | ## Field value The field value is the email address as a string, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "email", "languageCode": "eng-GB", "fieldValue": "someuser@example.com" } ``` ## Validation This field type uses a validator to make sure that a valid email address has been provided. If the validation fails, the request is rejected. ## Settings This field type doesn't support settings. # Float field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type stores numeric values which are provided as floats. | Name | Internal name | | ------- | ------------- | | `Float` | `ibexa_float` | ## Field value The field value is a number, or `null` when the field is empty. Both decimal and integer numbers are accepted as input, and numeric strings are cast to a float. ```json { "fieldDefinitionIdentifier": "weight", "languageCode": "eng-GB", "fieldValue": 194079.572 } ``` ## Validation This field type supports `FloatValueValidator`, defining maximum and minimum float value: | Name | Type | Default value | Description | | --------------- | ------- | ------------- | --------------------------------------------------- | | `minFloatValue` | `float` | `null` | Minimum value that this field type allows as input. | | `maxFloatValue` | `float` | `null` | Maximum value that this field type allows as input. | ```json { "validatorConfiguration": { "FloatValueValidator": { "minFloatValue": 0.0, "maxFloatValue": 1000.0 } } } ``` ## Settings This field type doesn't support settings. # Form field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Form field type stores a Form consisting of one or more form fields. | Name | Internal name | | ------ | ------------- | | `Form` | `ibexa_form` | For more information about working with Forms, see the [Form Builder guide](https://doc.ibexa.co/en/saas/content_management/forms/form_builder_guide/index.md). # Image field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Image field type allows you to store an image file. | Name | Internal name | | ------- | ------------- | | `Image` | `ibexa_image` | A **variation service** handles the conversion of the original image into different formats and sizes through a set of preconfigured named variations, for example, large, small, medium, or black and white thumbnail. ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | ----------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | `id` | `string` | The image's unique identifier. Usually the path, or a part of the path. | `0/8/4/1/1480-1-eng-GB/image.png` | | `alternativeText` | `string` | The alternative text, as entered in the field's properties. Optional unless the `AlternativeTextValidator` requires it. | `Picture of an apple.` | | `fileName` | `string` | The original image's filename, without the path. | `image.png` | | `fileSize` | `integer` | The original image's size, in bytes. | `37931` | | `mime` | `string` | The image's MIME type. | `image/png` | | `uri` | `string` | The original image's URI. | `/var/site/storage/images/0/8/4/1/1480-1-eng-GB/image.png` | | `imageId` | `string` | Image ID used to address image variations. | `240-1480` | | `inputUri` | `string` | Input image file URI. | `var/site/storage/images/0/8/4/1/1480-1-eng-GB/image.png` | | `path` | `string` | Same value as `inputUri`, with a leading slash. | `/var/site/storage/images/0/8/4/1/1480-1-eng-GB/image.png` | | `width` | `string` | Original image width in pixels. Returned as a string when you read a content item, and as an integer in the response to creating one. | `960` | | `height` | `string` | Original image height in pixels. Returned as a string when you read a content item, and as an integer in the response to creating one. | `540` | | `additionalData` | `object` | Extra information about the image, if available. | `{}` | | `variations` | `object` | Available image variations, keyed by variation identifier. Read-only, added by the API on output only. | See below. | ```json { "id": 1480, "fieldDefinitionIdentifier": "image", "languageCode": "eng-GB", "fieldValue": { "id": "0/8/4/1/1480-1-eng-GB/image.png", "alternativeText": "Picture of an apple.", "fileName": "image.png", "fileSize": 37931, "imageId": "240-1480", "uri": "/var/site/storage/images/0/8/4/1/1480-1-eng-GB/image.png", "inputUri": "var/site/storage/images/0/8/4/1/1480-1-eng-GB/image.png", "width": "960", "height": "540", "variations": { "articleimage": { "href": "/api/ibexa/v2/content/binary/images/240-1480/variations/articleimage" }, "articlethumbnail": { "href": "/api/ibexa/v2/content/binary/images/240-1480/variations/articlethumbnail" } } } } ``` ## Image variations For each variation, the field value provides a URI. Requesting that resource generates the variation if it doesn't exist yet, and returns the variation details as a `ContentImageVariation`: ```json { "ContentImageVariation": { "_media-type": "application/vnd.ibexa.api.ContentImageVariation+json", "_href": "/api/ibexa/v2/content/binary/images/240-1480/variations/tiny", "uri": "/var/site/storage/images/0/8/4/1/1480-1-eng-GB/image_tiny.png", "contentType": "image/png", "width": 30, "height": 30, "fileSize": 1361 } } ``` ## Creating and updating an Image field To send image contents, provide them as a base64-encoded string under the `data` key, together with `fileName`: ```json { "fieldDefinitionIdentifier": "image", "languageCode": "eng-GB", "fieldValue": { "fileName": "rest-rocks.jpg", "alternativeText": "HTTP", "data": "/9j/4AAQSkZJRgABAQEAZABkAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG..." } } ``` Updating an Image field requires that you re-send the existing data. You can do this by reusing the field value you read from the API, **removing the `variations` and `path` keys**, and updating `alternativeText`, `fileName`, or `data`. If you don't want to change the image itself, don't provide the `data` key. > **Caution: Remove thepathkey before you send the value back** > > The API returns a `path` key that it doesn't accept as input. A request that still contains it fails with `406 Argument 'Image\Value::$path' is invalid: value must be of type 'Existing property', not 'string'`. If you send a reduced value instead of the whole one, it must contain `width`. Without it, the API treats `id` as the path of a new file to upload, and the request fails with `406 Argument 'BinaryFile::id' is invalid`. ```json { "fieldDefinitionIdentifier": "image", "languageCode": "eng-GB", "fieldValue": { "id": "0/8/4/1/1480-1-eng-GB/image.png", "alternativeText": "Updated alternative text", "fileName": "Updated-filename.png", "width": "960", "height": "540" } } ``` ## Validation The field type supports the following validators: | Name | Type | Default value | Description | | ------------------------------------ | --------- | ------------- | --------------------------------------------------- | | `FileSizeValidator[maxFileSize]` | `numeric` | `null` | Maximum size of the image file in bytes. | | `AlternativeTextValidator[required]` | `boolean` | `false` | When `true`, the `alternativeText` key is required. | ```json { "validatorConfiguration": { "FileSizeValidator": { "maxFileSize": 10485760 }, "AlternativeTextValidator": { "required": true } } } ``` ## Settings | Name | Type | Default value | Description | | ----------- | ------- | ------------- | -------------------------------------------------------------------------------- | | `mimeTypes` | `array` | `[]` | MIME types accepted by the field. When empty, all image MIME types are accepted. | ```json { "fieldSettings": { "mimeTypes": ["image/jpeg", "image/png"] } } ``` ## Using an Image field To read more about handling images, see the [Images documentation](https://doc.ibexa.co/en/saas/content_management/images/images/index.md). # ImageAsset field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Image Asset field type enables storing images in independent content items of a generic Image content type, in the media library. It makes them reusable across system. | Name | Internal name | | ------------ | ------------------- | | `ImageAsset` | `ibexa_image_asset` | ## Field value The field value is an object with the following keys: | Key | Type | Description | Example | | ---------------------- | ----------------- | ------------------------------------------------------------------------------------------------------ | ---------------------- | | `destinationContentId` | `integer`, `null` | ID of the content item that holds the image asset. | `150` | | `alternativeText` | `string`, `null` | The alternative image text (for example "Picture of an apple."). | `Picture of an apple.` | | `source` | `string`, `null` | Identifier of the external DAM system that the asset comes from. `null` for assets stored in Cohesivo. | `null` | | `variations` | `object` | Available image variations, keyed by variation identifier. Read-only, added by the API on output only. | See below. | ```json { "fieldDefinitionIdentifier": "image", "languageCode": "eng-GB", "fieldValue": { "destinationContentId": 150, "alternativeText": "Picture of an apple.", "source": null, "variations": { "medium": { "href": "/api/ibexa/v2/content/binary/images/150-345-1/variations/medium" } } } } ``` When you create or update a field, provide `destinationContentId` and `alternativeText` only. Each variation URI returns a `ContentImageVariation`, the same as for the [Image field type](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/imagefield/#image-variations). ## Validation This field type validates if `destinationContentId` points to a content item which has the correct content type. # Integer field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents an integer value. | Name | Internal name | | --------- | --------------- | | `Integer` | `ibexa_integer` | ## Field value The field value is an integer, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "quantity", "languageCode": "eng-GB", "fieldValue": 2397 } ``` ## Validation This field type supports `IntegerValueValidator`, defining maximum and minimum integer value: | Name | Type | Default value | Description | | ----------------- | --------- | ------------- | --------------------------------------------------- | | `minIntegerValue` | `integer` | `null` | Minimum value that this field type allows as input. | | `maxIntegerValue` | `integer` | `null` | Maximum value that this field type allows as input. | ```json { "validatorConfiguration": { "IntegerValueValidator": { "minIntegerValue": 0, "maxIntegerValue": 100 } } } ``` ## Settings This field type doesn't support settings. # ISBN field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents an ISBN string either an ISBN-10 or ISBN-13 format. | Name | Internal name | | ------ | ------------- | | `ISBN` | `ibexa_isbn` | ## Field value The field value is the ISBN as a string, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "isbn", "languageCode": "eng-GB", "fieldValue": "9783161484100" } ``` ## Validation The input is validated as an ISBN-13 or ISBN-10 number, depending on the `isISBN13` field definition setting. ## Settings The field definition of this field type can be configured with a single option: | Name | Type | Default value | Description | | ---------- | --------- | ------------- | -------------------------------------------------------------------------------- | | `isISBN13` | `boolean` | `true` | When `true`, input is validated as ISBN-13, otherwise it's validated as ISBN-10. | ```json { "fieldSettings": { "isISBN13": true } } ``` # Keyword field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type stores one or several keywords. | Name | Internal name | | --------- | --------------- | | `Keyword` | `ibexa_keyword` | ## Field value The field value is an array of keywords, each one a string. ```json { "fieldDefinitionIdentifier": "tags", "languageCode": "eng-GB", "fieldValue": ["Ibexa", "Enterprise", "User Experience Management"] } ``` # MapLocation field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents a geographical location. | Name | Internal name | | ------------- | --------------------- | | `MapLocation` | `ibexa_gmap_location` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | ----------- | -------- | ---------------------------------------- | --------------- | | `latitude` | `float` | Latitude of the map location reference. | `59.928732` | | `longitude` | `float` | Longitude of the map location reference. | `10.777888` | | `address` | `string` | Address of the map location. | `Ibexa Nordics` | ```json { "fieldDefinitionIdentifier": "location", "languageCode": "eng-GB", "fieldValue": { "latitude": 59.928732, "longitude": 10.777888, "address": "Ibexa Nordics" } } ``` # Matrix field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field represents and handles a table of rows and columns of data. | Name | Internal name | | -------- | -------------- | | `Matrix` | `ibexa_matrix` | ## Field value The field value is an object with a single `entries` key, holding an array of rows. Each row is an object that maps the column identifiers defined in the field definition to cell values. ```json { "fieldDefinitionIdentifier": "specification", "languageCode": "eng-GB", "fieldValue": { "entries": [ { "col1": "Value 1", "col2": "Value 2" }, { "col1": "Value 3", "col2": "Value 4" } ] } } ``` ## Validation The REST API doesn't validate the contents of the matrix. Rows are stored as sent, including rows that contain only empty cells, or cells containing only spaces. A value with fewer rows than the `minimum_rows` setting is accepted. ## Settings | Name | Type | Default value | Description | | -------------- | --------- | ------------- | ------------------------------------------------------------------------- | | `minimum_rows` | `integer` | `1` | Minimum number of rows that the field must contain. | | `columns` | `array` | `[]` | Definitions of the columns, each with a unique `identifier` and a `name`. | ```json { "fieldSettings": { "minimum_rows": 1, "columns": [ { "identifier": "col1", "name": "Column 1" }, { "identifier": "col2", "name": "Column 2" } ] } } ``` # Measurement field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Measurement field type represents measurement information. It stores the unit of measure, and either a single measurement value, or a pair of top and bottom values that defines a range. | Name | Internal name | | ------------- | ------------------- | | `Measurement` | `ibexa_measurement` | ## Field value The field value is an object, or `null` when the field is empty. Its shape depends on the `inputType` key: | Key | Type | Description | Example | | ------------------------------ | --------- | ------------------------------------------------------------ | ------------ | | `measurementType` | `string` | Type of measurement, for example `length` or `mass`. | `length` | | `measurementUnit` | `string` | Identifier of the unit of measure, for example `centimeter`. | `centimeter` | | `inputType` | `integer` | `0` for a single value, `1` for a range. | `0` | | `value` | `float` | The measurement value. Used when `inputType` is `0`. | `2.5` | | `measurementRangeMinimumValue` | `float` | Bottom value of the range. Used when `inputType` is `1`. | `1.2` | | `measurementRangeMaximumValue` | `float` | Top value of the range. Used when `inputType` is `1`. | `4.5` | A single value: ```json { "fieldDefinitionIdentifier": "length", "languageCode": "eng-GB", "fieldValue": { "measurementType": "length", "measurementUnit": "centimeter", "value": 2.5, "inputType": 0 } } ``` A range: ```json { "fieldDefinitionIdentifier": "length", "languageCode": "eng-GB", "fieldValue": { "measurementType": "length", "measurementUnit": "inch", "measurementRangeMinimumValue": 1.2, "measurementRangeMaximumValue": 4.5, "inputType": 1 } } ``` ## Measurement types and units The following measurement types are available: `length`, `area`, `mass`, `pressure`, `speed`, `temperature`, `time`, `volume`, `data transfer rate`, and `energy`. Each type comes with a set of units, for example `meter`, `centimeter`, `millimeter`, `foot`, `inch`, and `yard` for `length`. ## Validation The field type validates the measurement type and unit passed in the value against the list of supported ones. The field type supports `MeasurementValidator`, which constrains what the field accepts: | Name | Type | Default value | Description | | -------------------------- | --------- | ------------- | ---------------------------------------------------------------- | | `measurementType` | `string` | `null` | The only measurement type accepted by the field. | | `measurementUnit` | `string` | `null` | The only unit of measure accepted by the field. | | `inputType` | `integer` | `0` | `0` to accept a single value only, `1` to accept a range only. | | `sign` | `string` | `null` | Comparison operator applied to `minimum` and `maximum`. | | `minimum` | `float` | `null` | Minimum accepted value. | | `maximum` | `float` | `null` | Maximum accepted value. | | `defaultValue` | `float` | `null` | Default single value. Used when `inputType` is `0`. | | `defaultRangeMinimumValue` | `float` | `null` | Default bottom value of the range. Used when `inputType` is `1`. | | `defaultRangeMaximumValue` | `float` | `null` | Default top value of the range. Used when `inputType` is `1`. | Which of these keys the API returns depends on `inputType`. When it's `0`, the response contains `sign` and `defaultValue`, but not the two range defaults. When it's `1`, the response contains `defaultRangeMinimumValue` and `defaultRangeMaximumValue`, but not `sign` or `defaultValue`. ```json { "validatorConfiguration": { "MeasurementValidator": { "measurementType": "length", "measurementUnit": "centimeter", "inputType": 0, "minimum": 0.0, "maximum": 100.0 } } } ``` # Media field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents and handles a media (audio/video) binary file. It's capable of handling the following types of files: - Apple QuickTime - Adobe Flash - Microsoft Windows Media - Real Media - Silverlight - HTML5 Video - HTML5 Audio | Name | Internal name | | ------- | ------------- | | `Media` | `ibexa_media` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | --------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | `id` | `string` | Media file identifier. | `application/63cd472dd7.mp4` | | `fileName` | `string` | The human-readable file name, as exposed to the outside. Used to name the file when sending it for download. | `butterflies.mp4` | | `fileSize` | `integer` | File size, in bytes. | `1077923` | | `mimeType` | `string` | The file's MIME type. | `video/mp4` | | `uri` | `string` | Download URL of the media file. If it doesn't include a host or protocol, it applies to the request domain. See [Binary and Media download](https://doc.ibexa.co/en/saas/content_management/file_management/binary_and_media_download/index.md). | `/content/download/210/media/butterflies.mp4` | | `hasController` | `boolean` | Whether the media has a controller when being displayed. | `true` | | `autoplay` | `boolean` | Whether the media should be automatically played. | `true` | | `loop` | `boolean` | Whether the media should be played in a loop. | `false` | | `height` | `integer` | Height of the media. | `300` | | `width` | `integer` | Width of the media. | `400` | | `inputUri` | `string` | Internal storage path of the file. Read-only on output. | `var/site/storage/original/application/63cd472dd7.mp4` | | `path` | `string` | Same value as `inputUri`. Kept for backward compatibility. | See `inputUri`. | ```json { "fieldDefinitionIdentifier": "media", "languageCode": "eng-GB", "fieldValue": { "id": "application/63cd472dd7.mp4", "fileName": "butterflies.mp4", "fileSize": 1077923, "mimeType": "video/mp4", "uri": "/content/download/210/media/butterflies.mp4", "hasController": true, "autoplay": false, "loop": false, "width": 400, "height": 300 } } ``` ### Uploading a file To send file contents, provide them as a base64-encoded string under the `data` key, together with `fileName`: ```json { "fieldDefinitionIdentifier": "media", "languageCode": "eng-GB", "fieldValue": { "fileName": "butterflies.mp4", "data": "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQ..." } } ``` To keep the existing file while updating other keys, send the field value without the `data` key. ## Validation The field type supports `FileSizeValidator`, defining the maximum size of the media file in bytes: | Name | Type | Default value | Description | | ------------- | --------- | ------------- | ---------------------------------- | | `maxFileSize` | `integer` | `null` | Maximum size of the file in bytes. | ## Settings The field type supports the `mediaType` setting, defining how the media file should be handled in output. | Name | Type | Default value | Description | | ----------- | -------- | -------------------- | ---------------------------------------- | | `mediaType` | `string` | `"TYPE_HTML5_VIDEO"` | Type of the media. See the values below. | | Value | Description | | --------------------- | ----------------------- | | `"TYPE_FLASH"` | Adobe Flash | | `"TYPE_QUICKTIME"` | Apple QuickTime | | `"TYPE_REALPLAYER"` | Real Media | | `"TYPE_SILVERLIGHT"` | Silverlight | | `"TYPE_WINDOWSMEDIA"` | Microsoft Windows Media | | `"TYPE_HTML5_VIDEO"` | HTML5 Video | | `"TYPE_HTML5_AUDIO"` | HTML5 Audio | ```json { "fieldSettings": { "mediaType": "TYPE_HTML5_VIDEO" } } ``` # Page field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Page field type represents a page with a layout consisting of multiple zones. Each zone can in turn contain blocks. | Name | Internal name | | ------------- | -------------------- | | `LandingPage` | `ibexa_landing_page` | ## Field value The field value is an object holding the serialized page structure: the layout identifier, the zones of that layout, and the blocks placed in each zone. Its exact shape depends on the layout and on the [page blocks](https://doc.ibexa.co/en/saas/content_management/pages/page_blocks/index.md) used. Pages are normally built with Page Builder rather than assembled by hand. > **Caution: Page Builder** > > If you create content type with both `ibexa_landing_page` and `ibexa_user` field types, you aren't redirected to Page Builder after selecting `Edit` or `Create`. This is caused by `ibexa_user` field type which requires separate handling. You're redirected to the standard back office edit or create mode. # Product specification field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field represents and handles [product attributes](https://doc.ibexa.co/en/saas/product_catalog/products/#product-attributes) and VAT. Consider it as internal to the [product catalog](https://doc.ibexa.co/en/saas/product_catalog/product_catalog/index.md). | Name | Internal name | | ---------------------- | ----------------------------- | | `ProductSpecification` | `ibexa_product_specification` | > **Caution: Caution** > > The presence of a specification (`ibexa_product_specification`) field distincts product types from content types. Don't remove this field from a product type (or it becomes a unreachable hidden content type). Don't add such field to a content type (or it becomes an uneditable unusable product type). # Relation field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type makes it possible to store and retrieve the value of a relation to another content item. | Name | Internal name | | ---------- | ----------------------- | | `Relation` | `ibexa_object_relation` | ## Field value The field value is an object with the following keys: | Key | Type | Description | Example | | ------------------------ | ----------------- | --------------------------------------------------------------------------------- | ---------------------------------- | | `destinationContentId` | `integer`, `null` | ID of the related content item. | `14` | | `destinationContentHref` | `string` | REST URI of the related content item. Read-only, added by the API on output only. | `/api/ibexa/v2/content/objects/14` | ```json { "fieldDefinitionIdentifier": "sales_rep", "languageCode": "eng-GB", "fieldValue": { "destinationContentId": 14, "destinationContentHref": "/api/ibexa/v2/content/objects/14" } } ``` When you create or update a field, provide `destinationContentId` only. ## Validation This field type validates whether the provided relation exists. ## Settings The field definition of this field type can be configured with the following options: | Name | Type | Default value | Description | | ----------------------- | --------- | -------------------- | --------------------------------------------------------------------------------------- | | `selectionMethod` | `string` | `"SELECTION_BROWSE"` | Method of selection in the editing interface. Only `"SELECTION_BROWSE"` is implemented. | | `selectionRoot` | `string` | `""` | ID of the Location that the selection is rooted at. | | `rootDefaultLocation` | `boolean` | `false` | When `true`, the selection starts from the default Location. | | `selectionContentTypes` | `array` | `[]` | An array of content type identifiers that are allowed for the related content item. | On output, when `selectionRoot` is set, the API adds a read-only `selectionRootHref` key with the REST URI of that Location. ```json { "fieldSettings": { "selectionMethod": "SELECTION_BROWSE", "selectionRoot": "", "selectionContentTypes": [] } } ``` # RelationList field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type makes it possible to store and retrieve values of a relation to other content items. | Name | Internal name | | -------------- | ---------------------------- | | `RelationList` | `ibexa_object_relation_list` | ## Field value The field value is an object with the following keys: | Key | Type | Description | Example | | ------------------------- | ------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | `destinationContentIds` | `array` | IDs of the related content items. | `[24, 42]` | | `destinationContentHrefs` | `array` | REST URIs of the related content items. Read-only, added by the API on output only. | `["/api/ibexa/v2/content/objects/24", "/api/ibexa/v2/content/objects/42"]` | ```json { "fieldDefinitionIdentifier": "related_articles", "languageCode": "eng-GB", "fieldValue": { "destinationContentIds": [24, 42], "destinationContentHrefs": [ "/api/ibexa/v2/content/objects/24", "/api/ibexa/v2/content/objects/42" ] } } ``` When you create or update a field, provide `destinationContentIds` only. ## Validation This field type validates if: - the `selectionMethod` specified is `"SELECTION_BROWSE"` or `"SELECTION_DROPDOWN"`. A validation error is returned if the value doesn't match. - the `selectionDefaultLocation` specified is `null`, a string, or an integer. If the type validation fails, a validation error is returned. - the value specified in `selectionContentTypes` is an array. If not, a validation error is returned. - the number of content items selected in the field isn't greater than the `selectionLimit`. > **Note: Note** > > The dropdown selection method isn't implemented yet. ## Settings The field definition of this field type can be configured with the following options: | Name | Type | Default value | Description | | -------------------------- | --------------------- | -------------------- | --------------------------------------------------------------------------------------- | | `selectionMethod` | `string` | `"SELECTION_BROWSE"` | Method of selection in the editing interface. Only `"SELECTION_BROWSE"` is implemented. | | `selectionDefaultLocation` | `string` or `integer` | `null` | ID of the default Location for the selection in the editing interface. | | `rootDefaultLocation` | `boolean` | `false` | When `true`, the selection starts from the default Location. | | `selectionContentTypes` | `array` | `[]` | An array of content type identifiers that are allowed for the related content items. | On output, when `selectionDefaultLocation` is set, the API adds a read-only `selectionDefaultLocationHref` key with the REST URI of that Location. ## Validators | Name | Type | Default value | Description | | -------------------------------------------- | --------- | ------------- | ----------------------------------------------------------------------------------------------------------- | | `RelationListValueValidator[selectionLimit]` | `integer` | `0` | The number of content items that can be selected in the field. When set to `0`, any number can be selected. | ```json { "validatorConfiguration": { "RelationListValueValidator": { "selectionLimit": 5 } } } ``` # RichText field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type validates and stores structured rich text in [DocBook](https://docbook.org/) XML format, and exposes it in several formats. | Name | Internal name | | ---------- | ---------------- | | `RichText` | `ibexa_richtext` | ## Field value The field value is an object with the following keys: | Key | Type | Description | | ------------ | -------- | -------------------------------------------------------------------------------------------------------------- | | `xml` | `string` | The rich text in the field type's [internal format](#internal-format), a custom flavor of DocBook. | | `xhtml5edit` | `string` | The same content in the [XHTML5 edit format](#xhtml5-edit-format). Read-only, added by the API on output only. | ```json { "fieldDefinitionIdentifier": "description", "languageCode": "eng-GB", "fieldValue": { "xml": "\n
\n This is a title.\n This is a paragraph.\n
\n", "xhtml5edit": "\n
\n" } } ``` When you create or update a field, provide the `xml` key only. If the input doesn't conform to the internal format, it's converted into it. ### Internal format As its internal format, the RichText field type uses a [custom flavor of the DocBook format](#custom-docbook-format). ```xml
This is a title. This is a paragraph.
``` ### XHTML5 edit format The XHTML5 format is used by the Online Editor and is returned under the `xhtml5edit` key. ```xml

This is a title.

This is a paragraph.

``` ## Custom DocBook format > **Caution: Caution** > > The custom DocBook format described below is subject to change and isn't covered by backwards compatibility promise. You provide the DocBook content as a string under the `xml` key of the field value. The examples below show the DocBook markup that goes into that string. ### DocBook elements The RichText format enriches [DocBook](https://docbook.org/) with the following custom elements: - `section` - main element of a RichText field - `ezembed` - holds embedded images - `ezembedinline` - holds embedded content items - `eztemplate` - holds custom tags, including built-in custom tags for embedded Facebook, Twitter, and YouTube content - `eztemplateinline` - holds inline custom tags - `ezconfig` - contains configuration for custom tags and other elements - `ezvalue` - contains values for other elements, such as `ezconfig` or `ezembed` - `ezattribute` - contains attributes for other elements, such as `ezconfig` or `ezembed` > **Note: Unsupported DocBook elements** > > Some DocBook elements aren't supported by RichText. Refer to [`ezpublish.rng`](https://github.com/ibexa/fieldtype-richtext/blob/6.0/src/bundle/Resources/richtext/schemas/docbook/ezpublish.rng#L137) for a full list. ### Online Editor elements Elements of the Online Editor correspond to the following sample DocBook code blocks. #### Text formatting ```xml Anchor text Center aligned Left aligned bold italic underlined subscript superscript crossed out
This is a block quote.
``` #### Heading ```xml My heading ``` #### Code block ```xml ``` #### Unordered list ```xml 1st level bullet point 1st level bullet point 2nd level bullet point 2nd level bullet point ``` #### Ordered list ```xml 1st level numbered point 1st level numbered point 2nd level numbered point ``` #### Embedded content ```xml ``` #### Inline embedded content ```xml embed inline ``` #### Image ```xml medium ``` #### Table ```xml This is a merged table cell ``` #### YouTube ```xml https://youtu.be/Y-1d5zdeg9A false ``` #### Twitter ```xml https://twitter.com/BBCSpringwatch/status/1401622026973032452 light 500 en true ``` #### Facebook ```xml https://www.facebook.com/bbcnews/posts/10158930827817217?__tn__=-R 120 ``` # Selection field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Selection field type stores single selections or multiple choices from a list of options defined in the field definition. | Name | Internal name | | ----------- | ----------------- | | `Selection` | `ibexa_selection` | ## Field value The field value is an array of integers, each one the index of a selected option in the `options` field definition setting. ```json { "fieldDefinitionIdentifier": "size", "languageCode": "eng-GB", "fieldValue": [1, 2] } ``` > **Caution: Option indexes aren't always array positions** > > Option indexes come from the field definition and don't have to be consecutive. Because the API returns `options` as an array, a gap in the indexes isn't visible in the response, and the position of an option in that array is then no longer its index. > > For example, a field defined with the options `0`, `2` and `5` returns `["Small", "Medium", "Large"]`. The field value `[5]` selects `Large`, and the values `[1]`, `[3]` and `[4]` are rejected, even though the returned array has entries at positions `1` and `2`. ## Validation This field type validates the input, verifying if all selected options exist in the field definition and checking if multiple selections are allowed in the field definition. If any of these validations fail, the request is rejected. When option validation fails, a list with the invalid options is also presented. ## Settings | Name | Type | Default value | Description | | --------------------- | --------- | ------------------------ | ------------------------------------------------------------------ | | `isMultiple` | `boolean` | `false` | Used to allow or prohibit multiple selection from the option list. | | `options` | `array` | `[]` | The list of options defined in the field definition. | | `multilingualOptions` | `object` | `{"": []}` | The list of options per language code. | On input, you can provide `options` either as an array, or as an object keyed by option index. On output, the API always returns an array. ```json { "fieldSettings": { "isMultiple": true, "options": { "0": "Small", "1": "Medium", "2": "Large" } } } ``` # TaxonomyEntry field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). TaxonomyEntry is a field type that stores information about the parent entry in the taxonomy tree, placing the taxonomy entry (tag or product category) in the taxonomy structure. | Name | Internal name | | --------------- | ---------------------- | | `TaxonomyEntry` | `ibexa_taxonomy_entry` | ## Field value The field value is an object with a single key: | Key | Type | Description | Example | | ---------------- | ----------------- | --------------------------------------------- | ------- | | `taxonomy_entry` | `integer`, `null` | ID of the selected taxonomy entry, or `null`. | `3` | ```json { "fieldDefinitionIdentifier": "parent", "languageCode": "eng-GB", "fieldValue": { "taxonomy_entry": 3 } } ``` ## Validation This field type doesn't perform any special validation of the input value. ## Settings The field definition of this field type can be configured with the following option: | Name | Type | Default value | Description | | ---------- | -------- | ------------- | ---------------------------------------------------------- | | `taxonomy` | `string` | `null` | Identifier of the taxonomy from which you choose an entry. | ```json { "fieldSettings": { "taxonomy": "tags" } } ``` # TaxonomyEntryAssignment field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). `TaxonomyEntryAssignment` field is used to integrate content with the Taxonomy module. It allows you to select tags or categories and assign them to content. > **Caution: Duplicate taxonomy fields** > > Because tags are assigned per content item, not per field, you cannot use two **Taxonomy Entry Assignment** fields with the same taxonomy type in one content type. To be able to assign tags to the content, first, you need to add a `TaxonomyEntryAssignment` field to the content type definition. | Name | Internal name | | ------------------------- | --------------------------------- | | `TaxonomyEntryAssignment` | `ibexa_taxonomy_entry_assignment` | ## Field value The field value is an object with the following keys: | Key | Type | Description | Example | | ------------------ | -------- | -------------------------------------------------------------------- | -------------------- | | `taxonomy_entries` | `array` | IDs of the assigned taxonomy entries. | `[3]` | | `taxonomy` | `string` | Identifier of the taxonomy that all the entries must be assigned to. | `product_categories` | Set the `taxonomy` value to the same identifier as the `taxonomy` setting of the field definition. The REST API doesn't check that the two match. ```json { "fieldDefinitionIdentifier": "category", "languageCode": "eng-GB", "fieldValue": { "taxonomy_entries": [3], "taxonomy": "product_categories" } } ``` ## Validation Entry IDs that don't exist are removed from the value instead of causing an error, so a request can succeed with fewer entries than you sent. Check the entries in the response to confirm which of them were stored. ## Settings | Name | Type | Default value | Description | | ---------- | -------- | ------------- | ------------------------------------------------------------- | | `taxonomy` | `string` | `null` | Identifier of the taxonomy from which the entries are chosen. | ```json { "fieldSettings": { "taxonomy": "product_categories" } } ``` # TextBlock field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The field type handles a block of multiple lines of unformatted text. It's capable of handling up to 16,777,216 characters. | Name | Internal name | | ----------- | ------------- | | `TextBlock` | `ibexa_text` | ## Field value The field value is the text as a string, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "body", "languageCode": "eng-GB", "fieldValue": "This is a block\nof unformatted text" } ``` ## Validation This field type doesn't perform any special validation of the input value. ## Settings The field definition of this field type can be configured with a single option: | Name | Type | Default value | Description | | ---------- | --------- | ------------- | ------------------------------------------------------------ | | `textRows` | `integer` | `10` | Number of rows for the editing box in the editing interface. | ```json { "fieldSettings": { "textRows": 10 } } ``` # TextLine field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type makes possible to store and retrieve a single line of unformatted text. It's capable of handling up to 255 characters. | Name | Internal name | | ---------- | -------------- | | `TextLine` | `ibexa_string` | ## Field value The field value is the text as a string, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "title", "languageCode": "eng-GB", "fieldValue": "Flipper Zero" } ``` ## Validation The input passed into this field type is subject to validation by the `StringLengthValidator`. The length of the string provided must be between the minimum length defined in `minStringLength` and the maximum defined in `maxStringLength`. The default value for both properties is `null`, which means that the validation is disabled by default. ```json { "validatorConfiguration": { "StringLengthValidator": { "minStringLength": null, "maxStringLength": 255 } } } ``` ## Settings This field type doesn't support settings. # Time field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents time information. Date information is **not stored**. What is stored is the number of seconds, calculated from the beginning of the day in the given or the environment timezone. | Name | Internal name | | ------ | ------------- | | `Time` | `ibexa_time` | ## Field value The field value is an integer representing the number of seconds since the beginning of the day, or `null` when the field is empty. ```json { "fieldDefinitionIdentifier": "opening_time", "languageCode": "eng-GB", "fieldValue": 36000 } ``` ## Validation This field type doesn't perform validation of the input value. ## Settings The field definition of this field type can be configured with several options: | Name | Type | Default value | Description | | ------------- | --------- | ----------------- | ------------------------------------------------------------------------ | | `useSeconds` | `boolean` | `false` | Used to control displaying of seconds in the output. | | `defaultType` | `string` | `"DEFAULT_EMPTY"` | Default field value used by the editing interface. See the values below. | | Value | Description | | ------------------------ | -------------------------------- | | `"DEFAULT_EMPTY"` | Default value is empty. | | `"DEFAULT_CURRENT_TIME"` | Default value uses current time. | ```json { "fieldSettings": { "useSeconds": false, "defaultType": "DEFAULT_CURRENT_TIME" } } ``` # URL field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type represents and handles a URL. It's formed by the combination of a link and the respective text. | Name | Internal name | | ----- | ------------- | | `Url` | `ibexa_url` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | ------ | -------- | ------------------------------------- | ----------------------- | | `link` | `string` | The URL. | `https://www.ibexa.co/` | | `text` | `string` | Text that represents the stored link. | `Ibexa` | ```json { "fieldDefinitionIdentifier": "website", "languageCode": "eng-GB", "fieldValue": { "link": "https://www.ibexa.co/", "text": "Ibexa" } } ``` The `text` key is optional on input. ## Validation This field type doesn't perform validation. ## Settings This field type doesn't have settings. # User field type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). This field type validates and stores information about a user. | Name | Internal name | | ------ | ------------- | | `User` | `ibexa_user` | ## Field value The field value is an object with the following keys, or `null` when the field is empty: | Key | Type | Description | Example | | ------------------- | ----------------- | --------------------------------------------------------------------------- | ---------------------------- | | `hasStoredLogin` | `boolean` | Denotes if the user has a stored login. | `true` | | `contentId` | `integer` | ID of the content item corresponding to the user. | `144` | | `login` | `string` | Username. | `jay.kowalski` | | `email` | `string` | The user's email address. | `jay.kowalski@email.invalid` | | `passwordUpdatedAt` | `integer`, `null` | Unix timestamp of the last password change. | `1682691427` | | `enabled` | `boolean` | Whether the user account is enabled. | `false` | | `maxLogin` | `integer` | Maximum number of concurrent logins. | `5` | | `plainPassword` | `string`, `null` | Write-only. Set it to assign a new password. It's never returned on output. | `null` | ```json { "fieldDefinitionIdentifier": "user", "languageCode": "eng-GB", "fieldValue": { "hasStoredLogin": true, "contentId": 144, "login": "jay.kowalski", "email": "jay.kowalski@email.invalid", "passwordUpdatedAt": 1682691427, "enabled": false, "maxLogin": 5, "plainPassword": null } } ``` > **Note: Password hashes are never exposed** > > The password hash and the hashing algorithm are stripped from the field value before it's returned. Provide new passwords through the `plainPassword` key. ## Validation The field type supports `PasswordValueValidator`, defining the password policy: | Name | Type | Default value | Description | | ------------------------------------------- | --------- | ------------- | ------------------------------------------------------------------------------- | | `requireAtLeastOneUpperCaseCharacter` | `boolean` | `true` | When `true`, the password must contain at least one upper case character. | | `requireAtLeastOneLowerCaseCharacter` | `boolean` | `true` | When `true`, the password must contain at least one lower case character. | | `requireAtLeastOneNumericCharacter` | `boolean` | `true` | When `true`, the password must contain at least one numeric character. | | `requireAtLeastOneNonAlphanumericCharacter` | `boolean` | `false` | When `true`, the password must contain at least one non-alphanumeric character. | | `requireNewPassword` | `boolean` | `false` | When `true`, the new password must differ from the previous one. | | `requireNotCompromisedPassword` | `boolean` | `false` | When `true`, the password is checked against known compromised passwords. | | `minLength` | `integer` | `10` | Minimum password length. | The `require*` settings are on/off flags, not counts. The API accepts an integer for them and returns a boolean: any non-zero number becomes `true`, and `0` becomes `false`. ```json { "validatorConfiguration": { "PasswordValueValidator": { "requireAtLeastOneUpperCaseCharacter": true, "requireAtLeastOneLowerCaseCharacter": true, "requireAtLeastOneNumericCharacter": true, "minLength": 10 } } } ``` ## Settings | Name | Type | Default value | Description | | -------------------- | --------- | ------------- | ----------------------------------------------------------------------------- | | `PasswordTTL` | `integer` | `null` | Number of days after which the password expires. | | `PasswordTTLWarning` | `integer` | `null` | Number of days before password expiry when the user starts getting a warning. | | `RequireUniqueEmail` | `boolean` | `true` | When `true`, the email address must be unique across users. | | `UsernamePattern` | `string` | `"^[^@]+$"` | Regular expression that the username must match. | ```json { "fieldSettings": { "PasswordTTL": 90, "PasswordTTLWarning": 14, "RequireUniqueEmail": true, "UsernamePattern": "^[^@]+$" } } ``` # AI # Artificial Intelligence > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). AI interactions with Cohesivo Cohesivo includes built-in AI capabilities. For example, it can provide recommendations to product customers and content readers with the [Raptor connector](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector_guide/index.md), and assist editors in the back office with [AI Actions](https://doc.ibexa.co/en/saas/ai/ai_actions/ai_actions_guide/index.md). - [AI Actions](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/ai_actions/ai_actions/): AI Actions help editors by automating repetitive tasks. - [MCP Servers](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/mcp/mcp/): Overview of MCP resources in Cohesivo # AI Actions > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). AI Actions help editors by automating repetitive tasks. AI Actions enhance the usability and flexibility of Cohesivo by automating various tasks. After you configure it, it can generate alt text for images or transform text passages. ## Getting Started - [AI Actions product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/ai_actions/ai_actions_guide/): AI Actions help editors by automating repetitive tasks. - [Taxonomy suggestions](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/taxonomy/taxonomy/#taxonomy-suggestions): Learn how to use AI to suggest tags and categories - [Policies](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/permissions/policies/#ai-actions): Learn about the available AI Actions policies - [Work with AI Actions](https://doc.ibexa.co/projects/userguide/en/6.0/ai_actions/work_with_ai_actions/): Create new AI actions or modify existing ones to work faster and increase creativity. ## Development - [REST API Reference](https://doc.ibexa.co/en/6.0/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Connector-AI): See the available endpoints for AI Actions - [Action Configuration search reference](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/search/ai_actions_search_reference/action_configuration_criteria/): Search options available for Action Configuration search # AI Actions product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). AI Actions help editors by automating repetitive tasks. ## What are AI Actions Wherever you look, artificial intelligence becomes more and more important by enhancing user interaction and automating complex processes. Cohesivo is equipped with the AI Actions feature, which harnesses AI's potential to automate time-consuming editorial tasks. AI Actions is an extensible solution for integrating features provided by AI services into your workflows, all managed through a user-friendly interface. AI Actions solution comes with the following action types: - [Refine text](#refining-text): Rewrite existing text according to instructions set in a prompt - [Generate alternative text](#generating-alternative-text): Generate alt text for images for accessibility purposes - [Suggest taxonomy entries](#suggesting-taxonomy-entries): Generate tag or product category suggestions based on content fields ![AI Actions schematic](https://doc.ibexa.co/en/saas/ai/ai_actions/img/guide_ai_actions.png) ## Availability You can use AI Actions, unless your organization requested to disable all AI-powered features in your system. ## How it works AI Actions rely on an AI framework, which is responsible for gathering information from various sources, such as AI action types, AI action configurations, and contextual details like SiteAccess, user details, locale settings, and more. This data can then be combined with user input. It's then passed to a service connector for final processing on Cohesivo side. The service connector wraps all data into a prompt or another suitable format and sends it to an external service. When the external service returns a response, the response goes back through the service connector and passes to the framework. It can then be presented to the user in any way necessary. ### Core concepts #### AI service AI service is a third party platform that provides access to artificial intelligence tools and capabilities. It executes tasks that it receives through a service connector. #### Action Actions are tasks or functions that are executed by an external AI service. Each action is a combination of an AI action type and an AI action configuration. Action types define what kind of task the AI service performs, while AI action configurations specify how the task should be executed. This clear separation allows for a flexible system where actions can be created, managed, and customized with minimal effort. #### AI action type AI action types are high level templates predefined by developers. AI action types correspond to tasks that users intend to perform when they interact with the interface. Each AI action type defines the structure and nature of the task that the AI service performs, and is interpreted by a handler. Action type definitions specify the following information: - an identifier - a set of input parameters - a set of output fields - a category of action, for example, "text to image", "video to text" AI action types could be designed, for example, to generate alternative text based on an image, translate a selected passage of text, or generate a video clip based on a description provided in the field. By defining AI action types, developers can create a wide range of functionalities that can be deployed within the application. #### AI action configuration AI action configurations store detailed parameters needed to generate AI actions based on AI action types. Website administrators manage AI action configurations in the [**Admin** panel](https://doc.ibexa.co/en/saas/administration/admin_panel/admin_panel/index.md), where they customize and fine-tune the behavior of each AI action. It might involve setting specific parameters used by the AI service, a response length, an expense limit, or configuring how the output should be handled. By making such adjustments, administrators can ensure that the actions are tailored to meet the needs of your organization. #### Model Once an AI action is defined and configured, it must be executed, and this is where models come into play. Each model is designed to work with a specific AI service and AI action type pair. Pieces of PHP code that are responsible for resolving a model are called handlers. They may include hardcoded prompts for conversational AI services like ChatGPT, or operate without prompts in the case of other types of AI. Handlers take parameters defined in the AI action type and configuration, combine it with user input and any predefined settings or prompts, and pass this information to the AI service for processing. ### Triggering actions from the UI Among other elements, AI Actions include UI components that are used in: - AI action management in the **Admin** panel - text modification in online editor - alt-text generation in the image management modal These areas are user-friendly and well integrated with the existing application’s UI. Administrators can manage action configurations with ease, while editors can trigger actions with a click of a button. Procedures are straightforward and intuitive, ensuring that users can quickly achieve their desired outcomes. ### Triggering actions programmatically AI Actions feature exposes a REST API interface that allows for programmatic execution of AI actions. With the API, developers can automate tasks and execute actions on batches of content by integrating them into workflows. For more information, see the [AI actions section in the REST API Reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#ai-actions-execute-ai-action). ## Capabilities ### Management Users with the appropriate permissions, governed by role-based [policies](https://doc.ibexa.co/en/saas/permissions/policies/#ai-actions), can control the lifecycle of AI actions by creating, editing, executing, and deleting them. Additionally, AI action configurations can be enabled or disabled depending on the organization's needs. ![Configurations management screen](https://doc.ibexa.co/en/saas/ai/ai_actions/img/ai_actions_list.png) An intuitive AI Actions interface within the **Admin** panel displays a list of all available AI actions. Here, you can search for specific actions and filter them by type or status. By accessing the detailed view of individual AI actions, you can quickly review all their parameters. ## Use cases ### Refining text Content editors can benefit from using AI capabilities to [enhance or modify text](https://doc.ibexa.co/projects/userguide/en/saas/content_management/create_edit_content_items/#ai-assistant). With a few clicks, they can improve content quality or reduce the workload. While working on content, editors can request that AI performs specific actions such as: adjusting the length of the text, changing the tone, or correcting linguistic errors. ![AI Assistant](https://doc.ibexa.co/en/saas/ai/ai_actions/img/ai_assistant.png) This functionality is available in content types that include RichText, Text line, Text Block fields, and certain Page Builder blocks. ### Generating alternative text Media managers and content editors can benefit from employing AI to [generate alt text for images](https://doc.ibexa.co/projects/userguide/en/saas/image_management/upload_images/#ai), which results in improved accessibility and SEO. Once the feature is configured, editors can generate alt text for images they upload to the system by clicking one button. ![Alt text generation](https://doc.ibexa.co/en/saas/ai/ai_actions/img/alt_text_use_ai.png) With some customization, administrators could use the API to run a batch process against a larger collection of illustrations. ### Suggesting taxonomy entries Content editors and product managers can use [taxonomy suggestions](https://doc.ibexa.co/en/saas/content_management/taxonomy/taxonomy/#taxonomy-suggestions) when assigning tags or product categories to content items and products. Instead of manually browsing through extensive taxonomy trees, editors can request suggestions based on the content's text fields, such as name and description. # MCP Servers > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Overview of MCP resources in Cohesivo The Model Context Protocol (MCP) and MCP Servers allow AI agents to interact with the system in a structured way. - [MCP Servers product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/mcp/mcp_guide/): MCP servers expose tools, specialized prompts, and resources to AI agents. - [Work with MCP servers](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/mcp/mcp_usage/): Use MCP server. # MCP Servers product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). MCP servers expose tools, specialized prompts, and resources to AI agents. ## What is MCP Servers MCP ([Model Context Protocol](https://modelcontextprotocol.io/docs/2025-11-25/getting-started/intro)) is a protocol that standardizes how AI systems interact with external systems. While [AI actions](https://doc.ibexa.co/en/saas/ai/ai_actions/ai_actions_guide/index.md) integrate AI with the back office, Cohesivo's [MCP Servers](https://modelcontextprotocol.io/docs/2025-11-25/learn/server-concepts) offer an API that can be used by AI agents from the outside of the system. Because MCP is a standard protocol, many agents are already trained to use it. They can interact directly with the REST API if their users provide detailed instructions through prompts, skill files, etc. However, when facing a specific REST API, an agent may misunderstand the purpose of endpoints, hallucinate paths, or send incorrectly structured parameters. MCP servers make the discovery of available capabilities much easier. They help AI agents translate natural language prompts into concrete actions on the system. ![MCP communication diagram showing AI agent client connecting to MCP server within Cohesivo.](https://doc.ibexa.co/en/saas/ai/mcp/img/mcp-com-diagram.png) An MCP server allows the agent to discover available tools, inspect their parameters, learn how to use them, and select the correct action. ## Capabilities With the MCP Servers feature, you can use the tools included in the package. ### Built-in tools MCP Servers LTS Update comes with the following built-in tools: - `Ibexa\Mcp\Tool\ContentType\ContentTypeTools` - `get_content_type` - gets a content type by its ID. - `get_content_type_by_identifier` - gets a content type by its identifier. - `get_content_type_list` - gets content types by their IDs. - `create_content_type` - creates a draft for a new content type. - `create_content_type_draft` - creates a draft for an existing content type. - `get_content_type_draft` - gets a content type draft by content type ID. - `publish_content_type_draft` - publishes a content type draft by content type ID. - `Ibexa\Mcp\Tool\ContentType\FieldDefinitionTools` - `add_field_definition` - adds a field definition to a content type draft. - `update_field_definition` - updates a field definition in a content type draft. - `remove_field_definition` - removes a field definition from a content type draft. - `Ibexa\Mcp\Tool\ContentType\ContentTypeGroupTools` - `get_content_type_groups` - gets all content type groups. - `Ibexa\Mcp\Tool\TranslationTools` - `list_languages` - lists all languages in the current SiteAccess. - `list_content_languages` - lists languages which have translations for a given content item. - `list_non_translated_content_ids` - lists IDs of content which have missing translations for a given language code. - `Ibexa\Mcp\Tool\SeoTools` - `get_non_seo_content_ids` - returns IDs of content items that are missing SEO optimization (no meta title tag). Useful for identifying content that needs SEO attention. # Work with MCP servers > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Use MCP server. The MCP Servers feature includes several built-in tools. ## Use built-in tools TODO: Explain how to use the built-in tools. # Product catalog # Product Catalog > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo provides product catalog capabilities for managing products, product types, variants, attributes, pricing, and catalogs. The Product Catalog provides comprehensive capabilities for managing products offered in your digital commerce experience, including their specifications, pricing, and organization. Cohesivo offers robust product catalog infrastructure that can be used standalone. You can also use [Quable](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md) add-on that fully integrates into the Ibexa ecosystem. - [Product catalog guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/product_catalog_guide/): The product catalog guide provides a full description of the features and capabilities for managing products, their specifications, variants, pricing, and organization. - [Quable Integration](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/quable/quable/): Quable integration with Cohesivo - [Products](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/products/): Products are characterized by attributes describing their characteristics. You can create product variants and add assets to each product and variant. - [Catalogs](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/catalogs/): Catalogs enable filtering out a selection of products from the Product catalog. - [Prices](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/prices/): The price engine calculates product prices taking into account customer groups, currencies and taxes. # Product catalog guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The product catalog guide provides a full description of the features and capabilities for managing products, their specifications, variants, pricing, and organization. ## What is product catalog The product catalog is a comprehensive set of capabilities for managing products in Cohesivo that can be used standalone. It lets you create, configure, and manage products, their specifications, assets, variants, and prices, and group products into categories and catalogs. ## Availability Product catalog capabilities are available in Cohesivo. ## How does product catalog work Products in Cohesivo’s product catalog have underlying content items enriched with product-specific information such as attributes, assets, prices, and others. The product catalog lets you group products into categories and catalogs. Catalogs are collections of products selected by using configurable filters. They're specific to each of your sites or storefronts and only contain the products in them that you wish to sell in their associated storefronts. Catalogs contain a complete list of related products that can be displayed on a store site. You can have as many catalogs as required. ![How does product catalog work](https://doc.ibexa.co/en/saas/product_catalog/img/how_pim_works.png) ## Capabilities ### Product specifications Product specifications rely on product attributes. Available attributes are defined per product type. ### Product attributes Each product has its own, specific attributes. You can describe a product in technical terms, define its physical characteristics such as size, color, or shape, or functional characteristics (for example, for a laptop it could be the operating system, amount of memory, or available ports). Product attributes can belong to one of existing types, for example, numbers, selection, or checkout. Attributes are used as criteria for filtering and searching for products. You can also configure selected product attributes to be used as a basis for variants. ![Product attributes](https://doc.ibexa.co/en/saas/product_catalog/img/product_attributes.png) For more information, see [Product attributes](https://doc.ibexa.co/en/saas/product_catalog/products/#product-attributes) and [Work with product attributes](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/work_with_product_attributes/) ### Product variants One product can have multiple versions, for example, there can be a t-shirt in different colors. You can create variants of products, differing in some characteristics, based on product attributes. ![Product variants](https://doc.ibexa.co/en/saas/product_catalog/img/product_attributes.png) ### Product assets Each product or product variant can have assets in a form of images. They can be assigned to the base product or per one or more of its variants. For easier management you can create collections - by using them you can group assets that correspond to specific values of attributes. Created collection is automatically assigned to the variant or variants that have these attribute values. ![Products assets](https://doc.ibexa.co/en/saas/product_catalog/img/product_assets.png) ### Availability Product availability defines whether a product is available in the catalog. For each product you can [set availability](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/manage_availability_and_stock/) per variant or per base product. When a product is available, it can have numerical stock defined, that you can set. The stock can also be set to infinite, for example, for digital, downloadable products. A product can only be ordered when it has either positive stock, or stock set to infinite. ### Product categories Product categories help you to organize your products within the product catalog and also create relationships between them. Each product can belong to multiple categories of, depending on user’s choice, different or similar character. Category can also be assigned to multiple products. One of the reasons for applying product categories is assisting users in searching for products. Before you can assign categories to products, you need to [enable product categories](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/work_with_product_categories/#enable-product-categories). ![Product categories](https://doc.ibexa.co/en/saas/product_catalog/img/product_categories.png) ### Virtual and physical products Product types in Cohesivo can be either virtual or physical: - **Physical products** are tangible items that require shipping (for example: books, clothing, electronics). - **Virtual products** are items that don't require physical delivery (for example: software licenses, e-books, online courses, digital downloads, additional warranty, tickets for an event). This product type property can affect the checkout process. For example, a cart of only virtual products can skip the shipping step during checkout. To learn more about working with virtual products, see [Virtual products](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/create_virtual_product/) in the User Documentation. ### Currencies Currencies are used when calculating product price. In the system you can find a list of available currencies, but you can also create custom ones by providing its code. ### Regions Each product or product type can have different regional pricing and regional VAT rate. ### VAT For each product you can configure VAT rate. You can set it globally (per SiteAccess) or individually for each product type and product. ### Base price For each product or product variant you can set a base price. If you use more than one currency, in the product’s page you can see base price per currency. ### Custom price You can set up different prices depending on customer group or currency. Each customer group can have a default price discount that applies to all products. For example, you can offer a 10% discount for all products in the catalog to users who belong to the Resellers customer group. You can also set different prices for specific products or product variants for different customer groups. ### Product completeness Created product has its own list of the tasks required for product configuration: attributes, assets, content, prices, availability, and more. You can check how complete the configuration is in the product’s view. When you create or edit a product, under the product name, you can see visual indication of what part of product information (tasks) you have completed, and what part is still missing. Product completeness doesn't impact product availability or visibility on the storefront. It is intended to help you ensure that product data is properly populated. As long as your product meets the requirements, it can be published and made available for purchase regardless of its completeness score. ### Catalogs With catalogs you can create product lists for special purposes, for example, for B2B and B2C uses, for retailers and distributors, or for different regions. Catalogs contain a sub-set of products from the system. You can copy existing catalogs, for example, to create a variant version of an offer with slightly differing filters. You can then modify the copied catalog and save the updated version. ### Catalog filters and custom filter When you create a new catalog, all products are included in it by default. To have a better overview for a specific group of products, you can filter the list by: - price - product attributes - product type - product code - availability - product category - the date when the product was created Catalog filters let you narrow down the products from the product catalog that are available in the given catalog. ### Quable PIM integration You can store product information inside Cohesivo, or you can store it inside (Quable). For more information, see [Quable integration](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md). ## How to get started To start working with the products, you need to enable purchasing from the catalog. For this, the following configuration is required: - at least one region and one currency added in the shop, - VAT rates set for the product type, - at least one price added for the product, - availability of the product set with positive or infinitive stock. Next, follow steps from [product management in User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/persona_paths/manage_products/). ## Benefits ### Product technical and marketing information Products added in the shop have both technical and marketing information. You can see all the attributes, specification and variants in a very detailed way, which helps you to manage and present all the products in the technical way. In addition, each product and its variants may have assets in the form of images and a description. Products have underlying content items, which means you can customize the content structure to contain all the marketing information about the product that you need. ### Detailed specification with multiple attribute types Product attributes help you to create products with detailed, complicated specification. Thanks to this, you can create product variants based on multiple product attributes that include different information about a product. Additionally, product attributes are collected in groups so they're easier to manage. ![Multiple attribute types](https://doc.ibexa.co/en/saas/product_catalog/img/product_attribute_types.png) ### Multiple-level variants Product variants enable you to have multiple versions of one product, differing in some characteristics. Each product can have more than one variant on one or more levels. It makes it possible to have multiple-level variants of the products complicated in terms of specifications, such as laptops. ![Multiple-level variants](https://doc.ibexa.co/en/saas/product_catalog/img/multilevel_variants.png) ### Regional pricing including regional VAT rates Each product type can have different regional pricing and regional VAT rate. What is more, you can configure VAT rate globally or set it individually. Thanks to this, the management of the products that can be sold to various markets is easier and more intuitive. ![Regional pricing](https://doc.ibexa.co/en/saas/product_catalog/img/regional_vat.png) ### Customer group-based pricing You can set up different prices depending on customer group - it means that you can have a default price discount for different customer groups that applies to all the products or specific products or product variants. ![Customer group-based pricing](https://doc.ibexa.co/en/saas/product_catalog/img/group_base_pricing.png) ### Product taxonomy The [taxonomy mechanism](https://doc.ibexa.co/en/saas/content_management/taxonomy/taxonomy/index.md) enables creating tags or categories with a tree structure and assign them to a content item, for example, Products. Thanks to this mechanism product categories can be organized into a Category tree to make it easy for the users to browse and to deliver content appropriate for them. ### Grouping products into catalogs You can group all the products into smaller catalogs. They contain subsets of the whole product list and you can use them to build special catalogs, for example, for retailers and distributors, or for different regions. ![Grouping products into catalogs](https://doc.ibexa.co/en/saas/product_catalog/img/grouping_products.png) ### General and variant-specific assets Products and product variants can have their image assets. You can set up general assets — it means that the product has an asset visible in the main product view. Additionally, you can assign assets to product variants and place them in a collection. ![General and variant-specific assets](https://doc.ibexa.co/en/saas/product_catalog/img/general_assets.png) # Quable Integration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Quable integration with Cohesivo Cohesivo integrates with [Quable](https://www.quable.com/en) to provide product information management as part of the Ibexa orchestration platform. Quable is Ibexa’s PIM solution for managing complex product catalogs and serves as the single source of truth, available as an add-on for Cohesivo. With the integration set up, products can be viewed, selected, and embedded in Cohesivo, while all product management operations remain handled in Quable. ## Getting started - [Quable product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/quable/quable_guide/): The Quable product guide describes how you can use the product data from Quable in Cohesivo to create marketing campaigns built around your products. - [Quable PIM integration](https://doc.ibexa.co/projects/userguide/en/6.0/product_catalog/quable_pim_integration/): Quable PIM integration allows you to use products managed in Quable as the source of product data in Ibexa DXP. - [Quable - PIM solution for product data management](https://www.quable.com/en): Manage your product data and accelerate sales with Quable. Discover the new PIM platform that revolutionizes the product experience - [Quable resources](https://docs.quable.com/): Find all PIM, DAM, and Portal resources: user guides, training content, product documentation, technical documentation, and the PIM API for developers. ## Development - [Quable technical documentation](https://developers.quable.com/): Explore Quable's technical documentation # Quable product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Quable product guide describes how you can use the product data from Quable in Cohesivo to create marketing campaigns built around your products. ## Overview Quable integration connects Cohesivo with [Quable](https://www.quable.com/en), making Quable the authoritative source of product information for every website powered by Cohesivo. Quable serves as the single source of truth for all product data, including attributes, classifications, variants, and translations. Cohesivo consumes this data and makes it available for use in content and digital experiences. This approach eliminates the need to manage product data in multiple systems, while preserving a clear separation of responsibilities between product management and content usage. ## Availability The integration with Quable is available as an add-on for Cohesivo. Before enabling it, ensure that you have an active Quable instance with defined products, classifications, and channels. ## How does Quable integration work The integration enables connection to external product data sources. Once configured, the system performs: - an initial synchronization of product data from Quable - ongoing updates via webhooks (near real-time) Product data is mapped to the Cohesivo's product data model, including variants, attributes and [product categories](https://doc.ibexa.co/en/saas/product_catalog/product_catalog_guide/#product-taxonomy). This data is then available in the back office, content editing tools like [Online Editor](https://doc.ibexa.co/en/saas/content_management/rich_text/online_editor_guide/index.md) and [Page Builder](https://doc.ibexa.co/en/saas/content_management/pages/page_builder_guide/index.md), and APIs. All product management operations remain handled in Quable. Cohesivo can be used to manage pricing and availability for products sourced from Quable, including support for market-specific configurations such as regions and currencies. ## Capabilities ### Single source of truth Quable is the authoritative system for product data, including attributes, classifications, variants, and translations. Cohesivo consumes this data and makes it available for use within content and back office interfaces, enabling editorial teams to enrich content by reusing product information. ## Use cases ### Multi-market operations A retailer operating across multiple markets can manage product data in Quable using channels and localized languages. Cohesivo connects to the relevant channel and makes localized product information available for use in content and back office interfaces, ensuring consistency across markets from a single Quable instance. ## Faster campaign execution Product data defined in Quable can be immediately used in Cohesivo for building content and campaigns. Marketing teams can create pages and enrich content using up-to-date product information, without the need to duplicate or manually synchronize data. ## Known limitations The integration with Quable has the following known limitations: - [Catalogs](https://doc.ibexa.co/en/saas/product_catalog/product_catalog_guide/#catalogs) can't be created from Quable products. - [Product assets](https://doc.ibexa.co/en/saas/product_catalog/product_catalog_guide/#product-assets) are not fully synchronized. Only the main product thumbnail from Quable is used. - [Product-level access restrictions](https://doc.ibexa.co/en/saas/permissions/policies/#products) based on product type are not supported. - You can't define prices and availability for products with product codes exceeding 64 characters. # Products > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Products are characterized by attributes describing their characteristics. You can create product variants and add assets to each product and variant. Products are a special type of content that contains typical content Fields and additional product information. Each product belongs to a product type (similar to how a content item belongs to a content type). Each product has a unique identifying product code. Product code can have up to 64 characters. It can contain only letters, numbers, underscores, and dashes. ## Product types Product types represent categories that a product can belong to. A product type can be, for example, a sofa, or a keyboard. Product types, like content types, define the global properties of products and fields a product consists of. A product type also defines the attributes that all products of this type can have. You can choose between two available types: `physical` and `virtual`: - `physical` - tangible products with assigned stock. They can use measurement attributes. They require shipment in the online purchase process. Examples: heaters, laptops, phones. - `virtual` - non-tangible items. They can be sold individually, or as part of a product bundle. They don't require shipment in the online process. Examples: memberships, services, warranties. ## Product attributes Product attributes provide different information about a product and can be used to create [product variants](#product-variants). Typical product attribute examples are: length, weight, color, format, and more. The following attribute types are available: | Name | Identifier | Description | | ------------------------------------------------------------------------------------------------ | ----------- | ------------------------------------------------------------------------------------------------ | | Checkbox | `checkbox` | Boolean attribute with a true/false value. | | Color | `color` | Color value stored as a hex code. | | [Date and time](https://doc.ibexa.co/en/saas/product_catalog/attributes/date_and_time/index.md) | `datetime` | Date and time value with configurable accuracy levels. | | Float | `float` | Decimal number value. | | Integer | `integer` | Integer number value. | | Selection | `selection` | A value selected from a predefined list of labeled options. | | [Symbol](https://doc.ibexa.co/en/saas/product_catalog/attributes/symbol_attribute_type/index.md) | `symbol` | String value with an enforced format, suitable for standardized identifiers such as EAN or ISBN. | Product attributes are collected in groups. An example of an attribute group can be dimensions (length, width, height). You can assign both whole attribute groups or individual attributes to a product type. > **Note: Attribute translations** > > Product attributes are not translatable. Unlike content fields, product attribute values cannot differ between languages. > > For the information that is intended to be displayed, consider using [TextLine](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/textlinefield/index.md) fields for short text, [RichText](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/richtextfield/index.md) fields for longer text that may require formatting, and product attributes for precise product properties or specifications. ## Product variants Product variants represent different versions of a product, for example, clothes in different colors, or laptops with different amounts of RAM. You can create product variants automatically based on attributes that have the "Used for product variants" flag enabled in the product type definition. You can create variants for any combination of values of selected attributes. In the back office you can automatically generate all possible variants for a product. Codes for product variants are generated automatically based on the base product code. For example, for a base product code `ErgoDesk`, the variants codes are `ErgoDesk-1`, `ErgoDesk-2`. Each product variant has separate availability and stock information. Each variant can also have separate price rules. If a variant doesn't have separate price rules, it uses the price of its base product. ## Product assets Product assets are images that are assigned to products and their specific variants. You can group assets in collections which correspond to specific values of attributes. A collection is assigned to the variant or variants that have these attribute values. ## Embed products in content You can embed products directly into content, including the [landing pages](https://doc.ibexa.co/en/saas/content_management/pages/pages/index.md), by using the [Online Editor](https://doc.ibexa.co/en/saas/content_management/rich_text/online_editor_guide/index.md). Use it to build marketing campaigns directly around the products, bridging product marketing and product data together. ## Product availability and stock Product availability defines whether a product is available in the catalog. You set product availability per variant or per base product: - if a product cannot have variants (has no attributes with the "Used for product variants" flag), you set availability per base product - if a product can have variants (even if no variants are configured yet), you set availability per variant. When a product is set as available, it can have numerical stock defined. The stock can also be set to infinite (for example, in case of digital products). ### Availability and computed availability Setting a product as available doesn't automatically mean that it can be ordered. For example, a product can be set as available, but have zero stock. The product catalog distinguishes between two types of availability: - Availability as a value set per product or variant Availability represents whether the product was set as **Available**, for example in the [back office **Availability** tab](https://doc.ibexa.co/projects/userguide/en/saas/product_catalog/manage_availability_and_stock/#set-product-availability). - Computed availability Computed availability represents whether the product can actually be ordered. A product can only be ordered when it's set as available and has either positive or infinite stock. # Date and time attributes > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Date and time attribute type allows you to store product information related to time, like an expiration date or date of manufacturing. The date and time [attribute type](https://doc.ibexa.co/en/saas/product_catalog/products/#product-attributes) allows you to represent date and time values as part of the product specification in the [product catalog](https://doc.ibexa.co/en/saas/product_catalog/product_catalog_guide/index.md). You can use it to store, for example, manufacturing dates, expiration dates, or event dates, all with specified accuracy. ## Usage You can manage the date and time attribute type through the back office or REST. !\[Creating a product using a date and time attribute with "trimester" accuracy level\](../img/datetime.png "Creating a product using a date and time attribute with "trimester" accuracy level") When creating an attribute based on the date and time attribute type you can select the accuracy level to match your needs: | Accuracy | Example | Limitations | | --------- | ------------------- | ---------------------------- | | Year | 2025 | Number between 1000 and 9999 | | Trimester | Q3 2025 | | | Month | July 2025 | | | Day | 2025-07-06 | | | Minute | 2025-07-06 11:15 | | | Second | 2025-07-06 11:15:37 | | # Symbol attribute type > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Create a symbol attribute type that enables for the efficient representation of string-based values while enforcing their format in product specifications. In product specifications, the symbol attribute type enables the efficient representation of string-based data and enforces their format. This feature allows you to store standard product identifiers (such as EAN or ISBN) in the [product catalog](https://doc.ibexa.co/en/saas/product_catalog/product_catalog_guide/index.md). ## Build-in symbol attribute formats The built-in symbol attribute formats are listed below: | Name | Description | Example | | -------------------------------------- | ----------------------------------------------------------------------------------------- | ----------------- | | Generic | Accepts any string value | #FR1.2 | | Generic (alphabetic characters only) | Accepts any string value that contains only letters | ABCD | | Generic (digits only) | Accepts any string value that contains only digits | 123456 | | Generic (alphanumeric characters only) | Accepts any string value that contains only letters or digits | 2N6405G | | Generic (hexadecimal digits only) | Accepts any string value that contains only hexadecimal digits (digits or A-F characters) | DEADBEEF | | EAN-8 | European Article Number (8 characters) | 96385074 | | EAN-13 | European Article Number (13 characters) | 5023920187205 | | EAN-14 | European Article Number (14 characters) | 12345678901231 | | ISBN-10 | International Standard Book Number (10 characters) | 0-19-852663-6 | | ISBN-13 | International Standard Book Number (13 characters) | 978-1-86197-876-9 | > **Caution: Caution** > > Maximum length of the symbol value is 160 characters. # Catalogs > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Catalogs enable filtering out a selection of products from the Product catalog. You can create multiple catalogs containing subsets of the whole product list. Use them, for example, to build special catalogs for B2B and B2C uses, for retailers and distributors, or for different regions. When creating a catalog, all products are included by default, but you can filter the list by: - price - product attributes - product type - product code - availability - product category - the date when the product was created ![List of filters for selecting products for a catalog](https://doc.ibexa.co/en/saas/product_catalog/img/catalogs_filters.png) # Prices > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The price engine calculates product prices taking into account customer groups, currencies and taxes. The price engine is responsible for calculating prices for products in the [product catalog](https://doc.ibexa.co/en/saas/product_catalog/product_catalog/index.md). ## Custom pricing You can set up basic price rules depending on [customer groups](https://doc.ibexa.co/en/saas/users/customer_groups/index.md). Use this option to globally manage custom prices, for example for your resellers. Each customer group can have a default price discount that applies to all products. ## Currency Cohesivo ships with a list of available currencies, and you can also add custom currencies. To use currencies in your shop, you need to first enable them in the back office. # Customer management # Customer Portal > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Customer Portal allows your business clients to create and manage their company accounts. A Customer Portal serves as a central entry point to your services and products. It helps you provide a unique user experience with a single point of access to any relevant self-service options for your products and services. Cohesivo Customer Portal and customer management that ships with it let you create and handle business accounts and communicate with your partners in a personalized space. With this feature, your customers can self-register, edit their organization information, invite and view members, check their order history, and more. - [Customer Portal product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/customer_management/customer_portal_guide/): Check all the capabilities and advantages that the Customer Portal offers to the clients by reading the Customer Portal product guide. - [Customer Portal applications](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/customer_management/cp_applications/): Customization of an approval process for new companies applications. - [Inviting users](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/users/invitations/): Manage user invitations to create an account in the frontend or the back office. # Customer Portal product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Check all the capabilities and advantages that the Customer Portal offers to the clients by reading the Customer Portal product guide. ## What is Customer Portal A Customer Portal serves as a central entry point to your services and products. It helps you provide a unique user experience with a single point of access to any relevant self-service options for your products and services. Cohesivo Customer Portal and customer management that ships with it let you create and handle business accounts and communicate with your partners in a personalized space. With this feature, your customers can self-register, edit their organization information, invite and view members, check their order history, and more. ## Availability Customer Portal is available in Cohesivo. It's also compatible with Product catalog and Ibexa Connect. ## How does Customer Portal work? Customer Portal is a component based on content types. This means that Cohesivo provides containers, user management, content management, so you can focus on business logic and general outlook of the portal for your B2B clients. ### Customer Portal The Customer Portal allows company members to log in and manage their profiles and order history. With user differentiation, company buyers can only purchase products while company admins can invite and manage members and change company information, such as billing addresses. ![Customer Portal dashboard](https://doc.ibexa.co/en/saas/customer_management/img/cp_dashboard_customer_portal.png) ### Editable in Page Builder Custom Customer Portal can be created and edited in Page Builder to meet the needs of each business type, company, or market they operate on. To create a new Customer Portal, go to **Content** and, from the menu, select **Content structure**. There, navigate to the root container for your Customer Portals and select **Customer Portal Page**. In the Page Builder creation box, you see the Customer Portal layout where you can add a dedicated Customer Portal block, Sales Representative, or choose from a selection of blocks available to your Cohesivo version. If the built-in page blocks aren't sufficient to fulfill your needs, you can add your own. ![Editable in Page Builder](https://doc.ibexa.co/en/saas/customer_management/img/cp_edit_in_page_builder.png) ### Company management The main company management takes place in the back office where each company has its own profile where sales representative can find: - summary with basic information and order history - company profile with billing information and contact person - list of members and pending invitations - address book with multiple shipping addresses ![Companies section in back office](https://doc.ibexa.co/en/saas/customer_management/img/cp_back_office.png) From there, they can activate and deactivate the company, edit its information, invite members, manage their roles, and edit their basic information. In the roles section, you can define policies for each user group, for example, a Company buyer. You can also set up policies for every user who has a business account by editing a Corporate Access role. ### Members Company members aren't standard users. They belong to a separate category called Corporate Accounts. This category is located in **Admin** -> **Corporate** -> **Corporate Accounts**. There, you can find a list of companies and their members. This feature comes with a set of new roles: - Member — users who are members of a company - Corporate Access — users who can log into Customer Portal - Company Admin — users who can edit company's details - Company Buyer — users who can buy in company's name All roles and policies associated with them can be fully customized to fit your business needs. ### Invitations Members can be invited to the organization from: - the back office: go to **Customers** -> **Companies** -> **Select your company** -> **Invitations** -> **Invite member** - the Customer Portal: go to your company admin profile, select **Members** -> **Invite members** Then, in a pop-up fill out email addresses one by one, or use drag and drop to upload a file with a list of emails. You also have to assign a role to each new member from a drop-down list. Click **Send** to send out invitations. ![Invitations](https://doc.ibexa.co/en/saas/customer_management/img/cp_invitations.png) Invited users receive an email message with a registration link. With it, they can register and create their account in the Customer Portal. ![Create account](https://doc.ibexa.co/en/saas/customer_management/img/cp_create_account.png) ### Company self-registration Self-registration allows business customers to take charge and apply for a business account by themselves. Applications go through the approval process in the back office where they can be accepted, rejected or put on hold. If they're accepted, the business partner receives an invitation link to the Customer Portal, where they can set up their team and manage their account. To apply for a business account, a company needs to provide their basic information, contact information and billing address in an application. ![Company self-registration](https://doc.ibexa.co/en/saas/customer_management/img/cp_registration.png) You can decide which user has approval rights by granting them `Company Application/Workflow` policy, you can also decide between which states the user may move applications: - on hold - accept - reject If built-in statuses aren't sufficient, you can add custom ones. You can also edit or add reasons for not accepting the company application. Finally, you can customize the registration site itself. ### REST API Customer Portal comes with [REST API](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Corporate-Account) for interacting with corporate accounts from the context of the Ibexa Connect app. ## Capabilities ### Company management Sales representatives can manage details for companies they're associated with, such as contact persons, billing addresses, and more by accessing back office. Company admins are also able to manage the company's details in the Customer Portal interface. By giving users power to manage their own accounts, you reduce the need for administrative interventions. ### Self registration Self-registration allows your customers to take control of their business accounts. This not only improves customer satisfaction but also reduces the administrative burden on your team. With the ability to integrate with Ibexa Connect, you're able to fully automate the process. ### Address book Use of an address book allows you to add many shipping addresses to one company for clients with multiple locations. ### Custom prices You can offer special prices and additional discounts dedicated for Customer groups containing company members with verified accounts. ### Available in segments Corporate accounts are available in segments, which means you can assign companies to different recommendation groups based on gathered data, and deliver recommendations. It allows you to make use of customer targeting of the segments and create personalized experience for each company. ## Benefits ### General overview The overall benefit of customer portals is the help they provide to retain customers and increase loyalty, while freeing up customer service employees time for higher-level work. They can achieve that by providing customers with up-to-date information about their orders and deliveries, personalize shopping experience, offer special deals available only to B2B partners, and do that in one, accessible space. Currently, Customer Portals are a standard in global sites such as Amazon. They're the level of quality that customers expect, and all businesses strive for. ### Simplified shopping process Business account helps streamline the B2B shopping process with all the paperwork, payment, and other administrative tasks converted into a few steps with prefilled forms, billing addresses, shipping addresses, and more. Making your site a go-to place for company orders. ### Better customer experience In the era of internet, customers expect quick, accessible and excellent quality service, and user experience from every business they associate with. Customer portals offer a seamless self-service experience by providing complete 24/7 access to relevant, up-to-date information and customer support. ### Client encouragement Price strategies are a great way to build and maintain strong relationships with your trading partners. With special prices available to B2B clients, you can offer the best deals in highly competitive markets. Those discounts may be a great encouragement to convince big buyers to choose your business over other options. Competitive prices impact not only the size of the customer base, they affect every customer’s purchasing strategy, including the diversity, frequency, and volume of their orders. ### Cost benefits Customer portals help you to automate tasks that otherwise would be done by your employees manually, such as customer services, checking shipment status. An additional benefit of customer portals is their availability 24/7. Thus, reducing the need to allocate resources to extend working hours or hire more employees. ### Localization and recommendations The use of Page Builder in the Customer Portal creation process enables you to create unique experiences for each business customer based on their location, business type, company, or market they operate on. # Customer Portal applications > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Customization of an approval process for new companies applications. New business customers can apply for a company account. Applications go through the approval process in the back office where they can be accepted, rejected or put on hold. If they're accepted, the business partner receives an invitation link to the Customer Portal, where they can set up their team and manage their account. For more information on company self-registration, see [user guide documentation](https://doc.ibexa.co/projects/userguide/en/saas/customer_management/company_self_registration/). If provided options are too limited, you can customize an approval process by yourself. ## Roles and policies Any user can become application approver, as long as they have the `Company Application/Workflow` policy assigned to their role. There, you can define between which states the user may move applications. For example, the assistant can put new applications on hold, or reject them, and only the manager can accept them. ![Company Application policy](https://doc.ibexa.co/en/saas/customer_management/img/cp_company_application_policy.png) # Data collection # Qualifio integration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Use Qualifio to collect customer data by creating interactive content. Qualifio is a data collection tool. It gives you the ability to use the [Qualifio](https://qualifio.com/) tools to engage your audiences. You can use interactive content to build relationships and collect important data, for example, a list of recent orders, or personal information about customers. You can also integrate Qualifio with Ibexa Connect to create workflows. To use Qualifio, you must first make arrangements with Ibexa. For more information, see [Qualifio in User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/qualifio/qualifio/#request-access). - [Create Qualifio campaign](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/qualifio/create_campaign/): Create a campaign with Qualifio. - [Integrate with Ibexa Connect](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/qualifio/integrate_ibexa_connect/): Integrate Qualifio with Ibexa Connect. # Create Qualifio campaign > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Create a campaign with Qualifio. [Campaign](https://doc.ibexa.co/projects/userguide/en/saas/qualifio/qualifio/#campaign) is a set of concepts, divided into steps, that the user can configure. It can contain, for example, a welcome screen, an interaction element, a form step, and an exit screen. To create new campaign, you need to use Qualifio Manager. You can use Qualifio's existing templates and interactive elements, such as quizzes, pools, and forms, to create visually appealing, customized campaigns. Users can configure the backgrounds, themes, or designs, and set up a specific time frame for each campaign. Technically, each campaign has a unique campaign ID, that is automatically defined by the Qualifio platform when it's created. For more information about creating and managing campaigns, see [Qualifio documentation](https://support.qualifio.com/hc/en-us/categories/202280638-Campaigns). ## Publication channels Each campaign includes a minimum of one publication channel that you can choose from the three options the platform provides for publishing a campaign. For more information about publication channels, see [Publication channel](https://doc.ibexa.co/projects/userguide/en/saas/qualifio/qualifio/#publication-channel) in User Documentation. ## Use Campaign block in Page Builder You can add [Campaign block](https://doc.ibexa.co/projects/userguide/en/saas/content_management/block_reference/#campaign-block) in Page Builder to display campaign on the landing page. To select campaign, go to **Properties** tab. From the **Campaign** drop-down, choose campaign. This list includes all campaigns available on user's Qualifio account which are active or scheduled to launch in the future. You can set the dimensions of the field in which the campaign is displayed. To do it, insert width and height values in the proper fields. If size fields are blank, the system sets default template values. It's recommended to adjust them for better results. ![Campaign block](https://doc.ibexa.co/en/saas/qualifio/img/campaign_block.png "Campaign block") ## Embed campaign in the Rich text field You can embed campaign in the Rich text field with Campaign custom tag. To do it, insert **Campaign** content item in the Rich Text Field and choose campaign from the drop-down list. This list includes all campaigns available on user's Qualifio account which are active or scheduled to launch in the future. You can set the dimensions of the field in which the campaign is displayed. To do it, select units, and provide width and height values in the proper fields. If size fields are blank, the system sets default template values. It's recommended to adjust them for better results. ![Campaign custom tag](https://doc.ibexa.co/en/saas/qualifio/img/campaign_custom_tag.png "Campaign custom tag") # Integrate with Ibexa Connect > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Integrate Qualifio with Ibexa Connect. You can use [Ibexa Connect](https://doc.ibexa.co/projects/connect/en/latest/general/ibexa_connect/) to create workflows. Qualifio collects user data and passes it directly to Ibexa Connect. With this data, you can create scenarios, for example, to add a user to newsletter, or to specific user segment group. For more information, see [Ibexa Connect documentation](https://doc.ibexa.co/projects/connect/en/latest/). ## Use Ibexa Connect Webhooks provide a powerful way to transfer data between applications in real-time. You can use webhooks to connect Qualifio with Ibexa Connect - integration platform (iPaaS). This integration allows to collect data using Qualifio and then push it to another systems, such as CRMs, CDP, Marketing Automation platforms, or more. ### Get the webhook URL Use Qualifio App and scenario to get the webhook URL from Ibexa Connect. To set up a webhook in Ibexa Connect, follow the steps: 1. Log in to your Ibexa Connect account. 2. Go to **Scenarios** and click the plus button to create a new scenario. 3. Select **Receive participation data**. ![Create a scenario](https://doc.ibexa.co/en/saas/qualifio/img/create_scenario.png "Create a scenario") 4. Click **Create a webhook** and provide a name for the new webhook. 5. Click **Copy address to clipboard** to save the URL. ![Create a webhook](https://doc.ibexa.co/en/saas/qualifio/img/create_webhook.png "Create a webhook") ### Configure Qualifio The next step is to configure Qualifio. When a form submission event takes place, data can be sent through the obtained webhook URL. To do it, perform the following actions:: 1. Log in to your Qualifio account. 2. Go to **Engage** -> **Integrations** -> **Integrations** and select **Webhook**. 3. Paste the URL from the clipboard into **Webhook Host** field and click **Save**. ![Configure Qualifio](https://doc.ibexa.co/en/saas/qualifio/img/configure_qualifio.png "Configure Qualifio") 4. Then, go to **Engage** -> **Integrations** -> **Push rules** to define the default or specific rules for new campaign or website. Select the created webhook. # Multisite # Multisite > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Multisite enables hosting multiple websites with different content, templates and configuration by using one repository. A multisite setup enables you to create more than one site in one installation of Cohesivo. Multisite configuration is done using [SiteAccesses](https://doc.ibexa.co/en/saas/multisite/siteaccess/siteaccess/index.md). To quickly set up new sites with predefined site templates, use [Site Factory](https://doc.ibexa.co/en/saas/multisite/site_factory/site_factory/index.md). - [SiteAccess](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/multisite/siteaccess/siteaccess/): SiteAccesses enable you to provide separate configuration for each site in a multisite setup. - [Multisite configuration](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/multisite/multisite_configuration/): Configure SiteAccesses to serve different content. - [Site Factory](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/multisite/site_factory/site_factory/): Site Factory allows creating multiple sites (SiteAccesses) from the back office. - [Site Factory configuration](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/multisite/site_factory/site_factory_configuration/): Configure Site Factory, including site skeletons. # Multisite configuration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Configure SiteAccesses to serve different content. You can configure the available SiteAccesses by using the [configuration](https://doc.ibexa.co/en/saas/administration/configuration/configuration/index.md). ## SiteAccess configuration ```yaml ibexa: siteaccess: list: [site, event] groups: site_group: [site] event_group: [event] default_siteaccess: site match: URIElement: 1 ``` ### SiteAccess groups `ibexa.siteaccess.groups` defines which groups SiteAccesses belong to. ```yaml ibexa: siteaccess: groups: site_group: [site] event_group: [event] ``` You can use groups when you want to use common settings for several SiteAccesses and avoid duplicating configuration. SiteAccess groups act like regular SiteAccesses as far as configuration is concerned. A SiteAccess can be part of several groups. SiteAccess configuration has always precedence over group configuration. # SiteAccess > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SiteAccesses enable you to provide separate configuration for each site in a multisite setup. A SiteAccess is a set of configuration settings that the application uses when you access the site through a specific address. When the user visits the site, the system analyzes the URI and compares it to rules specified in the configuration. If it finds a set of fitting rules, this SiteAccess is used. Each SiteAccess can have different [configuration](https://doc.ibexa.co/en/saas/administration/configuration/configuration/index.md). # Site Factory > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Site Factory allows creating multiple sites (SiteAccesses) from the back office. Site Factory is a site management interface, integrated with the back office, enabling you to configure new sites. ## Provide access To set the Site Factory up, provide sufficient permissions to the users. Set the below policies to allow users to: - `site/view` - enter the Site Factory interface - `site/create` - create sites - `site/edit` - edit sites - `site/change_status` - change status of the public accesses to `Live` or `Offline` - `site/delete` - delete sites For full documentation on how permissions work and how to set them up, see [the permissions section](https://doc.ibexa.co/en/saas/permissions/permissions/index.md). To learn how to use Site Factory, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/website_organization/work_with_sites/). # Site Factory configuration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Configure Site Factory, including site skeletons. ## Site skeletons The Site skeleton enables you to copy an entire content structure of the site design to the defined location. Site skeleton copying is a one-off operation, it only happens during the site creation process. After that, you cannot copy the Site skeleton again, for example in the edit view. You can create as many skeletons as you need and assign them to templates. Remember that one template can only have one Site skeleton. If the design doesn't have a defined Site skeleton, a directory of the new site is created in a standard Site Factory process. To define a Site skeleton, add the `site_skeleton_id` or `site_skeleton_remote_id` key to the site template definition. This can be either a location ID (for example, `5966`), or a remote location ID (for example, `3bed95afb1f8126f06a3c464e461e1ae66`). ```yaml ibexa_site_factory: templates: site1: siteaccess_group: example_site_factory_group_1 name: example_site_1 thumbnail: /path/to/image/example-thumbnail_1.png site_skeleton_id: 5966 site2: siteaccess_group: example_site_factory_group_2 name: example_site_2 thumbnail: /path/to/image/example-thumbnail_2.png site_skeleton_remote_id: 3bed95afb1f8126f06a3c464e461e1ae66 ``` Now, you can choose a design with a defined Site skeleton, and decide if you want to use its skeleton by toggling **Generate site using site skeleton**. # Languages > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). You can create multiple language versions (translations) of content and serve different language versions of your site with the help of SiteAccesses. ## Language versions Cohesivo offers the ability to create multiple language versions (translations) of a content item. Translations are created per version of the item, so each version of the content can have a different set of translations. A version always has at least one translation which by default is the *initial/main* translation. Further versions can be added, but only for languages that have previously been [added to the global translation list](#adding-available-languages), that is a list of all languages available in the system. The maximum number of languages in the system is 62. Different translations of the same content item can be edited separately. This means that different users can work on translations into different languages at the same time. Each version, including a draft, contains all the existing translations. However, even if work on a draft takes time and other translations are updated in the meantime, publishing the draft doesn't overwrite later modifications. ### Adding available languages The multilanguage system operates based on a global translation list that contains all languages available in the installation. Languages can be [added to this list from the **Admin** panel](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/) in the back office. **The new language must then be added to the [SiteAccess](https://doc.ibexa.co/en/saas/multisite/multisite/index.md) configuration**. Once this is done, any user with proper permissions can create content item versions in these languages in the user interface. ### Translatable and untranslatable fields Language versions consist of translated values of the content item's fields. In the content type definition every field is set to be Translatable or not. Cohesivo doesn't decide by itself which fields can be translated and which cannot. For some field values the need for a translation can be obvious, for example for the body of an article. In other cases, for instance images without text, integer numbers, or email addresses, translation is usually unnecessary. Despite that, Cohesivo gives you the possibility to mark any field as translatable regardless of its field type. It's only your decision to exclude the translation possibility for those fields where it makes no sense. When a field isn't flagged as Translatable, its value is copied from the initial/main translation when a new language version is created. This copied value cannot be modified. When a field is Translatable, you have to enter its value in a new language version manually. For example, let's say that you need to store information about marathon contestants and their results. You build a "contestant" content type that includes the following fields: name, photo, age, nationality, finish time. Allowing the translation of anything other than nationality would be pointless, since the values stored by the other fields are the same regardless of the language used to describe the contestant. In other words, the name, photo, age and finish time would be the same in, for example, both English and Norwegian. ### Access control You can control whether a user or user group is able to translate content or not. You do this by adding a [Language limitation](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) to policies that allow creating or editing content. This limitation enables you to define which role can work with which languages in the system. For more information of the permissions system, see [Permissions](https://doc.ibexa.co/en/saas/permissions/permissions/index.md). In addition, you can also control the access to the global translation list by using the `Content/Translations` policy. This policy allows users to add and remove languages from the global translation list. ### Fallback languages and missing translations When setting up SiteAccesses with different language versions, you can specify a list of preset languages for each SiteAccess. When this SiteAccess is used, the system goes through this list. If a content item is unavailable in the first (prioritized) language, it attempts to use the next language in the list, and more. Thanks to this you can have a fallback in case of a lacking translation. You can also assign a Default content availability flag to content types (available in the **Admin** panel). When this flag is assigned, content items of this type are available even when they don't have a language version in any of the languages configured for the current SiteAccess. If a language isn't provided in the list of prioritized languages and it's not the content item's first language, the URL alias for this content in this language isn't generated. # Translations management > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Translations management brings multiple features that help managers, developers and localization teams automate multilingual content delivery. Translations management helps Cohesivo developers and editors deliver automated content item and product translations. - [Translations management product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/multisite/translations_management/translations_management_guide/): Translations management helps managers, developers and localization teams with multilingual content delivery. - [Configure translations management](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/multisite/translations_management/configure_translations_management/): Configure translation providers, language pairs, and more for translations management. # Translations management product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Translations management helps managers, developers and localization teams with multilingual content delivery. ## What is Translations management Content managers, editors, translators, and proofreaders who work with multilingual content in Cohesivo often face a common set of challenges: - context is lost when the source text isn't visible alongside the translation - translating long and complex content items is time-consuming - quality assurance is slow and error-prone without a direct comparison view - switching between tools or tabs to cross-reference languages disrupts focus and slows down publishing The Translations management package addresses these pain points through a side-by-side view, machine translation and the ability to invite reviewers to collaborate on the translation of content items or products. The package integrates with the [AI Actions](https://doc.ibexa.co/en/saas/ai/ai_actions/ai_actions_guide/index.md) to support AI-powered translation services through Ibexa Agentic Marketing Platform. Administrators can manage providers and configure default provider-to-language-pair mappings directly in Cohesivo's back office, while editors can trigger machine translation from the content editing interface. ## How it works Before the translation flow can happen, an administrator sets up the translation providers and assigns language pairs to them. Then, when an editor opens a content item or product and requests a new machine translation, the system resolves which provider to use. If no language-pair rule matches, it falls back to the user's manual selection. The system then extracts the translatable fields from the source language version of a content item and sends them to the configured provider's API. The system writes the translated strings into a target-language draft of the content item or a target-language version of a product, and opens it in a side-by-side view for the editor to review and refine. The editor can save the result of content item translation as a draft, share it with a reviewer or publish it. Product translations are published when the editor closes the view without rejecting it. ![Translations management flow for content item translation](https://doc.ibexa.co/en/saas/multisite/img/translations_management_flow.png "Translations management flow for content item translation") ## Capabilities ### Translation provider management Administrators can manage translation providers and configure translation provider/language combination assignments ([language pairs](https://doc.ibexa.co/en/saas/multisite/translations_management/configure_translations_management/#define-language-pairs)). This allows administrators to define which provider handles which language combination. Editors see the configured provider pre-selected when creating a new translation, but can override it if needed. ![Creating a language pair](https://doc.ibexa.co/en/saas/multisite/img/translations_management_language_pairs.png "Creating a language pair") ### Side-by-side translation view Translations management introduces a [side-by-side translation view](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#side-by-side-translation-view) that displays the read-only source language content next to an editable target language form. In this view, editors can provide and review translations in context, without having to leave the content editing interface. ![Side-by-side translation view](https://doc.ibexa.co/en/saas/multisite/img/managing_translations_sxs_view.png "Side-by-side translation view") Editors can: - access the side-by-side view when creating a new translation, reviewing an existing one, or editing a draft - compare source and target content field by field while editing - copy all content from the source column to the target column with a single action - provide localized versions of media assets and their alternative text - use the distraction-free mode for focused editing of individual fields, with AI actions available inline - choose whether the source column appears on the left or right in user settings > **Note: Excluded content types** > > Content types that are editable in [Page builder](https://doc.ibexa.co/en/saas/content_management/pages/page_builder_guide/index.md) or [Form builder](https://doc.ibexa.co/en/saas/content_management/forms/form_builder_guide/index.md) are excluded from side-by-side editing. > > Products are editable in the side-by-side view, but [product attributes aren't translatable](https://doc.ibexa.co/en/saas/product_catalog/products/#product-attributes). ### Translation review When a draft translation of a content item or product is created by going through the automatic translation process in the back office, the system creates a review status record and marks the draft as "For review". Editors can [accept or reject the translation](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#review-automatic-translation) directly in the side-by-side view. Accepted drafts are marked as "Translated". When the editor rejects the translation, the status doesn't change, but the system records that the draft translation required corrections for statistical purposes. A draft translation in the "Translated" state can't be rejected anymore. This translation workflow is separate from the [editorial workflow](https://doc.ibexa.co/en/saas/content_management/workflow/workflow/index.md). Accepting or rejecting draft translations does not trigger editorial workflow transitions or notifications. > **Note: No review for human translations** > > Draft translations that were created by a human don't have a review status. ## Benefits ### Streamlined translation process Translations management reduces the time needed to create and publish multilingual content. Editors can initiate machine translation directly from the content editing interface and work on the result immediately in the side-by-side translation view, without having to switch contexts or use another translation tool. ### Better translation quality and consistency Machine-translated drafts are marked for review, allowing editors to accept or reject them directly in the side-by-side translation view. This eliminates the need for a separate workflow or tool. With the side-by-side translation view, editors can conveniently compare source and target content while editing. Seeing the translation in context makes it easier to identify omissions, inconsistencies, and translation errors. ### Flexible support for different translation providers Regardless of technical and conceptual differences, the experience of working with various translation providers is the same. Administrators can assign providers to specific language pairs and editors can override the assignment when needed. ### Readiness for automated processing The CLI command enables integration with automated processes, which can help you reduce manual effort for large content volumes. # Configure translations management > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Configure translation providers, language pairs, and more for translations management. Cohesivo's language management tools allow editors to smoothly work with content item and product translation. By using automatic translations, editors can quickly translate fields of content items and products into another languages. By using the [side-by-side editing interface](#side-by-side-translation-view), editors can compare source and target values, provide content item and product translations in a single view, and reject or approve translations. > **Note: Translation limitations** > > The following limitations apply to automatic translation: > > - Content types that contain the `ibexa_form` or `ibexa_landing_page` fields don't support the side-by-side translation view and open in the single-language editor instead. > - For `ibexa_landing_page` fields, translatable attributes of block content are sent to the translation provider, while layout, zones, and non-translatable block attributes are preserved. > - The value of `ibexa_form` field type is not translated. > > Also, [product attributes](https://doc.ibexa.co/en/saas/product_catalog/products/#product-attributes) remain non-translatable and are inactive in the side-by-side translation view. ## Define language pairs Language pair definitions decide which provider handles each source-to-target language combination by default. When an editor [opens the translation modal](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#add-new-translation) and selects a matching language combination, the provider that you chose is pre-selected in the dropdown. The editor can override the pre-selection. The list of languages available when creating a language pair is determined by what each provider supports. You can only select the languages that are present in a provider's supported list for that provider's pairs. You [manage language pairs in the back office](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#manage-translation-services-and-language-pairs). ## Side-by-side translation view The [side-by-side translation view](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#side-by-side-translation-view) is a two-column content editing interface where the source column is read-only and the target column is an editable form. Content types that contain the `ibexa_landing_page` or `ibexa_form` fields can't be opened in the side-by-side translation view. Editors can open them in the standard single-language editor. For a description of the side-by-side view and its functions from the editor's perspective, see [User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/content_management/translate_content/#side-by-side-translation-view). ### User settings The Translations management package adds preferences that editors can configure under their [user settings](https://doc.ibexa.co/projects/userguide/en/saas/getting_started/get_started/#user-settings). Each editor can configure them independently, and they don't affect other users. For example, editors can choose whether the target language column appears on the left or right in the side-by-side translation view. By default, the target is on the right, and each editor can override this default. # Permissions # Permissions > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Use granular permission system to grant access to various parts of the system by using roles, policies, and limitations. The permission system of Cohesivo enables you to control in detail which users have access to which parts of the system, both the back office's administrative and editorial features, and the content of the website front. - [Permission overview](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/permissions/permission_overview/): The permission system is based on policies that you assign to users or user groups in the form of roles. - [Policies](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/permissions/policies/): Policies are the main building block of the permissions system which lets you define the accesses for specific user roles. - [Permission use cases](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/permissions/permission_use_cases/): Set up permission sets for common use cases. - [Limitations](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/permissions/limitations/): Control access to parts of the system by fine-tuning permissions with the use of Limitations. # Permission overview > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The permission system is based on policies that you assign to users or user groups in the form of roles. A new user doesn't have permissions for any part of the system, unless they're explicitly given access. To get access they need to inherit roles, typically assigned to the user group they belong to. Each role can contain one or more **Policies**. A policy is a rule that gives access to a single **function** in a **module**. For example, a `section/assign` policy allows the user to assign content to sections. When you add a policy to a role, you can also restrict it using one or more **Limitations**. A policy with a limitation only applies when the condition in the limitation is fulfilled. For example, a `content/publish` policy with a `ContentType` limitation on the "Blog Post" content type allows the user to publish only Blog Posts, and not other content. A limitation, like a policy, specifies what a user *can* do, not what they *can't do*. A `Section` limitation, for example, *gives* the user access to the selected section, not *prohibits* it. For more information, see [Limitation reference](https://doc.ibexa.co/en/saas/permissions/limitation_reference/index.md) and [Permission use cases](https://doc.ibexa.co/en/saas/permissions/permission_use_cases/index.md). ## Assigning roles to users Every user or user group can have many roles. A user can also belong to many groups, for example, Administrators, Editors, Subscribers. It's best practice to avoid assigning roles to users directly. Instead, try to organize your content so that it can be covered with general roles assigned to user groups. Using groups is easier to manage and more secure. It also improves system performance. The more role assignments and complex policies you add for a given user, the more complex the search/load queries are, because they always take permissions into account. # Permission use cases > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Set up permission sets for common use cases. Here are a few examples of sets of policies that you can use to get some common permission configurations. ## Enter back office To allow the user to enter the back office interface and view all content, set the following policies: - `user/login` - `content/read` - `content/versionread` - `section/view` - `content/reverserelatedlist` These policies are necessary for all other cases below that require access to the content structure. ## Create content without publishing You can use this option together with Cohesivo's content review options. Users assigned with these policies can create content, but cannot publish it. To publish, they must send the content for review to another User with proper permissions (for example, senior editor or proofreader). - `content/create` - `content/edit` ## Create and publish content To create and publish content, users must additionally have the following policies: - `content/create` - `content/edit` - `content/publish` This also lets the user copy and move content, and add new locations to a content item (but not remove them). ## Move content To move a content item or a subtree to another location, the user must have the following policies: - `content/read` - on the source location - `content/create` - on the target location ## Remove content To send content to Trash, the user needs to have the `content/remove` policy. If content has more than one language, the user must have access to all the languages. That is, the `content/remove` policy must have either no limitation, or a limitation for all languages of the content item. To remove an archived version of content, the user must have the `content/versionremove` policy. Further manipulation of Trash requires the `content/restore` policy to restore items from Trash, and `content/cleantrash` to completely delete all content from the Trash. > **Caution: Caution** > > With the `content/cleantrash` policy, the user can empty the Trash even if they don't have access to the trashed content, for example, because it belonged to a Section that the user doesn't have permissions for. ## Restrict editing to part of the tree If you want to let the User create or edit content, but only in one part of the content tree, use limitations. Three limitations that you could use here are `Section` limitation, `Location` limitation and `Subtree of Location` limitation. ### Section limitation Let's assume you have two Folders under your Home: Blog and Articles. You can let a user create content for the blogs, but not in Articles, by adding a `Section` limitation to the Blog content item. This allows the User to publish content anywhere under this location in the structure. Section doesn't have to belong to the same subtree of location in the content structure, any locations can be assigned to it. ### Location limitation If you add a `Location` limitation and point to the same location, the user is able to publish content directly under the selected location, but not anywhere deeper in its subtree of location. ### Subtree of location limitation To limit the user's access to a subtree, use the `Subtree of Location` limitation. You do it by creating two new roles for a user group: 1. Role with a `Subtree` limitation for the User 2. Role with a `Location` limitation for the subtree Follow the example below to learn how to do that. **Cookbook**, **Dinner recipes** and **Dessert recipes** containers aren't accessible in the frontend. Edit access to them in the **Admin** panel. ![Subtree file structure](https://doc.ibexa.co/en/saas/permissions/img/subtree_usability_notes_1.png) To give the vegetarian editors access only to the **Vegetarian** dinner recipes section, create a new role, for example, *EditorVeg*. Next, add to it a `content/read` policy with the `Subtree` limitation for `Cookbook/Dinner recipes/Vegetarian`. Assign the role to the vegetarian editors user group. It allows users from that group to access the **Vegetarian** container but not **Cookbook** and **Dinner recipes**. To give users access to **Cookbook** and **Dinner recipes** containers, create a new role, for example, *EditorVegAccess*. Next, add to it a `content/read` policy with the `Location` limitations **Cookbook** and **Dinner recipes**. Assign the new role to the vegetarian editors user group as well. Only then the limitations are combined with `AND`, resulting in an empty set. The vegetarian editors should now see the following content tree: ![Limited subtree file structure](https://doc.ibexa.co/en/saas/permissions/img/subtree_usability_notes_2.png) When a policy has more than one limitation, all of them have to apply, or the policy doesn't work. For example, a `Location` limitation on location `1/2` and `Subtree of Location` limitation on `1/2/55` cannot work together, because no location can satisfy both those requirements at the same time. To combine more than one limitation with the *or* relation, not *and*, you can split your policy in two, each with one of these limitations. ## Manage locations To add a new location to a content item, the policies required for publishing content are enough. To allow the user to remove a location, grant them the following policies: - `content/remove` - `content/manage_locations` Hiding and revealing location requires one more policy: `content/hide`. ## Editorial workflows You can control which stages in an editorial workflow the user can work with. Do this by adding the `WorkflowStageLimitation` to `content` policies such as `content/edit` or `content/publish`. You can also control which transitions the user can pass content through. Do this by using the `workflow/change_stage` policy together with the `WorkflowTransitionLimitation`. For example, to enable the user to edit only content in the "Design" stage and to pass it after creating design to the "Proofread stage", use following permissions: - `content/edit` with `WorkflowStageLimitation` set to "Design". - `workflow/change_stage` with `WorkflowTransitionLimitation` set to `to_proofreading` ## Multi-file upload Creating content through multi-file upload is treated in the same way as regular creation. To enable upload, you need you set the following permissions: - `content/create` - `content/read` - `content/publish` You can control what content items can be uploaded and where by using imitations on the `content/create` and `content/publish` policies. A location limitation limits the uploading to a specific location in the tree. A content type limitation controls the content types that are allowed. For example, you can set the location limitation on a **Pictures** Folder, and add a content type limitation that only allows content items of type **Image**. This ensures that only files of type `image` can be uploaded, and only to the **Pictures** Folder. ## Taxonomies You can control which users or user groups can work with taxonomies. To let users create and assign taxonomy entries, set the following permissions: - `taxonomy/assign` to allow user to tag and untag content - `taxonomy/read` to see the Taxonomy interface - `taxonomy/manage` to create, edit and delete tags With limitations, you can configure whether permissions apply to Tags, product categories, or both. ## Register users To allow anonymous users to register through the `/register` or `/from-invite/register` routes, grant the following policies to the Anonymous role: - `user/register` - `content/create`, limited to the User content type and chosen user groups ## Admin To access the [administration panel](https://doc.ibexa.co/en/saas/administration/admin_panel/admin_panel/index.md) in the back office, the User must have the `setup/administrate` policy. This allows the User to view the languages and content types. Additional policies are needed for each section of the Admin. ### System Information - `setup/system_info` to view the System Information tab ### Sections - `section/view` to see and access the section list - `section/edit` to add and edit sections - `section/assign` to assign sections to content ### Languages - `content/translations` to add and edit languages ### Content types/action - `content type/create`, `content type/update`, `content type/delete` to add, modify and remove content types ### Object states - `state/administrate` to view a list of object states, add and edit them - `state/assign` to assign Objects states to content ### Roles - `role/read` to view the list of roles in Admin - `role/create`, `role/update`, `role/assign` and `role/delete` to manage roles ### Users - `content/view` to view the list of users Users are treated like other content, so to create and modify them, the user needs to have the same permissions as for managing other content items. ## Product catalog You can control to what extend users can access the product catalog and all its related parts. ### Product type To create or edit product types, a user needs to have access to attributes and attribute groups. Set the following permissions to allow such access: - `product_type/create` - `product_type/view` - `product_type/edit` ### Product item When a product is created, a product item and a content item are also generated. Permissions for the product catalog override permissions for content, therefore, users without permissions for content can still manage products. - `product/create` - `product/view` - `product/edit` # Policies > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Policies are the main building block of the permissions system which lets you define the accesses for specific user roles. Policies are the main building block of the permissions system. Each role you assign to user or user group consists of policies which define, which parts of the application or website the user has access to. ## Available policies ### Access to all functions | Module | Function | Effect | Possible limitations | | ------ | -------- | ----------------------------------------------------------- | -------------------- | | `*` | `*` | all modules, all functions: grant all available permissions | | > **Tip: Tip** > > For each module, all functions can be given without limitation. For example, `content/*` gives access to all functions of the `content` module, even future ones. ### Administration and user management #### Activity log | Module | Function | Effect | Possible Limitations | | -------------- | -------- | -------------------- | ---------------------------------------------------------------------------------------------------------------- | | `activity_log` | `read` | access activity list | [ActivityLogOwner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#activity-log-owner-limitation) | #### AI actions | Module | Function | Effect | Possible Limitations | | ---------------------- | --------- | ---------------------- | -------------------- | | `action_configuration` | `view` | view AI Action | | | | `create` | create a new AI action | | | | `edit` | edit an AI action | | | | `delete` | delete an AI action | | | | `execute` | execute an AI action | | #### Customer groups | Module | Function | Effect | Possible limitations | | ---------------- | -------- | ----------------------- | -------------------- | | `customer_group` | `create` | create a customer group | | | | `delete` | delete a customer group | | | | `edit` | edit a customer group | | | | `view` | view customer groups | | #### Roles | Module | Function | Effect | Possible limitations | | ------ | -------- | -------------------------------------------------------------------------- | -------------------- | | `role` | `assign` | assign roles to users and user groups | | | | `create` | create new roles | | | | `delete` | delete roles | | | | `read` | view the roles list in Admin. Required for all other role-related policies | | | | `update` | modify existing roles | | #### Segments | Module | Function | Effect | Possible limitations | | --------- | ---------------- | ------------------------ | -------------------------------------------------------------------------------------------------------- | | `segment` | `assign_to_user` | assign segments to users | [Segment Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#segment-group-limitation) | | | `create` | create segments | [Segment Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#segment-group-limitation) | | | `read` | load segment information | [Segment Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#segment-group-limitation) | | | `remove` | remove segments | [Segment Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#segment-group-limitation) | | | `update` | update segments | [Segment Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#segment-group-limitation) | #### Segment groups | Module | Function | Effect | Possible limitations | | --------------- | -------- | ------------------------------ | -------------------- | | `segment_group` | `create` | create segment groups | | | | `read` | load segment group information | | | | `remove` | remove segment groups | | | | `update` | update segment groups | | #### Setup | Module | Function | Effect | Possible limitations | | ------- | -------------- | -------------------------------------------- | -------------------- | | `setup` | `administrate` | access Admin | | | | `install` | unused | | | | `setup` | unused | | | | `system_info` | view the **System Information** tab in Admin | | #### Sites | Module | Function | Effect | Possible limitations | | ------ | --------------- | ---------------------------------------------------------------------------------------- | -------------------- | | `site` | `change_status` | change status of the public accesses of sites to `Live` or `Offline` in the Site Factory | | | | `create` | create sites in the Site Factory | | | | `delete` | delete sites from the Site Factory | | | | `edit` | edit sites in the Site Factory | | | | `update` | update sites in the Site Factory | | | | `view` | view the "Sites" in the top navigation | | #### Users | Module | Function | Effect | Possible limitations | | ------ | ------------- | ------------------------------------------------ | -------------------- | | `user` | `activation` | unused | | | | `invite` | create and send invitations to create an account | | | | `login` | log in to the application | | | | `password` | unused | | | | `preferences` | access and set user preferences | | | | `register` | register using the `/register` route | | | | `selfedit` | unused | | ### Content management #### Content | Module | Function | Effect | Possible limitations | | --------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `content` | `cleantrash` | empty the Trash (even when the User doesn't have access to individual content items) | | | | `create` | create new content. Note: even without this policy the user is able to enter edit mode, but cannot finalize work with the content item. | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) [Owner of Parent](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-of-parent-limitation) [Content type Group of Parent](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-of-parent-limitation) [Content type of Parent](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-of-parent-limitation) [Parent Depth](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#parent-depth-limitation) [Field Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#field-group-limitation) [Change Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#change-owner-limitation) | | | `diff` | unused | | | | `edit` | edit existing content | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Content type Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) [Workflow Stage](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#workflow-stage-limitation) [Field Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#field-group-limitation) [Version Lock](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#version-lock-limitation) [Change Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#change-owner-limitation) | | | `hide` | hide and reveal content locations | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Content type Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) | | | `manage_locations` | remove locations and send content to Trash | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) | | | `pendinglist` | unused | | | | `publish` | publish content. Without this Policy, the User can only save drafts or send them for review | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Content type Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) [Workflow Stage](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#workflow-stage-limitation) | | | `read` | view the content both in front and back end | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Content type Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) | | | `remove` | remove locations and send content to Trash | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) | | | `restore` | restore content from Trash | | | | `reverserelatedlist` | see all content that a content item relates to (even when the User isn't allowed to view it as an individual content items) | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) | | | `translate` | unused | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) | | | `translations` | manage the language list in Admin | | | | `unlock` | unlock drafts locked to a user for performing actions | [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Content type Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) [Version Lock](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#version-lock-limitation) | | | `urltranslator` | manage URL aliases of a content item | | | | `versionread` | view content after publishing, and to preview any content in the Site mode | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) Status [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) | | | `versionremove` | remove archived content versions | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) Status [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) | | | `view_embed` | view content embedded in another content item (even when the User isn't allowed to view it as an individual content item) | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) | #### Content types | Module | Function | Effect | Possible limitations | | ------- | -------- | ------------------------------------------------------------------------ | -------------------- | | `class` | `create` | create new content types. Also required to edit exiting content types | | | | `delete` | delete content types | | | | `update` | modify existing content types. Also required to create new content types | | #### Sections | Module | Function | Effect | Possible limitations | | --------- | -------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `section` | `assign` | assign Sections to content | [content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [New Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#new-section-limitation) | | | `edit` | edit existing Sections and create new ones | | | | `view` | view the Sections list in Admin. Required for all other section-related policies | | #### Object States | Module | Function | Effect | Possible limitations | | ------- | -------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `state` | `assign` | assign object states to content items | [Content type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-limitation) [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation) [Owner](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#owner-limitation) [Content type Group](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#content-type-group-limitation) [Location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#location-limitation) [Subtree](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) [Object State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#object-state-limitation) [New State](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#new-state-limitation) | | | `administrate` | view, add and edit object states | | #### Taxonomy | Module | Function | Effect | Possible limitations | | ---------- | -------- | ----------------------------- | -------------------- | | `taxonomy` | `assign` | tag or untag content | | | | `manage` | create, edit, and delete tags | | | | `read` | view the Taxonomy interface | | #### Workflow and version comparison | Module | Function | Effect | Possible limitations | | ------------ | -------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `comparison` | `view` | view version comparison | | | `workflow` | `change_stage` | change stage in the specified workflow | [Workflow Transition](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#workflow-transition-limitation) | ### Product catalog #### Catalogs | Module | Function | Effect | Possible limitations | | --------- | -------- | ---------------- | -------------------- | | `catalog` | `create` | create a catalog | | | | `delete` | delete a catalog | | | | `edit` | edit a catalog | | | | `view` | view catalogs | | #### Currencies and regions | Module | Function | Effect | Possible limitations | | ---------- | ---------- | ----------------- | -------------------- | | `commerce` | `currency` | manage currencies | | | | `region` | manage regions | | #### Products | Module | Function | Effect | Possible limitations | | --------- | -------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `product` | `create` | create a product | [Product Type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#product-type-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) | | | `delete` | delete a product | [Product Type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#product-type-limitation) | | | `edit` | edit a product | [Product Type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#product-type-limitation) [Language](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#language-limitation) | | | `view` | view products listed in the product catalog | [Product Type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#product-type-limitation) | > **Caution: Caution** > > The `ProductType` limitation can't be used when using [Quable](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md). #### Product types | Module | Function | Effect | Possible limitations | | -------------- | -------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | `product_type` | `create` | create a product type, a new attribute, a new attribute group, and add translation to product type and attribute | [Product Type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#product-type-limitation) | | | `delete` | delete a product type, attribute, attribute group | | | | `edit` | edit a product type, attribute, attribute group | [Product Type](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#product-type-limitation) | | | `view` | view product types, attributes and attribute groups | | > **Caution: Caution** > > The `ProductType` limitation can't be used when using [Quable](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md). ## Combining policies Policies on one role are connected with the *and* relation, not *or*, so when policy has more than one limitation, all of them have to apply. If you want to combine more than one limitation with the *or* relation, not *and*, you can split your policy in two, each with one of these limitations. # Limitations > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Control access to parts of the system by fine-tuning permissions with the use of Limitations. Limitations are part of the permissions system. They limit the access granted to users by [policies](https://doc.ibexa.co/en/saas/permissions/permission_overview/index.md). While a policy grants the user access to a function, Limitations narrow it down by different criteria. Limitations consist of two parts: - `Limitation` (Value) - `LimitationType` Certain limitations also serve as role limitations, which means they can be used to limit the rights of a role assignment. Currently, this covers [subtree of location](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#subtree-limitation) and [Section](https://doc.ibexa.co/en/saas/permissions/limitation_reference/#section-limitation). `Limitation` represents the value, while `LimitationType` deals with the business logic surrounding how it actually works and is enforced. ## Limitation reference See [Limitation reference](https://doc.ibexa.co/en/saas/permissions/limitation_reference/index.md) for detailed information about individual limitations. # Limitation reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Limitations let you fine-tune the permission system by specifying limits to roles granted to users. ## Blocking limitation A generic limitation type to use when no other limitation has been implemented. It's called "blocking" because it always informs the permissions system that the user doesn't have access to any policy the limitation is assigned to, making the permissions system move on to the next policy. ### Possible values | Value | UI value | Description | | --------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `` | `` | This is a generic limitation which doesn't validate the values provided to it. Make sure that you validate the values passed to this limitation in your own logic. | ## Activity log Owner limitation The Activity log Owner (`ActivityLogOwner`) limitation specifies if a user can see only their own [recent activity](https://doc.ibexa.co/en/saas/administration/recent_activity/recent_activity/index.md) log entries, and not entries from other users. | Value | UI value | Description | | ----- | --------------- | ------------------------------------------------------------ | | `1` | "Only own logs" | Current user can only access their own activity log entries. | ## Change Owner limitation The Change Owner (`ChangeOwner`) limitation specifies whether the user can change the owner of a content item. ### Possible values | Value | UI value | Description | | ----- | -------- | ---------------------------------------------- | | `1` | "Forbid" | The user cannot change owner of a content item | ## Content type Group limitation The Content Type Group (`UserGroup`) limitation specifies that only users with at least one common *direct* user group with the owner of content get the selected access right. ### Possible values | Value | UI value | Description | | ----- | -------- | -------------------------------------------------------------------------------------- | | `1` | "self" | Only a user who has at least one common *direct* user group with the owner gets access | ## Content type Group of Parent limitation The Content Type Group of Parent (`ParentUserGroupLimitation`) limitation specifies that only Users with at least one common *direct* user group with the owner of the parent location of a content item get a certain access right, used by `content/create` permission. ### Possible values | Value | UI value | Description | | ----- | -------- | --------------------------------------------------------------------------------------------------------- | | `1` | "self" | Only a user who has at least one common *direct* user group with owner of the parent location gets access | ## Content type limitation The Content Type (`ContentType`) limitation specifies whether the user has access to content with a specific content type. ### Possible values | Value | UI value | Description | | ------------------ | -------------------- | ------------------------------------------------- | | `` | `` | All valid content type IDs can be set as value(s) | ## Content type of Parent limitation The Content Type of Parent (`ParentContentType`) limitation specifies whether the user has access to content whose parent location contains a specific content type, used by `content/create`. This limitation combined with `ContentType` limitation allows you to define business rules like allowing users to create "Blog Post" within a "Blog." If you also combine it with `Owner of Parent` limitation, you effectively limit access to create Blog Posts in the users' own Blogs. ### Possible values | Value | UI value | Description | | ------------------ | -------------------- | ------------------------------------------------- | | `` | `` | All valid content type IDs can be set as value(s) | ## Field Group limitation A Field Group (`FieldGroup`) limitation specifies whether the user can work with content fields belonging to a specific group. A user with this limitation is allowed to edit fields belonging to the indicated group. Otherwise, the fields are inactive and filled with the default value (if set). ### Possible values | Value | UI value | Description | | ------------------------- | ------------------------- | -------------------------------------------------------- | | `` | `` | All valid field group identifiers can be set as value(s) | ## Language limitation A Language (`Language`) limitation specifies whether the user has access to work on the specified translation. A user with this limitation is allowed to: - Create new content with the given translation(s) only. This only applies to creating the first version of a content item. - Edit content by adding a new translation or modifying an existing translation. - Publish content only when it results in adding or modifying an allowed translation. - Delete content only when it contains a translation into the specified language. ### Possible values | Value | UI value | Description | | ----------------- | --------------------- | ----------------------------------------------- | | `` | `` | All valid language codes can be set as value(s) | ## Location limitation A location (`Location`) limitation specifies whether the user has access to content with a specific location, in case of `content/create` the parent location is evaluated. ### Possible values | Value | UI value | Description | | --------------- | ----------------- | --------------------------------------------- | | `` | `` | All valid location IDs can be set as value(s) | ## New Section limitation A New Section (`NewSection`) limitation specifies whether the user has access to assigning content to a given section. In the `section/assign` policy you can combine this with section limitation to limit both from and to values. ### Possible values | Value | UI value | Description | | -------------- | ---------------- | -------------------------------------------- | | `` | `` | All valid session IDs can be set as value(s) | ## New State limitation A New State (`NewObjectState`) limitation specifies whether the user has access to (assigning) a given object state to content. In the `state/assign` policy you can combine this with State limitation to limit both from and to values. ### Possible values | Value | UI value | Description | | ------------ | -------------- | ------------------------------------------ | | `` | `` | All valid state IDs can be set as value(s) | ## Object State limitation The Object State (`ObjectState`) limitation specifies whether the user has access to content with a specific object state. ### Possible values | Value | UI value | Description | | ------------------ | -------------------- | ------------------------------------------------- | | `` | `` | All valid Object state IDs can be set as value(s) | ## Owner limitation The Owner (`Owner`) limitation specifies that only the owner of the content item gets the selected access right. ### Possible values | Value | UI value | Description | | ----- | --------- | ----------------------------------------------------------------------------------------------------- | | `1` | "self" | Only the user who is the owner gets access | | `2` | "session" | Deprecated and works exactly like "self" in public PHP API since it has no knowledge of user Sessions | ## Owner of Parent limitation The Owner of Parent (`ParentOwner`) limitation specifies that only the users who own all parent locations of a content item get a certain access right, used for `content/create` permission. ### Possible values | Value | UI value | Description | | ----- | --------- | ----------------------------------------------------------------------------------------------------- | | `1` | "self" | Only the user who is the owner of all parent locations gets access | | `2` | "session" | Deprecated and works exactly like "self" in public PHP API since it has no knowledge of user Sessions | ## Parent Depth limitation The Parent Depth (`ParentDepth`) limitation specifies whether the user has access to creating content under a parent location within a specific depth of the tree, used for `content/create` permission. ### Possible values | Value | UI value | Description | | ------- | -------- | ----------------------------------------- | | `` | `` | All valid integers can be set as value(s) | ## Product Type limitation The Product Type (`ProductType`) limitation specifies whether the user has access to products belonging to a specific product type. > **Caution: Caution** > > The `ProductType` limitation can't be used when using [Quable](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md). ### Possible values | Value | UI value | Description | | ------------------ | -------------------- | ------------------------------------------------- | | `` | `` | All valid content type IDs can be set as value(s) | ## Section limitation The Section (`Section`) limitation specifies whether the user has access to content within a specific section. This limitation can be used as a role limitation. ### Possible values | Value | UI value | Description | | -------------- | ---------------- | -------------------------------------------- | | `` | `` | All valid session IDs can be set as value(s) | ## Segment group limitation The segment group (`SegmentGroup`) limitation specifies whether the user has access segments within a specific segment group. This limitation can be used as a role limitation. ### Possible values | Value | UI value | Description | | -------------------- | ---------------------- | --------------------------------------------------- | | `` | `` | All valid segment group IDs can be set as value(s). | ## SiteAccess limitation The SiteAccess (`SiteAccess`) limitation specifies to which SiteAccesses a certain permission applies, used by `user/login`. ### Possible values | Value | UI value | Description | | ------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------- | | `` | `` | Hash is calculated in the following way in legacy in default 64bit mode: `sprintf( '%u', crc32( $siteAccessName ) )` | ### Legacy compatibility notes `SiteAccess` limitation is deprecated and isn't used actively in public PHP API, but is allowed for being able to read / create limitations for legacy. ## Subtree limitation The subtree (`Subtree`) limitation specifies whether the user has access to content within a specific subtree of location, in case of `content/create` the parent subtree of location is evaluated. This limitation can be used as a role limitation. ### Possible values | Value | UI value | Description | | ----------------------- | ----------------- | ------------------------------------------------------- | | `` | `` | All valid location `pathStrings` can be set as value(s) | ### Usage notes For more information on how to restrict user's access to part of the subtree, see [the example in the Admin management section](https://doc.ibexa.co/en/saas/permissions/permission_use_cases/#restrict-editing-to-part-of-the-tree). ## Taxonomy limitation The taxonomy (`Taxonomy`) limitation specifies with which [taxonomies](https://doc.ibexa.co/en/saas/content_management/taxonomy/taxonomy/index.md) (tags, product categories, or custom ones) user can interact. The supported policies are: - `taxonomy/read` - `taxonomy/manage` - `taxonomy/assign` ### Possible values | Value | UI value | Description | | -------------------- | -------------- | -------------------------- | | Taxonomy identifiers | Taxonomy names | List of allowed taxonomies | ## Taxonomy Subtree limitation The taxonomy subtree (`TaxonomySubtree`) limitation specifies whether the user has access to a specific subtree within the [taxonomy](https://doc.ibexa.co/en/saas/content_management/taxonomy/taxonomy/index.md) tree. Once a tag is selected, user can interact with it and all the child tags below it in the taxonomy tree. In addition, it grants read-only access to all the parent tags (up to the taxonomy root) so that the user can see the context. The supported policies are: - `taxonomy/read` - `taxonomy/manage` - `taxonomy/assign` ### Possible values | Value | UI value | Description | | ------- | ------------- | ----------------------------- | | Tag IDs | Selected tags | All valid Tag IDs are allowed | ## Version Lock limitation The Version Lock (`VersionLock`) limitation specifies whether the user can perform actions, for example, edit or unlock, on content items that are in a workflow. This limitation can be used as a role limitation. ### Possible values | Value | UI value | Description | | -------- | --------------- | ----------------------------------------------------------------------------------------------------------- | | `userId` | "Assigned only" | Users can perform actions only on content items that are assigned to them or not assigned to anybody. | | `null` | none | Users can perform actions on all drafts, regardless of the assignments or whether drafts are locked or not. | ## Workflow Stage limitation The Workflow Stage (`WorkflowStage`) limitation specifies whether the user can edit content in a specific workflow stage. ### Possible values The limitation takes as values stages configured for the workflow. ## Workflow Transition limitation The Workflow Transition (`WorkflowTransition`) limitation specifies whether the user can move the content in a workflow through a specific transition. ### Possible values The limitation takes as values transitions between stages configured for the workflow. # Users # Users > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Users in Cohesivo refer to all kinds of user accounts, such as administrators, editors, managers or shop customers. Users in Cohesivo refer to all kinds of user accounts: administrators, editors, managers, or shop customers. All such user accounts have the same underlying mechanism and enable you to control access to the application, both the back office and the website front, by using the [permission system](https://doc.ibexa.co/en/saas/permissions/permissions/index.md). ## Invite and manage users - [User management product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/users/user_management_guide/): Find out what's user management and check what functions Cohesivo offers in this area to effectively manage the digital ecosystem. - [Inviting users](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/users/invitations/): Manage user invitations to create an account in the frontend or the back office. - [Passwords](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/users/passwords/): Set up user password rules. - [Customer groups](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/users/customer_groups/): Assigning users to customer groups allows defining user-specific pricing rules. # User management product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Find out what's user management and check what functions Cohesivo offers in this area to effectively manage the digital ecosystem. User management is a fundamental aspect of any system. Cohesivo offers a comprehensive and feature-rich user management system that allows organizations to efficiently manage their digital ecosystem. ## What is user management User management refers to the process of granting, configuring, and controlling access for users by administrators. This encompasses the creation of user accounts, assigning roles and permissions, setting authentication methods, and managing user-related data. ## Availability User management is available in all Cohesivo versions. ## How does user management work Cohesivo simplifies user management with an intuitive and powerful system of accounts, roles, permissions, groups, and segments. You can find all user groups and users in the **Admin** panel by selecting **Users**. Here, you can manage users, their relations, roles, and policies. ![User's section](https://doc.ibexa.co/en/saas/users/img/users_section.png) Here's how it works: - User accounts - create and manage user accounts. This includes capturing user information, such as name, email, and profile details. - Roles and permissions - define roles and assign permissions to them. This ensures that users have appropriate access to content and functionalities. Roles can be customized to match the organization's specific needs. - User segmentation - segment users based on criteria such as demographics, behavior, or preferences. This segmentation enables personalized content delivery and targeted marketing. - Invitations - invite users to join a platform streamlining an onboarding process, sending invitations for exclusive content or events. - Customer groups - organize users into customer groups, which helps in delivering tailored experiences and content to specific segments. ![User management](https://doc.ibexa.co/en/saas/users/img/user_management.png) ## Capabilities The detailed capabilities of Ibexa user management, which provide organizations with the tools they need to deliver personalized, secure, and efficient user experiences while ensuring that user access and content delivery align with their business goals and strategies. ### User roles and permissions Ibexa allows you to define custom user [roles with granular permissions](https://doc.ibexa.co/en/saas/permissions/permission_overview/index.md), ensuring that users have access to only the specific parts of the system they need. Furthermore, you can create user groups to simplify Permission management. Assign multiple users to a group to ensure consistency and ease of access control. This helps maintain effortless security and control. To help you understand further the role each element serves, here's a brief summary: - Role - represents a collection of Permissions that can be assigned to users or user groups. Roles streamline permission management by grouping related Permissions together. - Permission - defines a specific action or access level that can be granted or denied within the system. - Policy - is a set of rules or conditions that determine under what circumstances a specific permission is granted or denied by applying limitations. Policies allow for fine-grained control of access based on various factors, such as user attributes or system states. ### Limitations [Define](https://doc.ibexa.co/en/saas/permissions/limitations/index.md) on user actions based on specific criteria, such as time-based restrictions or geographic locations. ### Invitations The [invitation system](https://doc.ibexa.co/en/saas/users/invitations/index.md) streamlines user onboarding and engagement. Track the status of invitations, including when they were sent, whether they were accepted, and the actions taken by users who accepted them. ![Invitations](https://doc.ibexa.co/en/saas/users/img/users_invitation.png) ### User segmentation and recommendations Ibexa's segmentation and recommendations features allow organizations to deliver customized user experiences. Track user behavior, such as page views, search queries, and interactions, to create segments and segment groups for users who share similar behaviors. ![Segment groups](https://doc.ibexa.co/en/saas/administration/img/admin_panel_segment_groups.png) Possible uses: - Demographics - segment users based on demographic data such as age, location, and gender to personalize content, promotions, and recommendations. - Behavior - tailor content based on user behavior, such as frequent content consumption, shopping patterns, or search history, ensuring users see what they're interested in. - Preferences - utilize user preferences to offer a customized experience, from language preferences to content type preferences. ### Customer groups The customer group functionality allows for targeted content delivery and service offerings. Set specific permissions for customer groups to control who can access and edit certain content to get respective recommendations. Possible uses: - Product recommendations - create customer groups based on product preferences and offer tailored product recommendations. - Content access control - restrict access to premium or specialized content to specific customer groups, such as paid subscribers or loyal customers. ## Benefits ### Improved user experience With role-based access control and personalized content, users have a more engaging and relevant experience on your platform. ### Enhanced security The permission management helps safeguard sensitive data and maintain security. With the ability to define and manage user roles and permissions, clients can ensure that sensitive data and actions are protected. User management helps prevent unauthorized access. ### Efficient user onboarding Invitations and account creation streamline the process of onboarding new users. ### Targeted marketing Customer groups and user segmentation capabilities allow for targeted and effective marketing campaigns. ### Content governance Clients can enforce content governance by controlling who can edit and publish content. This ensures quality and consistency in their digital properties. ### Content relevance By delivering content that resonates with different user segments, clients can increase user engagement and retention. ### Customizability Clients can adapt the user management system to their unique needs. Custom policies and limitations enable tailored solutions that align with their specific use cases. # Inviting users > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Manage user invitations to create an account in the frontend or the back office. Cohesivo allows you to create and send invitations to create an account in the frontend as a customer, the back office as an employee, or the Corporate Portal as an organisation member. You can send invitations to individual users or in bulk. ## Roles and policies To invite other members to the site or the back office, a user needs to have the `user/invite` permission added to their role. You can limit the ability to invite other members to specific user groups, such as Editors, or to the specific roles within the group, for example: Admin, Buyer. ## Creating and sending invitations Invitations are sent by email. The invitation contains a link that lets the recipient create their account. ## Invitation expiration If a user doesn't click the invitation link sent to them in time, you can refresh the invitation to reset the time limit. # Passwords > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Set up user password rules. ## Changing and recovering passwords The user may request to change their password, or may forget it and ask to have it reset. To change password, the user must have the `user/password` permission. When the user requests a reset of a forgotten password, an email is sent to them and it allows them to create a new password. ## Password rules You can customize the password policy in your project. Each password setting is customizable per user field type. You can change the [password attributes](#password-attributes) or [password expiration settings](#password-expiration), and determine the rules for [repeating passwords](#repeating-passwords). To access the password settings: 1. In the back office, go to **Content** -> **Content types**. 2. In the **Content type groups** table, click **Users**. 3. Edit the **User** content type. 4. In the **Field definitions** list, view the settings for **User account (ibexa_user)**. > **Tip: Tip** > > There can be other content types that function as users, beyond the built-in user content type. ## Password attributes In the **User account (ibexa_user)** Field definition, you can determine if the password must contain at least: - One uppercase letter - One lowercase letter - One number - One non-alphanumeric character You can also set the minimum password length. ## Password expiration In the **User account (ibexa_user)** field definition, you can set password expiration rules, which forces users to change their passwords periodically. ![Password expiry settings](https://doc.ibexa.co/en/saas/users/img/password_expiry.png) You can also decide when the user is notified that they need to change their password. The notification is displayed in the back office after login and in the user content item's preview. ## Repeating passwords You can set a rule that the password cannot be reused. You set it for the user content type in the **User account (ibexa_user)** field type's settings. When this is set, the user cannot type in the same password when it expires. It has to be changed to a new one. This only checks the new password against the current one. A password that has been used before can be used again. This rule is valid by default when password expiration is set. ## Breached passwords You can set a rule that prevents using passwords which have been exposed in a public breach. To do this, in the **User account (ibexa_user)** field definition, select "Password must not be contained in a public breach". ![Protection against using breached passwords](https://doc.ibexa.co/en/saas/users/img/password_breached.png) This rule checks the password against known password dumps by using the API. It doesn't check existing passwords, so it doesn't block login for anyone. It applies only to new passwords when users change them. > **Note: Note** > > The password itself isn't sent to the API, which makes this check secure. > > For more information on how that is possible, see [Validating Leaked Passwords with k-Anonymity](https://blog.cloudflare.com/validating-leaked-passwords-with-k-anonymity/). # Customer groups > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Assigning users to customer groups allows defining user-specific pricing rules. You can assign users to different customer groups to enable [custom pricing](https://doc.ibexa.co/en/saas/product_catalog/prices/index.md). This enables you to give specific prices or price discounts (global or per product) to specific groups of users. For example, you can offer a 10% discount for all products in the catalog to users who belong to the Resellers customer group. > **Tip: Tip** > > Customer groups aren't the same as user groups. User groups concern all users in the system and can be used, for example, to handle permissions. Customer groups refer specifically to the product catalog functionalities and enable handling prices. ## Enabling customer groups To enable the use of customer groups, you need to modify the user content type's definition by adding a [customer group field](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/customergroupfield/index.md). With this field you can add a user to any of the predefined customer groups. # Recommendations # Raptor integration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Step-by-step activation procedure of setting up the Raptor connector. The [Raptor](https://www.raptorservices.com/) integration is an add-on that provides a seamless integration between Cohesivo and Raptor recommendation engine. Its primary goal is to enable editors and managers to deliver personalized experiences across digital channels, which helps increase conversion rates, drive sales, and improve user engagement. By combining content management capabilities with advanced recommendation features, the connector allows teams to build and manage personalized experiences across integrated tools. This approach reduces integration complexity while providing a scalable foundation for personalization use cases across multiple sites and markets. For more information about tracking, check the Raptor documentation: [Implementing tracking](https://content.raptorservices.com/help-center/data-management#implementing-tracking). - [Recommendation blocks in Page Builder](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/recommendations/raptor_integration/recommendation_blocks/): Recommendation blocks in Page Builder # Raptor integration product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Discover Raptor integration - an add-on focused on recommendations and tracking customer behaviors. Discover [Raptor](https://www.raptorservices.com/) integration - an add-on that is focused on recommendations for your visitors. ## What is Raptor integration The [Raptor integration](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector/index.md) provides a seamless integration between Cohesivo and the Raptor recommendation engine. Its primary goal is to enable editors and managers to deliver personalized experiences across digital channels, which helps to increase conversion rates, drive sales, and improve user engagement. By bringing content and recommendations together, the connector makes it easy to build and manage personalized experiences. This approach simplifies integration while supporting personalization across different sites and markets. ## Availability To use the Raptor integration, you must first make arrangements with Ibexa. ## Raptor tracking To start [tracking](https://content.raptorservices.com/help-center/introduction-to-tracking-documentation) user interactions, the tracking script needs to be added to the website’s layout. ## Capabilities ### Tracking Raptor tracking allows you to collect data about how users interact with your products and content. This gives you the data you need to better understand user behavior, improve recommendations, and support personalization. ### Recommendation blocks The Raptor integration add-on provides a set of ready-to-use recommendation blocks that can be added directly in the [Page Builder](https://doc.ibexa.co/en/saas/content_management/pages/page_builder_guide/index.md). These blocks can be configured to adjust how they work and what they display. Content, Product, and Commerce recommendations can be placed on landing pages using these components. Editors can use these blocks to display tailored product recommendations, promote related content, and highlight items that are trending or recently viewed. Recommendation blocks are organized into dedicated categories, each grouping blocks based on the type of recommendation they provide: - **Recommendations: Content** - presents content recommendations: - [Content that has been seen along with the item category](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#content-that-has-been-seen-along-with-the-item-category-block) - [Merchandising content sorted by personal preferences and popularity](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#merchandising-content-sorted-by-personal-preferences-and-popularity) - [Most popular content](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#most-popular-content-block) - [Other customers have also seen this content](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#other-customers-have-also-seen-this-content-block) - [Personalized content recommendations](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#personalized-content-recommendations-block) - [User’s content history](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#users-content-history-block) - **Recommendations: Product** - displays product suggestions based on visitors’ browsing history: - [Items associated with the given Content](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#items-associated-with-the-given-content-block) - [Items of Customized Feeds sorted by personal preferences and popularity or trendiness](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#items-of-customized-feeds-sorted-by-personal-preferences-and-popularity-or-trendiness) - [Most popular products](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#most-popular-products-block) - [Most popular products in category](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#most-popular-products-in-category-block) - [Other customers have also seen](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#other-customers-have-also-seen-block) - **Recommendations: Commerce** - shows recommendations based on visitors' purchase history (buy and basket events): - [Other customers have also purchased block](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#other-customers-have-also-purchased-block) - [The Personal Shopping Assistant](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#the-personal-shopping-assistant-block) - [The Personal Shopping Assistant (additional sales)](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#the-personal-shopping-assistant-additional-sales-block) - [The Personal Shopping Assistant (conversion)](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#the-personal-shopping-assistant-conversion-block) - [User's item history](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#users-item-history-block) ![Recommendation blocks](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/img/recommendation_blocks.png) For a complete description of Recommendation blocks see [Recommendation blocks in User Documentation](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/). ## Benefits ### Understand user behavior Thanks to tracking functions, you can capture how users interact with your products and content, giving you valuable insights into their behavior. It helps you make data-driven decisions to improve engagement and personalize the user experience. ### Highlight recommendations Use recommendation blocks on your websites to highlight content targeted at your customers. Deliver relevant content and build trust in your brand. ### Suggest content to boost retention Help users find content of their interest quicker. Showing visitors content and products that match their interests helps keep them engaged and encourages them to come back. ### Meet customer expectations and increase engagement Recommendation blocks highlight products that match customers' interests. Tailored content boosts engagement by showing visitors information and products that align with their interests and fulfill their needs. This strengthens the connection between your brand and your audience, encouraging them to spend more time on your site and return more often. ### Increase average order value Use tracking for predictive analysis and find out what motivates users to put extra items into their carts. Start building predictions of their behaviors and suggest products your visitors are willing to buy. ### Track performance and increase conversions Use the Raptor service in your Commerce shop and see how recommendations drive sales. Keep track of which recommendations are shown to visitors and measure conversion rates to evaluate their effectiveness against your goals. # Recommendation blocks in Page Builder > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Recommendation blocks in Page Builder One of the Raptor Integration elements is the introduction of recommendation blocks available in the [Page Builder](https://doc.ibexa.co/en/saas/content_management/pages/page_builder_guide/index.md). Content, Product, and Commerce recommendations can be added to a landing page using the blocks. Editors can configure these blocks to display: - personalized product recommendations - related articles or content - recently viewed or popular items In the toolbar, corresponding categories for recommendation blocks are available, containing sets of blocks depending on the recommendation type: - **Recommendations: Content** - presents content recommendations: - [Content that has been seen along with the item category](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#content-that-has-been-seen-along-with-the-item-category-block) - [Merchandising content sorted by personal preferences and popularity](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#merchandising-content-sorted-by-personal-preferences-and-popularity) - [Most popular content](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#most-popular-content-block) - [Other customers have also seen this content](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#other-customers-have-also-seen-this-content-block) - [Personalized content recommendations](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#personalized-content-recommendations-block) - [User’s content history](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#users-content-history-block) - **Recommendations: Product** - displays product suggestions based on visitors’ browsing history: - [Items associated with the given Content](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#items-associated-with-the-given-content-block) - [Items of Customized Feeds sorted by personal preferences and popularity or trendiness](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#items-of-customized-feeds-sorted-by-personal-preferences-and-popularity-or-trendiness) - [Most popular products](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#most-popular-products-block) - [Most popular products in category](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#most-popular-products-in-category-block) - [Other customers have also seen](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#other-customers-have-also-seen-block) - **Recommendations: Commerce** - shows recommendations based on visitors' purchase history (buy and basket events): - [Other customers have also purchased block](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#other-customers-have-also-purchased-block) - [The Personal Shopping Assistant](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#the-personal-shopping-assistant-block) - [The Personal Shopping Assistant (additional sales)](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#the-personal-shopping-assistant-additional-sales-block) - [The Personal Shopping Assistant (conversion)](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#the-personal-shopping-assistant-conversion-block) - [User's item history](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/#users-item-history-block) ![Recommendation blocks](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/img/recommendation_blocks.png) After opening the settings of a recommendation block, a link is available at the bottom of the window. It leads to the [Raptor Control Panel](https://controlpanel.raptorsmartadvisor.com/) (opens in a separate tab), where you can configure advanced settings and fine-tune the recommendation strategy. ![Advanced settings](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/img/advanced_settings.png) For a complete description of Recommendation blocks see [Recommendation blocks](https://doc.ibexa.co/projects/userguide/en/saas/recommendations/raptor_integration/raptor_recommendation_blocks/). For the list of all page blocks that are available in Page Builder, see [Block reference page](https://doc.ibexa.co/projects/userguide/en/saas/content_management/block_reference/). # Customer Data Platform # Raptor CDP integration > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Raptor CDP is a software system designed to collect and organize customer data from multiple sources to build comprehensive customer profiles. ## What is Raptor CDP Raptor CDP (Customer Data Platform) helps you solve one of the hardest challenges facing business world today: building unique experiences for your customers. With Raptor CDP you're able to track and aggregate data of your customers' activity on multiple channels. It allows you to create individual customer profiles that enable you to personalize their experience on your platform. ![Raptor CDP control panel](https://doc.ibexa.co/en/saas/raptor_cdp/img/raptor_cdp_control_panel.png) ## How it works Raptor CDP unifies customer data across your organization to help you activate your users and provide them with real-time engagement. With defined audiences you can target your user segments at the right time, through the most used channel, with the relevant message, content, or products. The customer data are collected through the system of trackers embedded in different parts of your page. # Raptor CDP product guide > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The Raptor CDP product guide describes all the possibilities that the Customer Data Platform offers to help you build great customer experiences. ## What is Raptor CDP Raptor CDP (Customer Data Platform) module helps you build unique and memorable experiences for your customers. By using Raptor CDP you can monitor and compile data about your customers' activity on multiple channels. It also allows you to create individual customer profiles so you can customize their experience on your platform. With Raptor CDP you can store and manage large volumes of customer data in a structured manner. This central data storage supports business growth with a scalable infrastructure, helping to futureproof your business. You can get customer data from both online and offline data sources. It includes first, second, and third-party data from multiple sources such as transactional systems, website tracking, and behavior, POS, CRM, and others. ## How does Raptor CDP work Raptor CDP unifies customer data throughout your whole organization. It helps you activate your users and give them real-time interaction. You can target certain user segments with the appropriate message, content, or products at the right time through the most used channels by using specified audiences. Customer data is gathered through a system of trackers embedded in various areas of your website. ![CDP - how does it work](https://doc.ibexa.co/en/saas/raptor_cdp/img/cdp.png) ### Getting started To start using Raptor CDP, first you need to contact your sales representative, who provides you with a link to register your Raptor CDP account. When you're done with registration process, you're able to access a separate instance with the data needed to configure, activate, and use this feature. ### Customer profile In Raptor CDP you can build 360° customer profiles. It unifies customer data from different sources to help you understand your prospects and customer needs. After you get customer data, you can unify and match customer profiles based on their preferences and habits. You can create and analyze complete, 360° customer profiles based on demographics, interactions, behaviors, and transactional data. This approach helps you create a single customer view. ![Customer profile](https://doc.ibexa.co/en/saas/raptor_cdp/img/customer_profile.png) ### Segment groups To create a personalized customer experience, you need to group your clients into specified audiences. Cohesivo comes with a ready solution - segment groups. Segment group information is reused by various Cohesivo functionalities, such as [Recommendations](https://doc.ibexa.co/en/saas/recommendations/raptor_integration/raptor_connector_guide/index.md) or content targeting. You can [create a segment group](https://doc.ibexa.co/en/saas/administration/admin_panel/segments_admin_panel/index.md) in the back office of Cohesivo. It serves as a container for all segments data generated by Raptor CDP. When you create a segment group, you need to provide its name and identifier. Be careful while doing so, as after you create the segment group in the back office and connect it to Raptor CDP, you cannot change it in any way, including edit its name. Remember to add a segment group identifier to the configuration, under the `segment_group_identifier` field. ## Capabilities ### Data export Configuration in Raptor CDP allows you to automate the process of exporting content, users, and products. ### Data customization ​You can customize content and product data exported to Raptor CDP and control what field type information you want to export. With Raptor CDP, you can export field types and field type values. They're exported with metadata and attributes, for example, ID, field definition name, type, or value. ### Client-side Tracking The final step is setting up a tracking script. For more information, see [CDP add client-side tracking](https://doc.ibexa.co/en/saas/raptor_cdp/raptor_cdp_activation/raptor_cdp_add_tracking/index.md) and [Introduction to tracking in Raptor documentation](https://content.raptorservices.com/help-center/introduction-to-tracking-documentation). ### Audience Builder In the Audience Builder, you can create audiences - groups of users that meet the assumed conditions. You can choose specific conditions: `did`, `did not`, or `have`. The conditions `did` and `did not` allow you to use events like buy, visit or add to a cart from online tracking. The `have` conditions are tied to personal characteristics and can be used to track the sum of all buys or top-visited categories. You can also connect created audiences to the activations. ![Audience Builder](https://doc.ibexa.co/en/saas/raptor_cdp/img/audience_builder.png) ### Anonymous user segmentation Raptor CDP can build audiences for anonymous users, enabling personalised experiences for not logged-in visitors. When an anonymous visitor accesses your site, Raptor starts building an [anonymous profile](https://content.raptorservices.com/help-center/introduction-to-person-identifiers-and-profile-unification). You can segment these anonymous profiles into different audiences, exactly as in case of logged-in users, and use this information in Cohesivo to provide personalized experiences. ## Benefits ### Personalized user experience With Raptor CDP you can build unique and memorable experience for your customers and create individual customer profiles. By using 360° client profiles, you can connect with the right customer at the right moment, in the right place. Build extensive customer profiles that include their interactions, habits, and preferences from several touchpoints. ### Segment groups Provide a personalized customer experience, group your clients into specified audiences, and provide recommendations depending on the user data. Create segment groups to deliver personalized campaigns to boost engagement and conversion rates. ### Audience Builder Create user groups - audiences - based on conditions and events. ### Data export Export data regarding content, users, and products. Data export includes automatic file mapping. Analyze customer data, track campaigns, and discover the most effective strategies to boost performance. ### Data customization Customize data to control what field type information you want to export. ### Real-time action Deliver relevant interactions in the right place at the right time for optimal results thanks to dynamic, real-time data updates. Take advantage of event-triggered communications which are aligned with your customers immediate interests. # Track with Raptor CDP > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Adding tracking in Raptor CDP. The final step is setting up a tracking script that identifies visitors and records their interactions. ## Set up tracking with tracking scripts The tracking script requires a head tracking script between the `` tags on your website, a main script after the head script, and cookie consent. For more information about setting up a tracking script manually, see [Raptor documentation](https://content.raptorservices.com/help-center/client-side-tracking). Now, you need to add a tracker to specific places in your website where you want to track users. For example, add this tracker to the landing page template to track various user activities: - user entrances ```js raptor.trackEvent('visit', ..., ...); ``` - user purchases ```js //Parameters for Product 1 raptor.trackEvent('buy', ..., ...); //Parameters for Product 2 raptor.trackEvent('buy', ..., ...); ``` For tracking to be effective, you also need to send ID of a logged-in user in the same way. Add the user ID information of logged-in users by using below script: ```js raptor.push("setRuid","USER_ID_HERE") ``` For anonymous visitors, Raptor's tracking script automatically sets an `rsa` cookie that uniquely identifies the visitor, without calling the `setRuid` method. For more information on tracking events, see [Raptor documentation](https://content.raptorservices.com/help-center/tracking-events-parameters-reference). # Search # Search > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo search functionalities allow running complex and precise queries about content and products. Cohesivo exposes a very powerful Search API, allowing both full-text search and querying the content repository by using several built-in Search Criteria and Sort Clauses. You run searches over the REST API: with the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request for content and locations, and with the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request for products. For all available endpoints, see the [REST API reference](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html). - [Search Criteria and Sort Clauses](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/search/search_criteria_and_sort_clauses/): Search Criteria and Sort Clauses help you fine-tune searches done by using the Search API. # Search Criteria and Sort Clauses > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Search Criteria and Sort Clauses help you fine-tune searches done by using the Search API. Search Criteria and Sort Clauses are the building blocks of a search query: Criteria select which content is returned, and Sort Clauses order the results. Cohesivo provides a number of standard Search Criteria and Sort Clauses that cover the majority of use cases. For the full list, see the [Search Criteria reference](https://doc.ibexa.co/en/saas/search/criteria_reference/search_criteria_reference/index.md) and the [Sort Clause reference](https://doc.ibexa.co/en/saas/search/sort_clause_reference/sort_clause_reference/index.md). ## Running a search over the REST API You search for content and locations with the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request. The query goes into the `ViewInput` element of the payload, where Criteria go into the `Filter` or `Query` element, Sort Clauses into `SortClauses`, and aggregations into `Aggregations`. You can limit the number of results with `limit` and `offset`. ```json { "ViewInput": { "identifier": "ArticlesView", "Query": { "Filter": { "ContentTypeIdentifierCriterion": "article", "SubtreeCriterion": "/1/2/" }, "SortClauses": { "DatePublished": "descending" }, "limit": 10, "offset": 0 } } } ``` Products have their own search endpoint, [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view), which takes a `ProductQuery` element instead. For more information, see the [Product Search Criteria reference](https://doc.ibexa.co/en/saas/search/criteria_reference/product_search_criteria/index.md) and the [Product Sort Clauses reference](https://doc.ibexa.co/en/saas/search/sort_clause_reference/product_sort_clauses/index.md). ## Content and Location search There are two basic types of search: you can search for content items, or for locations. All Criteria and Sort Clauses are accepted by Location search, but not all of them can be used with Content search. The reason is that while one location always has exactly one content item, one content item can have several locations. In that context some Criteria and Sort Clauses would produce ambiguous queries, so Content search refuses the Criteria and Sort Clauses that apply specifically to locations. With version 1.1 of the `ViewInput` media type (`application/vnd.ibexa.api.ViewInput+json; version=1.1`), you select the type of search by using the `ContentQuery` or `LocationQuery` element instead of `Query`. ## Search using a custom Field Criterion You can also call the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request with a custom `Field` Criterion. This allows you to build custom content logic queries with nested logical operators OR/AND/NOT. ### Example of custom Content Query ```json "ContentQuery":{ "Query":{ "OR":[ { "AND":[ { "Field":{ "name":"name", "operator":"CONTAINS", "value":"foo" } }, { "Field":{ "name":"info", "operator":"CONTAINS", "value":"bar" } } ] }, { "AND":[ { "Field":{ "name":"name", "operator":"CONTAINS", "value":"barfoo" } }, { "Field":{ "name":"info", "operator":"CONTAINS", "value":"baz" } } ] } ] } } ``` # Search Criteria reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Search Criteria help define and fine-tune search queries for content and locations. Search Criteria are filters for content and location search. You use them over the REST API, in the `Filter` or `Query` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request. In the payload, the name of a Criterion has the `Criterion` suffix, for example, `ContentIdCriterion`. Criteria that you provide in one `Filter` or `Query` element are combined with a logical AND. To build more complex conditions, nest them in the [`AND`](https://doc.ibexa.co/en/saas/search/criteria_reference/logicaland_criterion/index.md), [`OR`](https://doc.ibexa.co/en/saas/search/criteria_reference/logicalor_criterion/index.md), and [`NOT`](https://doc.ibexa.co/en/saas/search/criteria_reference/logicalnot_criterion/index.md) elements. Criteria can take some of the following arguments: - `target` - when the Criterion supports targeting a specific field, example: `FieldDefinition` or Metadata identifier - `value` - the value(s) to filter on, typically a scalar or array of scalars - `operator` - one of `IN`, `EQ`, `GT`, `GTE`, `LT`, `LTE`, `LIKE`, `BETWEEN`, `CONTAINS`. Most Criteria don't expose this and select `EQ` or `IN` depending on whether the value is scalar or an array. `IN` and `BETWEEN` always act on an array of values, while the other operators act on single scalar value ## Search Criteria | Search Criterion | Search based on | Content Search | Location Search | Filtering | | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -------------- | --------------- | --------- | | [Ancestor](https://doc.ibexa.co/en/saas/search/criteria_reference/ancestor_criterion/index.md) | Whether the content item is an ancestor of the provided location | Yes | Yes | Yes | | [ContentId](https://doc.ibexa.co/en/saas/search/criteria_reference/contentid_criterion/index.md) | Content item's ID | Yes | Yes | Yes | | [ContentName](https://doc.ibexa.co/en/saas/search/criteria_reference/contentname_criterion/index.md) | Content item's name | Yes | Yes | Yes | | [ContentTypeGroupId](https://doc.ibexa.co/en/saas/search/criteria_reference/contenttypegroupid_criterion/index.md) | ID of the content item's content type group | Yes | Yes | Yes | | [ContentTypeId](https://doc.ibexa.co/en/saas/search/criteria_reference/contenttypeid_criterion/index.md) | ID of the content item's content type | Yes | Yes | Yes | | [ContentTypeIdentifier](https://doc.ibexa.co/en/saas/search/criteria_reference/contenttypeidentifier_criterion/index.md) | Identifier of the content item's content type | Yes | Yes | Yes | | [DateMetadata](https://doc.ibexa.co/en/saas/search/criteria_reference/datemetadata_criterion/index.md) | The date when content was created or last modified | Yes | Yes | Yes | | [Field](https://doc.ibexa.co/en/saas/search/criteria_reference/field_criterion/index.md) | Content of one of content item's fields | Yes | Yes | | | [FullText](https://doc.ibexa.co/en/saas/search/criteria_reference/fulltext_criterion/index.md) | Full text content of a content item's fields | Yes | Yes | | | [Image](https://doc.ibexa.co/en/saas/search/criteria_reference/image_criterion/index.md) | Image by specified image attributes | Yes | Yes | | | [ImageDimensions](https://doc.ibexa.co/en/saas/search/criteria_reference/imagedimensions_criterion/index.md) | Image dimensions: height and width | Yes | Yes | | | [ImageFileSize](https://doc.ibexa.co/en/saas/search/criteria_reference/imagefilesize_criterion/index.md) | Image size in MB | Yes | Yes | | | [ImageMimeType](https://doc.ibexa.co/en/saas/search/criteria_reference/imagemimetype_criterion/index.md) | Image type | Yes | Yes | | | [ImageOrientation](https://doc.ibexa.co/en/saas/search/criteria_reference/imageorientation_criterion/index.md) | Image orientation | Yes | Yes | | | [IsBookmarked](https://doc.ibexa.co/en/saas/search/criteria_reference/isbookmarked_criterion/index.md) | Whether a location is bookmarked or not | | Yes | Yes | | [IsContainer](https://doc.ibexa.co/en/saas/search/criteria_reference/iscontainer_criterion/index.md) | Whether a content item is a container (can contain other content items) | Yes | Yes | Yes | | [IsUserEnabled](https://doc.ibexa.co/en/saas/search/criteria_reference/isuserenabled_criterion/index.md) | Whether a User account is enabled | Yes | Yes | Yes | | [LanguageCode](https://doc.ibexa.co/en/saas/search/criteria_reference/languagecode_criterion/index.md) | Whether a content item is translated into the selected language | Yes | Yes | Yes | | [LocationId](https://doc.ibexa.co/en/saas/search/criteria_reference/locationid_criterion/index.md) | Location ID | Yes | Yes | Yes | | [LocationRemoteId](https://doc.ibexa.co/en/saas/search/criteria_reference/locationremoteid_criterion/index.md) | Location remote ID | Yes | Yes | Yes | | [ObjectStateId](https://doc.ibexa.co/en/saas/search/criteria_reference/objectstateid_criterion/index.md) | Object state ID | Yes | Yes | Yes | | [ObjectStateIdentifier](https://doc.ibexa.co/en/saas/search/criteria_reference/objectstateidentifier_criterion/index.md) | Object state Identifier | Yes | Yes | Yes | | [ParentLocationId](https://doc.ibexa.co/en/saas/search/criteria_reference/parentlocationid_criterion/index.md) | Location ID of a content item's parent | Yes | Yes | Yes | | [ParentLocationRemoteId](https://doc.ibexa.co/en/saas/search/criteria_reference/parentlocationremoteId_criterion/index.md) | Location remote ID of a content item's parent | Yes | Yes | | | [RemoteId](https://doc.ibexa.co/en/saas/search/criteria_reference/remoteid_criterion/index.md) | Remote content ID | Yes | Yes | Yes | | [SectionId](https://doc.ibexa.co/en/saas/search/criteria_reference/sectionid_criterion/index.md) | ID of the Section content is assigned to | Yes | Yes | Yes | | [SectionIdentifier](https://doc.ibexa.co/en/saas/search/criteria_reference/sectionidentifier_criterion/index.md) | Identifier of the Section content is assigned to | Yes | Yes | Yes | | [Sibling](https://doc.ibexa.co/en/saas/search/criteria_reference/sibling_criterion/index.md) | Locations that are children of the same parent | Yes | Yes | Yes | | [Subtree](https://doc.ibexa.co/en/saas/search/criteria_reference/subtree_criterion/index.md) | Location subtree | Yes | Yes | Yes | | [UserEmail](https://doc.ibexa.co/en/saas/search/criteria_reference/useremail_criterion/index.md) | Email address of a User account | Yes | Yes | Yes | | [UserId](https://doc.ibexa.co/en/saas/search/criteria_reference/userid_criterion/index.md) | User ID | Yes | Yes | Yes | | [UserLogin](https://doc.ibexa.co/en/saas/search/criteria_reference/userlogin_criterion/index.md) | User login | Yes | Yes | Yes | | [UserMetadata](https://doc.ibexa.co/en/saas/search/criteria_reference/usermetadata_criterion/index.md) | The creator or modifier of a content item | Yes | Yes | Yes | | [Visibility](https://doc.ibexa.co/en/saas/search/criteria_reference/visibility_criterion/index.md) | Whether the content item is visible or not | Yes | Yes | Yes | ### Logical operators All Logical operators are supported by Content and Location Search. | Search Criterion | | -------------------------------------------------------------------------------------------------- | | [LogicalAnd](https://doc.ibexa.co/en/saas/search/criteria_reference/logicaland_criterion/index.md) | | [LogicalNot](https://doc.ibexa.co/en/saas/search/criteria_reference/logicalnot_criterion/index.md) | | [LogicalOr](https://doc.ibexa.co/en/saas/search/criteria_reference/logicalor_criterion/index.md) | # Ancestor Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Ancestor Search Criterion The `Ancestor` Search Criterion searches for content that is an ancestor of the provided location, including this location. ## Arguments - `value` - array of location pathStrings ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml /81/82/ ``` **JSON** ```json "Query": { "Filter": { "AncestorCriterion": "/81/82/" } } ``` ## Use case You can use the `Ancestor` Search Criterion to create a list of breadcrumbs leading to a location, because it matches every ancestor of that location, including the location itself. # ContentId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentId Search Criterion The `ContentId` Search Criterion searches for content by its ID. ## Arguments - `value` - int(s) representing the Content ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 1,52 ``` **JSON** ```json "Query": { "Filter": { "ContentIdCriterion": "1,52" } } ``` # ContentName Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentName Search Criterion The [`ContentName` Search Criterion](https://github.com/ibexa/core/blob/6.0/src/contracts/Repository/Values/Content/Query/Criterion/ContentName.php) searches for content by its name. ## Arguments - `value` - string representing the content name, the wildcard character `*` can be used for partial search ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml *phone ``` **JSON** ```json "Query": { "Filter": { "ContentNameCriterion": "*phone" } } ``` # ContentTypeGroupId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentTypeGroupId Search Criterion The `ContentTypeGroupId` Search Criterion searches for content based on the ID of its content type group. ## Arguments - `value` - int(s) representing the content type group ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 1 ``` **JSON** ```json "Query": { "Filter": { "ContentTypeGroupIdCriterion": [1, 2] } } ``` ## Use case You can use the `ContentTypeGroupId` Criterion to query all Media content items. The default ID for the Media content type group is 3. # ContentTypeId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentTypeId Search Criterion The `ContentTypeId` Search Criterion searches for content based on the ID of its content type. ## Arguments - `value` - int(s) representing the content type ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 44 ``` **JSON** ```json "Query": { "Filter": { "ContentTypeIdCriterion": 44 } } ``` # ContentTypeIdentifier Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentTypeIdentifier Search Criterion The `ContentTypeIdentifier` Search Criterion searches for content based on the identifier of its content type. ## Arguments - `value` - string(s) representing the content type identifier(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml article ``` **JSON** ```json "Query": { "Filter": { "ContentTypeIdentifierCriterion": "article" } } ``` # DateMetadata Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). DateMetadata Search Criterion The `DateMetadata` Search Criterion searches for content based on the date when it was created or last modified. ## Arguments - `target` - indicating if publication or modification date should be queried, either `DateMetadata::CREATED` or `DateMetadata::PUBLISHED` (both with the same functionality), or `DateMetadata::MODIFIED` - `operator` - Operator constant (IN, EQ, GT, GTE, LT, LTE, BETWEEN) - `value` - indicating the date(s) that should be matched, provided as a UNIX timestamp (or array of timestamps) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml modified 1675681020 gte ``` **JSON** ```json "Query": { "Filter": { "DateMetadataCriterion": { "Target": "modified", "Value": 1675681020, "Operator": "gte" } } } ``` ## Use case You can use the `DateMetadata` Criterion to search for blog posts that have been created within the last week, by combining it with a content type Criterion and the `GTE` operator. # Field Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Field Search Criterion The `Field` Search Criterion searches for content based on the content of one of its fields. ## Arguments - `target` - string representing the identifier of the field to query - `operator` - operator constant (IN, EQ, GT, GTE, LT, LTE, LIKE, BETWEEN, CONTAINS) - `value` - the value to query for The `LIKE` operator works together with wildcards (`*`). Without a wildcards its results are the same as for the `EQ` operator. The `CONTAINS` operator works with collection fields like the Country field type, enabling you to retrieve results when the query value is one of the values of the collection. Querying for a collection with the `EQ` operator returns result only when the whole collection equals the query values. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml name CONTAINS Platform ``` **JSON** ```json { "Query": { "Filter": { "Field": { "name": "name", "operator": "CONTAINS", "value": "Platform" } } } } ``` ## Use case You can use the `Field` Criterion to search for articles whose `name` field contains the word "Featured", by combining it with a content type Criterion and the `CONTAINS` operator. # Full-Text Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Full-Text Search Criterion The `FullText` Search Criterion searches for content based on the full text content of its fields. ## Arguments - `value` - string to search for ## Supported syntax A full-text query supports the following syntax: - Boolean operators: `AND` (`&&`), `OR` (`||`), `NOT` (`!`) - Require and exclude operators: `+`, `-` - Grouping with parentheses - Phrase search with double quotes - Asterisks (`*`) as wildcards ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml victory ``` **JSON** ```json "Query": { "Filter": { "FullTextCriterion": "victory" } } ``` ## Use cases Assume a full-text search for `(cup AND ba*ball) "breaking news"`, which combines grouping, the `AND` operator, a wildcard, and a quoted phrase. It returns content containing phrases such as "Breaking news", "Baseball world cup", "Basketball cup", or "Breaking news: Baseball world cup victory". It doesn't return content with phrases such as "Football world cup" or "Breaking sports news". # Image Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Image Search Criterion The `Image` Search Criterion searches for image by specified image attributes. ## Arguments - `fieldDefIdentifier` - string representing the identifier of the field - `imageCriteriaData` - array representing image attributes. All attributes are optional. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml image image/png 0 2 100 1000 500 1500 portrait ``` **JSON** ```json "Query": { "Filter": { "ImageCriterion": { "fieldDefIdentifier": "image", "mimeTypes": "image/png", "size": { "max": 1.5 }, "width": { "max": 1000 }, "height": { "max": 1500 }, "orientation": "portrait" } } } OR "Query": { "Filter": { "ImageCriterion": { "fieldDefIdentifier": "image", "mimeTypes": [ "image/png", "image/jpeg" ], "size": { "min": 0, "max": 2 }, "width": { "min": 100, "max": 1000 }, "height": { "min": 500, "max": 1500 }, "orientation": [ "portrait", "landscape" ] } } } ``` # Image Dimension Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Image Dimensions Search Criterion The `Dimensions` Search Criterion searches for image with specified dimensions. ## Arguments - `fieldDefIdentifier` - string representing the identifier of the field - `imageCriteriaData` - an array representing minimum and maximum values for width and height, expressed in pixels ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml image 100 1000 500 1500 ``` **JSON** ```json "Query": { "Filter": { "ImageDimensionsCriterion": { "fieldDefIdentifier": "image", "width": { "min": 100, "max": 1000 }, "height": { "min": 500, "max": 1500 } } } } ``` # Image FileSize Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Image FileSize Search Criterion The `FileSize` Search Criterion searches for image with specified size. ## Arguments - `fieldDefIdentifier` - string representing the identifier of the field - (optional) `minValue` - numeric representing minimum file size expressed in MB, default: 0 - (optional) `maxValue` - numeric representing maximum file size expressed in MB, default: `null` ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml image 0 1.5 ``` **JSON** ```json "Query": { "Filter": { "ImageFileSizeCriterion":{ "fieldDefIdentifier": "image", "size": { "min": 0, "max": 1.5 } } } } ``` # Image MimeType Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Image MimeType Search Criterion The `MimeType` Search Criterion searches for image with specified mime type(s). ## Arguments - `fielDefIdentifier` - string representing the identifier of the field - `type` - string(s) representing mime type(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml image image/png ``` **JSON** ```json "Query": { "Filter": { "ImageMimeTypeCriterion": { "fieldDefIdentifier": "image", "type": "image/png" } } } OR "Query": { "Filter": { "ImageMimeTypeCriterion": { "fieldDefIdentifier": "image", "type": ["image/png", "image/jpeg"] } } } ``` # Image Orientation Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Image Orientation Search Criterion The `Orientation` Search Criterion searches for image with specified orientation(s). Supported orientation values: landscape, portrait and square. ## Arguments - `fielDefIdentifier` - string representing the identifier of the field - `orientation` - strings representing orientations ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml image landscape ``` **JSON** ```json "Query": { "Filter": { "ImageOrientationCriterion": { "fieldDefIdentifier": "image", "orientation": "landscape" } } } OR "Query": { "Filter": { "ImageOrientationCriterion": { "fieldDefIdentifier": "image", "orientation": ["portrait", "landscape"] } } } ``` # IsBookmarked Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IsBookmarked Search Criterion The `IsBookmarked` Search Criterion searches for location based on whether it's bookmarked or not. It works with current user reference. This Criterion is available only for location Search. ## Arguments - `value` - bool representing whether to search for bookmarked location (default `true`) or not bookmarked location (`false`) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml true ``` **JSON** ```json "Query": { "Filter": { "IsBookmarkedCriterion": true } } ``` # IsContainer Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IsContainer Search Criterion The `IsContainer` Search Criterion searches for content items based on whether they are containers (i.e., can contain other content items). ## Arguments - `value` – boolean (optional, default: `true`). If `true`, searches for content that is a container. If `false`, searches for content that is not a container. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml true ``` **JSON** ```json "Query": { "Filter": { "IsContainerCriterion": true } } ``` # IsUserEnabled Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IsUserEnabled Search Criterion The `IsUserEnabled` Search Criterion searches for user accounts that are enabled or disabled. ## Arguments - (optional) `value` - bool representing whether to search for enabled (default `true`) or disabled user accounts ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml true ``` **JSON** ```json "Query": { "Filter": { "IsUserEnabledCriterion": "true" } } ``` # LanguageCode Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LanguageCode Search Criterion The `LanguageCode` Search Criterion searches for content based on whether it's translated into the selected language. ## Arguments - `value` - string(s) representing the language codes to search for - (optional) `matchAlwaysAvailable` - bool representing whether content with the `alwaysAvailable` flag should be returned even if it doesn't contain the selected language (default `true`) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml eng-GB ``` **JSON** ```json "Query": { "Filter": { "LanguageCodeCriterion": "eng-GB" } } ``` ## Use case You can use the `LanguageCode` Criterion to search for articles that are lacking a translation into a specific language, by negating it and setting `matchAlwaysAvailable` to `false`. # LocationId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LocationId Search Criterion The `LocationId` Search Criterion searches for content based in the location ID. ## Arguments - `value` - int(s) representing the location ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 62 ``` **JSON** ```json "Query": { "Filter": { "LocationIdCriterion": "62" } } ``` # LocationRemoteId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LocationRemoteId Search Criterion The `LocationRemoteId` Search Criterion searches for content based in the location remote ID. ## Arguments - `value` - string(s) representing the location remote ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 3aaeefdb0ae573ac91f6d6ea78d230b7 ``` **JSON** ```json "Query": { "Filter": { "LocationRemoteIdCriterion": "3aaeefdb0ae573ac91f6d6ea78d230b7" } } ``` # ObjectStateId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ObjectStateId Search Criterion The `ObjectStateId` Search Criterion searches for content based on its object state ID. ## Arguments - `value` - int(s) representing the object state ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 1 ``` **JSON** ```json "Query": { "Filter": { "ObjectStateIdCriterion": "1" } } ``` # ObjectStateIdentifier Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ObjectStateIdentifier Search Criterion The `ObjectStateIdentifier` Search Criterion searches for content based on its object state identifier. ## Arguments - `value` - string(s) representing the object state identifier(s) - `target` (optional for PHP) - string representing the object state group ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml not_locked ibexa_lock ``` **JSON** ```json { "Query": { "Filter": { "ObjectStateIdentifierCriterion": { "value": "not_locked", "target": "ibexa_lock" } } } } ``` # ParentLocationId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ParentLocationId Search Criterion The `ParentLocationId` Search Criterion searches for content based on the Location ID of its parent. ## Arguments - `value` - int(s) representing the parent location IDs ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml [81, 82] ``` **JSON** ```json "Query": { "Filter": { "ParentLocationIdCriterion": [69, 72] } } ``` ## Use case You can use the `ParentLocationId` Search Criterion to list blog posts contained in a blog, by combining it with the `Visibility` Criterion so that hidden posts are excluded. # ParentLocationRemoteId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ParentLocationRemoteId Search Criterion The `ParentLocationRemoteId` Search Criterion searches for content based on the location remote ID of its parent. ## Arguments - `value` - int(s) representing the parent location remote IDs ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml abab615dcf26699a4291657152da4337 ``` **JSON** ```json "Query": { "Filter": { "ParentLocationRemoteIdCriterion": "abab615dcf26699a4291657152da4337" } } ``` # RemoteId / ContentRemoteId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). RemoteId / ContentRemoteId Search Criterion The `RemoteId` / `ContentRemoteId` Search Criterion searches for content based on its remote content ID. ## Arguments - `value` - string(s) representing the remote IDs ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml abab615dcf26699a4291657152da4337 ``` **JSON** ```json "Query": { "Filter": { "ContentRemoteIdCriterion": "abab615dcf26699a4291657152da4337" } } ``` # SectionId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SectionId Search Criterion The `SectionId` Search Criterion searches for content based on the ID of the Section it's assigned to. ## Arguments - `value` - int(s) representing the IDs of the Section(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 3 ``` **JSON** ```json "Query": { "Filter": { "SectionIdCriterion": "3" } } ``` # SectionIdentifier Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SectionIdentifier Search Criterion The `SectionIdentifier` Search Criterion searches for content based on the identifier of the Section it's assigned to. ## Arguments - `value` - string(s) representing the identifiers of the Section(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml sports ``` **JSON** ```json "Query": { "Filter": { "SectionIdentifierCriterion": "sports" } } ``` # Sibling Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Sibling Search Criterion The `Sibling` Search Criterion searches for content under the same parent as the indicated location. ## Arguments - `locationId` - int representing the location ID - `parentLocationId` - int representing the parent location ID ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 85 81 ``` **JSON** ```json "Query": { "Filter": { "SiblingCriterion": { "locationId": 85, "parentLocationId": 81 } } } ``` # Subtree Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Subtree Search Criterion The `Subtree` Search Criterion searches for content based on its location ID subtree path. It returns the content item and all the content items below it in the subtree. ## Arguments - `value` - string(s) representing the pathstring(s) to search for ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml /1/2/71/ ``` **JSON** ```json "Query": { "Filter": { "SubtreeCriterion": "/1/2/71/" } } ``` # UserEmail Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UserEmail Search Criterion The `UserEmail` Search Criterion searches for content based on the email assigned to the user account. ## Arguments - `value` - string(s) representing the User email(s) - (optional) `operator` - operator constant (IN, EQ, LIKE) ## Limitations Only the `IN` and `EQ` operators are supported. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml j.black* ``` **JSON** ```json "Query": { "Filter": { "UserEmailCriterion": "j.black*" } } ``` # UserId Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UserId Search Criterion The `UserId` Search Criterion searches for content based on the User ID. ## Arguments - `value` - int(s) representing the User ID(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml 14 ``` **JSON** ```json "Query": { "Filter": { "UserIdCriterion": "14" } } ``` # UserLogin Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UserLogin Search Criterion The `UserLogin` Search Criterion searches for content based on the User ID. ## Arguments - `value` - string(s) representing the User logins(s) - (optional) `operator` - operator constant (IN, EQ, LIKE) ## Limitations Only the `IN` and `EQ` operators are supported. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml johndoe ``` **JSON** ```json "Query": { "Filter": { "UserLoginCriterion": "johndoe" } } ``` # UserMetadata Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UserMetadata Search Criterion The `UserMetadata` Search Criterion searches for content based on its creator or modifier. ## Arguments - `target` - UserMetadata constant (OWNER, GROUP, MODIFIER); GROUP means the user group of the content item's creator - `operator` - Operator constant (EQ, IN) - `value` - int(s) representing the User IDs or user group IDs (in case of the UserMetadata::GROUP target) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml GROUP EQ 12 ``` **JSON** ```json { "Query": { "Filter": { "UserMetadataCriterion": { "target": "GROUP", "operator": "EQ", "value": 12 } } } } ``` ## Use case You can use the `UserMetadata` Criterion to search for blog posts created by a specific user group, such as Contributor, by using the `GROUP` target with the `EQ` operator. # Visibility Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Visibility Search Criterion The `Visibility` Search Criterion searches for content based on whether it's visible or not. This Criterion takes into account both hiding content and hiding locations. When used with Content Search, the Criterion takes into account all assigned locations. This means that hidden content is returned if it has at least one visible location. Use Location Search to avoid this. ## Arguments - `value` - Visibility constant (VISIBLE, HIDDEN) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml HIDDEN ``` **JSON** ```json "Query": { "Filter": { "VisibilityCriterion": "HIDDEN" } } ``` # LogicalAnd Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LogicalAnd Search Criterion The `LogicalAnd` Search Criterion matches content if all provided Criteria match. When querying for products, use LogicalAnd instead. ## Arguments - `criterion` - a set of Criteria combined by the logical operator ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml article news ``` **JSON** ```json { "Query": { "Filter": { "AND": { "ContentTypeIdentifierCriterion": "article", "SectionIdentifierCriterion": "news" } } } } ``` # LogicalNot Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LogicalNot Search Criterion The `LogicalNot` Search Criterion matches content URL if the provided Criterion doesn't match. It takes only one Criterion in the array parameter. ## Arguments - `criterion` - represents the Criterion that should be negated ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml article ``` **JSON** ```json { "Query": { "Criterion": { "LogicalNotCriterion": { "ContentTypeIdentifierCriterion": "article" } } } } ``` # LogicalOr Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LogicalOr Search Criterion The `LogicalOr` Search Criterion matches content if at least one of the provided Criteria matches. When querying for products, use LogicalOr instead. ## Arguments - `criterion` - a set of Criteria combined by the logical operator ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml article news ``` **JSON** ```json { "Query": { "Filter": { "OR": { "ContentTypeIdentifierCriterion": "article", "SectionIdentifierCriterion": "news" } } } } ``` # Content Type Search Criteria reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Content Type Search Criteria help define and fine-tune search queries for content types. Content Type Search Criteria filter the content types returned by content type search. You use them over the REST API, in the `Query` element of the payload of the [`POST /content/types/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Type/operation/ibexa.rest.content_types.view) request. All Criteria that you provide in one query are combined with a logical AND. | Criterion | Description | | ---------------------------------- | --------------------------------------------------------------------------------- | | ContainsFieldDefinitionIdCriterion | Matches content types that contain a field definition with the specified ID. | | ContentTypeGroupIdCriterion | Matches content types by their assigned group ID. | | ContentTypeGroupNameCriterion | Matches content types by the name of their assigned group. | | ContentTypeIdCriterion | Matches content types by their ID. | | ContentTypeIdentifierCriterion | Matches content types by their identifier. | | IsSystemCriterion | Matches content types based on whether the group they belong to is system or not. | ## Example ```json { "ViewInput": { "identifier": "ContentTypeView", "ContentTypeQuery": { "limit": 10, "offset": 0, "Query": { "ContentTypeIdentifierCriterion": "folder", "IsSystemCriterion": false } } } } ``` # Product Search Criteria reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Product Search Criteria Product Search Criteria let you filter products by specific properties, for example, color, availability, or creation date. You use them over the REST API, in the `Filter` or `Query` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request, or of the [`POST /product/catalog/catalogs/{identifier}/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Catalog/operation/ibexa.product_catalog.rest.catalogs.products.view) request, which searches within a single catalog. In the payload, the name of a Criterion has the `Criterion` suffix, for example, `ProductCodeCriterion`. Criteria that you provide in one `Filter` or `Query` element are combined with a logical AND. Products are content items, so you can also find them with a content search, by using the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request with, for example, the [ContentTypeIdentifier](https://doc.ibexa.co/en/saas/search/criteria_reference/contenttypeidentifier_criterion/index.md) Criterion. Such a search returns content items instead of products, and it doesn't accept Product Search Criteria. In the same way, the product endpoints don't accept [content Search Criteria](https://doc.ibexa.co/en/saas/search/criteria_reference/search_criteria_reference/index.md). Catalog Criteria (`CatalogIdentifier`, `CatalogName`, and `CatalogStatus`) are used with the [`POST /product/catalog/catalogs/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Catalog/operation/ibexa.product_catalog.rest.catalogs.view) request, and attribute definition Criteria (`AttributeName` and `AttributeGroupIdentifier`) with the [`POST /product/catalog/attributes/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Attribute/operation/ibexa.product_catalog.rest.attributes.view) request. ## Product Search Criteria To query for products coming from Quable, see [Quable](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md) for details about the integration. | Search Criterion | Search based on | Local product catalog | Quable | | ------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------- | --------------------- | ------ | | [AttributeGroupIdentifier](https://doc.ibexa.co/en/saas/search/criteria_reference/attributegroupidentifier_criterion/index.md) | Value of product's attribute group identifier | Yes | | | [AttributeName](https://doc.ibexa.co/en/saas/search/criteria_reference/attributename_criterion/index.md) | Value of product's attribute name | Yes | | | [CatalogIdentifier](https://doc.ibexa.co/en/saas/search/criteria_reference/catalogidentifier_criterion/index.md) | Catalog's identifier | Yes | | | [CatalogName](https://doc.ibexa.co/en/saas/search/criteria_reference/catalogname_criterion/index.md) | Catalog's name | Yes | | | [CatalogStatus](https://doc.ibexa.co/en/saas/search/criteria_reference/catalogstatus_criterion/index.md) | Catalog's status | Yes | | | [ColorAttribute](https://doc.ibexa.co/en/saas/search/criteria_reference/colorattribute_criterion/index.md) | Value of product's color attribute | Yes | | | [CreatedAt](https://doc.ibexa.co/en/saas/search/criteria_reference/createdat_criterion/index.md) | Date and time when product was created | Yes | Yes | | [CreatedAtRange](https://doc.ibexa.co/en/saas/search/criteria_reference/createdatrange_criterion/index.md) | Date and time range when product was created | Yes | | | [FloatAttribute](https://doc.ibexa.co/en/saas/search/criteria_reference/floatattribute_criterion/index.md) | Value of product's float attribute | Yes | | | [FloatAttributeRange](https://doc.ibexa.co/en/saas/search/criteria_reference/floatattributerange_criterion/index.md) | Value of product's float attribute | Yes | | | [IntegerAttribute](https://doc.ibexa.co/en/saas/search/criteria_reference/integerattribute_criterion/index.md) | Value of product's integer attribute | Yes | | | [IntegerAttributeRange](https://doc.ibexa.co/en/saas/search/criteria_reference/integerattributerange_criterion/index.md) | Value of product's integer attribute | Yes | | | [IsVirtual](https://doc.ibexa.co/en/saas/search/criteria_reference/isvirtual_criterion/index.md) | Product type (virtual or physical) | Yes | | | [ProductAvailability](https://doc.ibexa.co/en/saas/search/criteria_reference/productavailability_criterion/index.md) | Product's availability | Yes | | | [ProductCategory](https://doc.ibexa.co/en/saas/search/criteria_reference/productcategory_criterion/index.md) | Product category assigned to product | Yes | Yes | | [ProductCode](https://doc.ibexa.co/en/saas/search/criteria_reference/productcode_criterion/index.md) | Product's code | Yes | Yes | | [ProductName](https://doc.ibexa.co/en/saas/search/criteria_reference/productname_criterion/index.md) | Product's name | Yes | Yes | | [ProductType](https://doc.ibexa.co/en/saas/search/criteria_reference/producttype_criterion/index.md) | Product type | Yes | Yes | | [SelectionAttribute](https://doc.ibexa.co/en/saas/search/criteria_reference/selectionattribute_criterion/index.md) | Value of product's selection attribute | Yes | | | [UpdatedAt](https://doc.ibexa.co/en/saas/search/criteria_reference/updated_at_criterion/index.md) | Product modification date | Yes | Yes | | [UpdatedAtRange](https://doc.ibexa.co/en/saas/search/criteria_reference/updated_at_range_criterion/index.md) | Product modification date range | Yes | | # AttributeName Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). AttributeName Search Criterion The `AttributeName` Search Criterion searches for products by the value of their attribute name. ## Arguments - `value` - string representing the attribute's name ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/attributes/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Attribute/operation/ibexa.product_catalog.rest.attributes.view) request: **XML** ```xml measure ``` **JSON** ```json { "AttributeQuery": { "Query": { "AttributeNameCriterion": "measure" } } } ``` # AttributeGroupIdentifier Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). AttributeGroupIdentifier Search Criterion The `AttributeGroupIdentifier` Search Criterion searches for products by the value of their attribute group identifier. ## Arguments - `value` - string representing the attribute's identifier ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/attributes/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Attribute/operation/ibexa.product_catalog.rest.attributes.view) request: **XML** ```xml attribute_group ``` **JSON** ```json { "AttributeQuery": { "Query": { "AttributeGroupIdentifier": "attribute_group" } } } ``` # CatalogIdentifier Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CatalogIdentifier Search Criterion The `CatalogIdentifier` Search Criterion searches for a catalog by the value of its identifier. ## Arguments - `value` - string representing the catalog's identifier ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/catalogs/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Catalog/operation/ibexa.product_catalog.rest.catalogs.view) request: **XML** ```xml catalog_1 ``` **JSON** ```json { "CatalogQuery": { "Query": { "CatalogIdentifierCriterion": "catalog_1", } } } ``` # CatalogName Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CatalogName Search Criterion The `CatalogName` Search Criterion searches for catalogs by the value of their name. ## Arguments - `value` - string representing the catalog's name ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/catalogs/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Catalog/operation/ibexa.product_catalog.rest.catalogs.view) request: **XML** ```xml Furniture ``` **JSON** ```json { "CatalogQuery": { "Query": { "CatalogNameCriterion": "Furniture" } } } ``` # CatalogStatus Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CatalogStatus Search Criterion The `CatalogStatus` Search Criterion searches for catalogs by the value of their status. ## Arguments - `value` - string representing the catalog's status ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/catalogs/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product-Catalog/operation/ibexa.product_catalog.rest.catalogs.view) request: **XML** ```xml published ``` **JSON** ```json { "CatalogQuery": { "Query": { "CatalogStatusCriterion": "published" } } } ``` # ColorAttribute Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ColorAttribute Search Criterion The `ColorAttribute` Search Criterion searches for products by the value of their color attribute. ## Arguments - `identifier` - string representing the attribute - `value` - array of strings representing the attribute values ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml color #000000 ``` **JSON** ```json { "ProductQuery": { "Query": { "ColorAttributeCriterion": { "identifier": "color", "value": ["#000000"] }, } } } ``` # CreatedAt Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CreatedAt Search Criterion The `CreatedAt` Search Criterion searches for products based on the date when they were created. ## Arguments - `createdAt` (PHP), `created_at` (REST) - indicating the date that should be matched, provided as a `DateTimeInterface` object in PHP, or as a string acceptable by `DateTime` constructor in REST - `operator` - Operator constant (EQ, GT, GTE, LT, LTE) in PHP or its value in REST ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml 2023-06-12 >= ``` **JSON** ```json { "ProductQuery": { "Filter": { "CreatedAtCriterion": { "created_at": "2023-06-12", "operator": ">=" } } } } ``` # CreatedAtRange Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CreatedAtRange Search Criterion The `CreatedAtRange` Search Criterion searches for products based on the date range when they were created. ## Arguments - `min` - indicating the beginning of the date range, provided as a `DateTimeInterface` object - `max` - indicating the end of the date range, provided as a `DateTimeInterface` object ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml 2023-06-12 2023-06-20 ``` **JSON** ```json { "ProductQuery": { "Filter": { "CreatedAtRange": { "min": "2023-06-12", "max": "2023-06-20" } } } } ``` # FloatAttribute Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). FloatAttribute Search Criterion The `FloatAttribute` Search Criterion searches for products by the value of their float attribute. ## Arguments - `identifier` - string representing the attribute - `value` - string representing the attribute value ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml length 16.5 ``` **JSON** ```json { "ProductQuery": { "Query": { "FloatAttributeCriterion": { "identifier": "length", "value": 16.5 } } } } ``` # FloatAttributeRange Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). FloatAttributeRange Search Criterion The `FloatAttributeRange` Search Criterion searches for products by the range of values of their float attribute. ## Arguments - `identifier` - string representing the attribute - `min` - indicating the beginning of the range - `max` - indicating the end of the date range ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml length 16.5 25 ``` **JSON** ```json { "ProductQuery": { "Query": { "FloatAttributeRangeCriterion": { "identifier": "length", "min": 16.5, "max": 25 } } } } ``` # IntegerAttribute Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IntegerAttribute Search Criterion The `IntegerAttribute` Search Criterion searches for products by the value of their integer attribute. ## Arguments - `identifier` - string representing the attribute - `value` - string representing the attribute value ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml size 38 ``` **JSON** ```json { "ProductQuery": { "Query": { "IntegerAttributeCriterion": { "identifier": "size", "value": 38 } } } } ``` # IntegerAttributeRange Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IntegerAttributeRange Search Criterion The `IntegerAttributeRange` Search Criterion searches for products by the range of values of their integer attribute. ## Arguments - `identifier` - string representing the attribute - `min` - indicating the beginning of the range - `max` - indicating the end of the date range ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml length 16 25 ``` **JSON** ```json { "ProductQuery": { "Query": { "IntegerAttributeRangeCriterion": { "identifier": "length", "min": 16, "max": 25 } } } } ``` # IsVirtual Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IsVirtual Search Criterion The `IsVirtual` Search Criterion searches for virtual or physical products. ## Arguments - (optional) `isVirtual` - bool representing whether to search for virtual (default `true`) or physical (`false`) products. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml true ``` **JSON** ```json "ProductQuery": { "Filter": { "IsVirtualCriterion": true } } ``` # ProductAvailability Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductAvailability Search Criterion The `ProductAvailability` Search Criterion searches for products by the availability flag, the boolean value set per product or variant. To search for products that can be ordered, combine this Criterion with other [product search criteria](https://doc.ibexa.co/en/saas/search/criteria_reference/product_search_criteria/index.md). For more information, see [Availability and computed availability](https://doc.ibexa.co/en/saas/product_catalog/products/#availability-and-computed-availability). ## Arguments - (optional) `productAvailability` - bool representing whether the product is available (default `true`) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml false ``` **JSON** ```json { "ProductQuery": { "Filter": { "ProductAvailabilityCriterion": false } } } ``` # ProductCategory Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductCategory Search Criterion The `ProductCategory` Search Criterion searches for products by the category they're assigned to. ## Arguments - `taxonomyEntries` - array of ints representing category IDs ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml [2, 3] ``` **JSON** ```json { "ProductQuery": { "Filter": { "ProductCategoryCriterion": [ 2, 3 ] } } } ``` # ProductCode Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductCode Search Criterion The `ProductCode` Search Criterion searches for products by their codes. ## Arguments - `productCode` - array of strings representing the product codes(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml ski snowboard ``` **JSON** ```json { "ProductQuery": { "Filter": { "ProductCodeCriterion": [ "ski", "snowboard" ] } } } ``` # ProductName Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductName Search Criterion The `ProductName` Search Criterion searches for products by their names. ## Arguments - `productName` - string representing the Product name, with `*` as wildcard ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml sofa* ``` **JSON** ```json { "ProductQuery": { "Filter": { "ProductNameCriterion": "sofa*" } } } ``` # ProductType Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductType Search Criterion The `ProductType` Search Criterion searches for products by their codes. ## Arguments - `productType` - array of strings representing the product type(s) ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml desk ``` **JSON** ```json { "ProductQuery": { "Filter": { "ProductTypeCriterion": "desk" } } } ``` # SelectionAttribute Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SelectionAttribute Search Criterion The `SelectionAttribute` Search Criterion searches for products by the value of their selection attribute. ## Arguments - `identifier` - string representing the attribute - `value` - array of strings representing the attribute values ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml fabric_type [cotton] ``` **JSON** ```json { "ProductQuery": { "Query": { "SelectionAttributeCriterion": { "identifier": "fabric_type", "value": [ "cotton" ] } } } } ``` # UpdatedAt Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UpdatedAt Search Criterion The `UpdatedAt` Search Criterion searches for products based on the date when they were last updated. ## Arguments - `date` - indicating the date that should be matched, provided as a [`DateTimeInterface`](https://www.php.net/manual/en/class.datetimeinterface.php) object in PHP, or as a string acceptable by `DateTimeInterface` constructor in REST - `operator` - Operator constant (EQ, GT, GTE, LT, LTE) in PHP or its value in REST ## Operators | Operator | Value | Description | | --------------- | ----- | ------------------------------------------------------------ | | `Operator::EQ` | `=` | Matches products updated exactly on the given date (default) | | `Operator::GT` | `>` | Matches products updated after the given date | | `Operator::GTE` | `>=` | Matches products updated on or after the given date | | `Operator::LT` | `<` | Matches products updated before the given date | | `Operator::LTE` | `<=` | Matches products updated on or before the given date | ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml 2023-06-12 >= ``` **JSON** ```json { "ProductQuery": { "Filter": { "UpdatedAtCriterion": { "updated_at": "2023-06-12", "operator": ">=" } } } } ``` # UpdatedAtRange Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UpdatedAtRange Search Criterion The `UpdatedAtRange` Search Criterion searches for products based on the date range when they were last updated. ## Arguments - `min` - the start of the date range (inclusive), provided as a [`DateTimeInterface`](https://www.php.net/manual/en/class.datetimeinterface.php) object in PHP, or as a string acceptable by `DateTimeInterface` constructor in REST - `max` - the end of the date range (inclusive), provided as a [`DateTimeInterface`](https://www.php.net/manual/en/class.datetimeinterface.php) object in PHP, or as a string acceptable by `DateTimeInterface` constructor in REST At least one of `min` or `max` must be provided. ## Example You can use this Search Criterion over the REST API, in the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml 2023-06-12 2023-06-20 ``` **JSON** ```json { "ProductQuery": { "Filter": { "UpdatedAtRangeCriterion": { "min": "2023-06-12", "max": "2023-06-20" } } } } ``` # Activity Log Search Criteria reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Activity Log Search Criteria Activity Log Search Criteria filter the activity log groups returned by activity log search. You use them over the REST API, in the `criteria` element of the payload of the [`POST /activity-log-group/list`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log/operation/ibexa.activity_log.rest.activity_log_group.list.post) request. Each criterion is an object with a `type` property that selects the criterion, and its own arguments. Criteria are applied to log entry groups. For example, with the `action` criterion, you get log entry groups that have at least one entry with this action (and possibly other actions as well). For more information about the activity log itself, see [Recent activity](https://doc.ibexa.co/en/saas/administration/recent_activity/recent_activity/index.md). ## Value-based criteria | Search Criterion | Search based on | | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | | [`action`](https://doc.ibexa.co/en/saas/search/activity_log_search_reference/action_criterion/index.md) | Performed action name(s) | | [`logged_at`](https://doc.ibexa.co/en/saas/search/activity_log_search_reference/logged_at_criterion/index.md) | Before, after or at a given date and time | | [`object_class`](https://doc.ibexa.co/en/saas/search/activity_log_search_reference/object_criterion/index.md) | Manipulated object's class name, and optionally objects' IDs | | [`user`](https://doc.ibexa.co/en/saas/search/activity_log_search_reference/user_criterion/index.md) | User performing the action | ## Logical criteria | Search Criterion | Description | | ---------------- | ----------------------------------------------------------------------------------- | | `not` | Logical NOT criterion that matches if the provided criteria don't match. | | `and` | Logical AND criterion that matches if all the provided criteria match. | | `or` | Logical OR criterion that matches if at least one of the provided criteria matches. | Logical criteria take a `criteria` element with the criteria to combine: ```json { "ActivityLogGroupListInput": { "criteria": [ { "type": "or", "criteria": [ { "type": "action", "value": ["create"] }, { "type": "action", "value": ["publish"] } ] } ] } } ``` # Action Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The `action` Activity Log Criterion matches activity log groups that have a log entry with one of the given actions. ## Arguments - `value` - list of action name strings, for example `create`, `publish`, or `delete` ## Example You can use this Criterion over the REST API, in the `criteria` element of the payload of the [`POST /activity-log-group/list`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log/operation/ibexa.activity_log.rest.activity_log_group.list.post) request: ```json { "ActivityLogGroupListInput": { "criteria": [ { "type": "action", "value": ["create", "publish"] } ] } } ``` # LoggedAt Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The `logged_at` Activity Log Criterion matches activity log groups that have a log entry created before, after, or at a given date and time. ## Arguments - `value` - string that the `DateTime` constructor accepts, for example `2024-01-01 12:00:00` or `- 1 hour` - (optional) `operator` - string that represents a comparison sign, `=` by default | Comparison | Value | | --------------------- | ----- | | Equal | `=` | | Not equal | `<>` | | Less than | `<` | | Less than or equal | `<=` | | Greater than | `>` | | Greater than or equal | `>=` | ## Example You can use this Criterion over the REST API, in the `criteria` element of the payload of the [`POST /activity-log-group/list`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log/operation/ibexa.activity_log.rest.activity_log_group.list.post) request: ```json { "ActivityLogGroupListInput": { "criteria": [ { "type": "logged_at", "value": "- 1 hour", "operator": ">=" } ] } } ``` # Object Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The `object_class` Activity Log Criterion matches activity log groups that have a log entry about the given class name, and optionally one of the given IDs. ## Arguments - `class` - class of the object concerned by the searched log entries - (optional) `ids` - list of object IDs ## Example You can use this Criterion over the REST API, in the `criteria` element of the payload of the [`POST /activity-log-group/list`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log/operation/ibexa.activity_log.rest.activity_log_group.list.post) request: ```json { "ActivityLogGroupListInput": { "criteria": [ { "type": "object_class", "class": "Ibexa\\Contracts\\Core\\Repository\\Values\\Content\\Content", "ids": [72, 73] } ] } } ``` # User Criterion > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). The `user` Activity Log Criterion matches activity log groups that have an activity by one of the users given by their IDs. ## Arguments - `value` - list of user IDs ## Example You can use this Criterion over the REST API, in the `criteria` element of the payload of the [`POST /activity-log-group/list`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log/operation/ibexa.activity_log.rest.activity_log_group.list.post) request: ```json { "ActivityLogGroupListInput": { "criteria": [ { "type": "user", "value": [14] } ] } } ``` # Action Configuration search reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Search options available for Action Configuration search You search for AI action configurations over the REST API, with the [`POST /ai/actions`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Connector-AI/operation/ibexa.rest.ai.action.list.post) request. The request payload takes the following search options: | Option | Description | | ------------------------ | ------------------------------------------------------------------------------------------------------------ | | `query` | Returns action configurations with a name that starts with the given string, or with exactly this identifier | | `action_type_identifier` | Returns action configurations of the given action type, for example `alt_text_generation` | | `enabled` | Returns enabled (`true`) or disabled (`false`) action configurations | | `limit` | Maximum number of action configurations to return | | `page` | Number of the page of results to return, starting from 1 | Results are sorted by action configuration ID, in descending order. ## Example ```json { "ActionConfigurationListInput": { "query": "alt", "action_type_identifier": "alt_text_generation", "enabled": true, "limit": 10, "page": 1 } } ``` # Sort Clause reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Sort Clauses help fine-tune sorting order when searching for content and locations. Sort Clauses are the sorting options for content and location search. You use them over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request. All Sort Clauses take the sorting direction as their value, either `ascending` (default) or `descending`. ## Sort Clauses | Sort Clause | Sorting based on | Content Search | Location Search | Filtering | | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | -------------- | --------------- | --------- | | [ContentId](https://doc.ibexa.co/en/saas/search/sort_clause_reference/contentid_sort_clause/index.md) | Content items' ID | Yes | Yes | Yes | | [ContentName](https://doc.ibexa.co/en/saas/search/sort_clause_reference/contentname_sort_clause/index.md) | Content names | Yes | Yes | Yes | | [DateModified](https://doc.ibexa.co/en/saas/search/sort_clause_reference/datemodified_sort_clause/index.md) | The date when content was last modified | Yes | Yes | Yes | | [DatePublished](https://doc.ibexa.co/en/saas/search/sort_clause_reference/datepublished_sort_clause/index.md) | The date when content was created | Yes | Yes | Yes | | [Depth](https://doc.ibexa.co/en/saas/search/sort_clause_reference/depth_sort_clause/index.md) | Location depth in the content tree | | Yes | Yes | | [Field](https://doc.ibexa.co/en/saas/search/sort_clause_reference/field_sort_clause/index.md) | Content of one of content item's fields | Yes | Yes | | | [Id](https://doc.ibexa.co/en/saas/search/sort_clause_reference/id_sort_clause/index.md) | Location ID | | Yes | Yes | | [Path](https://doc.ibexa.co/en/saas/search/sort_clause_reference/path_sort_clause/index.md) | PathString of the Location | | Yes | Yes | | [Priority](https://doc.ibexa.co/en/saas/search/sort_clause_reference/priority_sort_clause/index.md) | Location priority | | Yes | Yes | | [Score](https://doc.ibexa.co/en/saas/search/sort_clause_reference/score_sort_clause/index.md) | Score of the search result | Yes | Yes | | | [SectionIdentifier](https://doc.ibexa.co/en/saas/search/sort_clause_reference/sectionidentifier_sort_clause/index.md) | ID of the Section content is assigned to | Yes | Yes | Yes | | [SectionName](https://doc.ibexa.co/en/saas/search/sort_clause_reference/sectionname_sort_clause/index.md) | Name of the Section content is assigned to | Yes | Yes | Yes | # ContentId Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentId Sort Clause The `ContentId` Sort Clause sorts search results by the content items' IDs. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "ContentId": "ascending" } } ``` # ContentName Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentName Sort Clause The `ContentName` Sort Clause sorts search results by the content items' names. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "ContentName": "ascending" } } ``` # DateModified Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). DateModified Sort Clause The `DateModified` Sort Clause sorts search results by the date and time of the last modification of a content item. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "DateModified": "ascending" } } ``` # DatePublished Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). DatePublished Sort Clause The `DatePublished` Sort Clause sorts search results by the date and time of the first publication of a content item. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "DatePublished": "ascending" } } ``` # Depth Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Depth Sort Clause The `Location\Depth` Sort Clause sorts search results by the depth of the location in the content tree. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example In the REST API, this Sort Clause is called `LocationDepth`. Use it in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "LocationDepth": "ascending" } } ``` # Field Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Field Sort Clause The `Field` Sort Clause sorts search results by the value of one of the content items' fields. Search results of the provided content type are sorted in field value order. Results of the query that don't belong to the content type are ranked lower. ## Arguments - `typeIdentifier` - string representing the identifier of the content type to which the field belongs - `fieldIdentifier` - string representing the identifier of the field to sort by - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "SortClauses": { "Field": { "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "title", "direction": "ascending" } } } ``` # Id Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Id Sort Clause The `Location\Id` Sort Clause sorts search results by the ID of the location. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example In the REST API, this Sort Clause is called `LocationId`. Use it in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "LocationId": "ascending" } } ``` # Path Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Path Sort Clause The `Location\Path` Sort Clause sorts search results by the pathString of the location. > **Note: Note** > > The `Location/Path` Sort Clause uses dictionary sorting. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example In the REST API, this Sort Clause is called `LocationPath`. Use it in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "LocationPath": "ascending" } } ``` # Priority Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Priority Sort Clause The `Location\Priority` Sort Clause sorts search results by the priority of the location. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example In the REST API, this Sort Clause is called `LocationPriority`. Use it in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "LocationPriority": "ascending" } } ``` # Score Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Score Sort Clause The `Score` Sort Clause orders search results by their score. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "Score": "ascending" } } ``` # SectionIdentifier Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SectionIdentifier Sort Clause The `SectionIdentifier` Sort Clause sorts search results by the Section IDs of the content items. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` > **Note: Note** > > This Sort Clause uses the `descending` sort direction by default. ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "SectionIdentifier": "ascending" } } ``` # SectionName Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SectionName Sort Clause The `SectionName` Sort Clause sorts search results by the Section name of the content items. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: **XML** ```xml ascending ``` **JSON** ```json "Query": { "SortClauses": { "SectionName": "ascending" } } ``` # Content Type Search Sort Clauses > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Content Type Search Sort Clauses Content Type Search Sort Clauses are the sorting options for content types. You use them over the REST API, in the `SortClauses` element of the payload of the [`POST /content/types/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Type/operation/ibexa.rest.content_types.view) request. Each Sort Clause takes the `ascending` or `descending` direction. | Name | Description | | ---------- | --------------------------------- | | Id | Sort by content type's ID | | Identifier | Sort by content type's identifier | ## Example ```json { "ViewInput": { "identifier": "ContentTypeView", "ContentTypeQuery": { "Query": { "ContentTypeGroupIdCriterion": 1 }, "SortClauses": { "Identifier": "ascending" } } } } ``` # Product Sort Clauses > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Product Sort Clauses Product Sort Clauses set the order of the products returned by product search. You use them over the REST API, in the `SortClauses` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request. Each Sort Clause takes the sorting direction as its value, either `ascending` or `descending`. To sort products coming from Quable, see [Quable](https://doc.ibexa.co/en/saas/product_catalog/quable/quable/index.md) for details about the add-on. | Sort Clause | Sorting based on | Local product catalog | Quable | | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | --------------------- | ------ | | [CreatedAt](https://doc.ibexa.co/en/saas/search/sort_clause_reference/createdat_sort_clause/index.md) | Date and time of the creation of a product | Yes | Yes | | [ProductAvailability](https://doc.ibexa.co/en/saas/search/sort_clause_reference/productavailability_sort_clause/index.md) | Product's availability | Yes | | | [ProductCode](https://doc.ibexa.co/en/saas/search/sort_clause_reference/productcode_sort_clause/index.md) | Product's code | Yes | Yes | | [ProductName](https://doc.ibexa.co/en/saas/search/sort_clause_reference/productname_sort_clause/index.md) | Product's name | Yes | Yes | # CreatedAt Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CreatedAt Sort Clause The `CreatedAt` Sort Clause sorts search results by the date and time of the creation of a product. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml ascending ``` **JSON** ```json "ProductQuery": { "SortClauses": { "CreatedAt": "ascending" } } ``` # ProductAvailability Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductAvailability Sort Clause The `ProductAvailability` Sort Clause sorts search results by whether they have availability or not. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml ascending ``` **JSON** ```json "ProductQuery": { "SortClauses": { "ProductAvailability": "ascending" } } ``` # ProductCode Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductCode Sort Clause The `ProductCode` Sort Clause sorts search results by the product code. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml ascending ``` **JSON** ```json "ProductQuery": { "SortClauses": { "ProductCode": "ascending" } } ``` # ProductName Sort Clause > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductName Sort Clause The `ProductName` Sort Clause sorts search results by the Product code. ## Arguments - (optional) sorting direction, either `ascending` (default) or `descending` ## Example You can use this Sort Clause over the REST API, in the `SortClauses` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: **XML** ```xml ascending ``` **JSON** ```json "ProductQuery": { "SortClauses": { "ProductName": "ascending" } } ``` # Activity Log Search Sort Clauses reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Activity Log Search Sort Clauses set the order of the activity log groups returned by activity log search. You use them over the REST API, in the `sortClauses` element of the payload of the [`POST /activity-log-group/list`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Activity-Log/operation/ibexa.activity_log.rest.activity_log_group.list.post) request. - `logged_at` - sorts activity log groups by their date and time. Takes an optional `direction` argument, either `ASC` or `DESC` (default). ## Example ```json { "ActivityLogGroupListInput": { "sortClauses": [ { "type": "logged_at", "direction": "DESC" } ] } } ``` # Aggregation reference > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Aggregations help fine-tune search for content and Locations by grouping results into categories. Aggregation is used to group search results into categories. You use aggregations over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request for content and location search, or of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request for product search. The `Aggregations` element takes a list of objects, each of them named after the aggregation to run. Product search runs as a content search that is limited to products, so you can also use content aggregations with product search. Product aggregations, on the other hand, only produce results for products. There are three types of aggregations: - Term aggregations group by value and count object in each group - Range aggregations count values in specified ranges - Stats aggregations compute stats over numeric fields: minimum, average and maximum value, count, and sum of values ## Content aggregations | Name | Type | Based on | | -------------------------------------------------------------------------------------------------------------------------------------- | ----- | ------------------------------------- | | [ContentTypeTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/contenttypeterm_aggregation/index.md) | Term | Content type | | [ContentTypeGroupTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/contenttypegroupterm_aggregation/index.md) | Term | Content type group | | [DateMetadataRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/datemetadatarange_aggregation/index.md) | Range | Date metadata | | [LanguageTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/languageterm_aggregation/index.md) | Term | Content language | | [LocationChildrenTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/locationchildrenterm_aggregation/index.md) | Term | Children on a Location | | [ObjectStateTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/objectstateterm_aggregation/index.md) | Term | Object state | | [RawRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/rawrange_aggregation/index.md) | Range | Search index field | | [RawStatsAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/rawstats_aggregation/index.md) | Stats | Search index field | | [RawTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/rawterm_aggregation/index.md) | Term | Search index field | | [SectionTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/sectionterm_aggregation/index.md) | Term | Section | | [SubtreeTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/subtreeterm_aggregation/index.md) | Term | Location subtree path | | [UserMetadataTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/usermetadataterm_aggregation/index.md) | Term | Content owner/owner group or modifier | | [VisibilityTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/visibilityterm_aggregation/index.md) | Term | Content/Location visibility | ## Field aggregations | Name | Type | Based on field | | ------------------------------------------------------------------------------------------------------------------------ | ----- | ---------------------------------------------------------------------------------------------------------------------- | | [AuthorTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/authorterm_aggregation/index.md) | Term | [Author](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/authorfield/index.md) | | [CheckboxTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/checkboxterm_aggregation/index.md) | Term | [Checkbox](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/checkboxfield/index.md) | | [CountryTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/countryterm_aggregation/index.md) | Term | [Country](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/countryfield/index.md) | | [DateRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/daterange_aggregation/index.md) | Range | [Date](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/datefield/index.md) | | [DateTimeRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/datetimerange_aggregation/index.md) | Range | [DateTime](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/dateandtimefield/index.md) | | [FloatRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/floatrange_aggregation/index.md) | Range | [Float](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/floatfield/index.md) | | [FloatStatsAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/floatstats_aggregation/index.md) | Stats | [Float](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/floatfield/index.md) | | [IntegerRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/integerrange_aggregation/index.md) | Range | [Integer](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/integerfield/index.md) | | [IntegerStatsAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/integerstats_aggregation/index.md) | Stats | [Integer](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/integerfield/index.md) | | [KeywordTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/keywordterm_aggregation/index.md) | Term | [Keyword](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/keywordfield/index.md) | | [SelectionTermAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/selectionterm_aggregation/index.md) | Term | [Selection](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/selectionfield/index.md) | | [TimeRangeAggregation](https://doc.ibexa.co/en/saas/search/aggregation_reference/timerange_aggregation/index.md) | Range | [Time](https://doc.ibexa.co/en/saas/content_management/field_types/field_type_reference/timefield/index.md) | ## Product aggregations | Name | Type | Based on | | --------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------ | | [Product attribute](https://doc.ibexa.co/en/saas/search/aggregation_reference/product_attribute_aggregations/index.md) | Term / Range | Product attribute values | | [ProductAvailabilityTerm](https://doc.ibexa.co/en/saas/search/aggregation_reference/productavailabilityterm_aggregation/index.md) | Term | Product availability | | [ProductStockRange](https://doc.ibexa.co/en/saas/search/aggregation_reference/productstockrange_aggregation/index.md) | Range | Product stock | | [ProductPriceRange](https://doc.ibexa.co/en/saas/search/aggregation_reference/productpricerange_aggregation/index.md) | Range | Product price | | [ProductTypeTerm](https://doc.ibexa.co/en/saas/search/aggregation_reference/producttypeterm_aggregation/index.md) | Term | Product type | # ContentTypeTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentTypeTermAggregation The ContentTypeTermAggregation aggregates search results by the content item's content type. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "ContentTypeTermAggregation": { "name": "content_types" } } ] } ``` # ContentTypeGroupTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ContentTypeGroupTermAggregation The ContentTypeGroupTermAggregation aggregates search results by the content item's content type group. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "ContentTypeGroupTermAggregation": { "name": "content_type_groups" } } ] } ``` # DateMetadataRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). DateMetadataRangeAggregation The DateMetadataRangeAggregation aggregates search results by the value of the content items' date metadata. ## Arguments - `name` - name of the Aggregation object - `type` - string representing the type of the Aggregation (`MODIFIED` or `PUBLISHED`) - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "DateMetadataRangeAggregation": { "name": "modification_date", "type": "modified", "ranges": [ { "from": null, "to": "2024-01-01T00:00:00+00:00" }, { "from": "2024-01-01T00:00:00+00:00", "to": null } ] } } ] } ``` # LanguageTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LanguageTermAggregation The LanguageTermAggregation aggregates search results by the content item's language. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "LanguageTermAggregation": { "name": "languages" } } ] } ``` # LocationChildrenTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). LocationChildrenTermAggregation The LocationChildrenTermAggregation aggregates search results by the number of children of a location. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "LocationChildrenTermAggregation": { "name": "children" } } ] } ``` # ObjectStateTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ObjectStateTermAggregation The ObjectStateTermAggregation aggregates search results by the content item's object state. ## Arguments - `name` - name of the Aggregation object - `objectStateGroupIdentifier` - string representing the identifier of the object state group to aggregate results by ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "ObjectStateTermAggregation": { "name": "object_states", "objectStateGroupIdentifier": "ibexa_lock" } } ] } ``` # RawRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). RawRangeAggregation The RawRangeAggregation aggregates search results by the value of the selected search index field. ## Arguments - `name` - name of the Aggregation object - `field` - string representing the search index field - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "RawRangeAggregation": { "name": "raw_ranges", "fieldName": "content_version_no_i", "ranges": [ { "from": null, "to": 5 }, { "from": 5, "to": null } ] } } ] } ``` ## Limitations > **Caution: Caution** > > The `RawRangeAggregation` Aggregation relies on raw search index field names, which are internal and can change. Don't use it in production code. Valid use cases are: testing, or temporary (one-off) tools. # RawStatsAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). RawStatsAggregation The RawStatsAggregation aggregates search results by the value of the selected search index field and provides statistical information for the values. You can use the provided getters to access the values: - sum (`getSum()`) - count of values (`getCount()`) - minimum value (`getMin()`) - maximum value (`getMax()`) - average (`getAvg()`) ## Arguments - `name` - name of the Aggregation object - `field` - string representing the search index field ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "RawStatsAggregation": { "name": "raw_stats", "fieldName": "content_version_no_i" } } ] } ``` ## Limitations > **Caution: Caution** > > The `RawStatsAggregation` Aggregation relies on raw search index field names, which are internal and can change. Don't use it in production code. Valid use cases are: testing, or temporary (one-off) tools. # RawTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). RawTermAggregation The RawTermAggregation aggregates search results by the value of the selected search index field. ## Arguments - `name` - name of the Aggregation object - `field` - string representing the search index field ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "RawTermAggregation": { "name": "raw_terms", "fieldName": "content_type_identifier_id" } } ] } ``` ## Limitations > **Caution: Caution** > > The `RawTermAggregation` Aggregation relies on raw search index field names, which are internal and can change. Don't use it in production code. Valid use cases are: testing, or temporary (one-off) tools. # SectionTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SectionTermAggregation The SectionTermAggregation aggregates search results by the content item's section. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "SectionTermAggregation": { "name": "sections" } } ] } ``` # SubtreeTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SubtreeTermAggregation The SubtreeTermAggregation aggregates search results by the location's subtree path. ## Arguments - `name` - name of the Aggregation object - `pathString` - string representing the pathstring to aggregate results by ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "SubtreeTermAggregation": { "name": "subtrees", "pathString": "/1/2/" } } ] } ``` # UserMetadataTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). UserMetadataTermAggregation The UserMetadataTermAggregation aggregates search results by the User content item's metadata. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "UserMetadataTermAggregation": { "name": "owners", "type": "owner" } } ] } ``` # VisibilityTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). VisibilityTermAggregation The VisibilityTermAggregation aggregates search results by the content item's visibility. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "VisibilityTermAggregation": { "name": "visibility" } } ] } ``` # AuthorTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). AuthorTermAggregation The field-based AuthorTermAggregation aggregates search results by the value of the Author field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "AuthorTermAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "authors" } } ] } ``` # CheckboxTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CheckboxTermAggregation The field-based CheckboxTermAggregation aggregates search results by the value of the Checkbox field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "CheckboxTermAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "featured" } } ] } ``` # CountryTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). CountryTermAggregation The field-based CountryTermAggregation aggregates search results by the value of the Country field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "CountryTermAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "country" } } ] } ``` # DateRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). DateRangeAggregation The field-based DateRangeAggregation aggregates search results by the value of the Date, DateTime, or Time field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "DateRangeAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "publication_date", "ranges": [ { "from": null, "to": "2024-01-01T00:00:00+00:00" }, { "from": "2024-01-01T00:00:00+00:00", "to": null } ] } } ] } ``` # DateTimeRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). DateTimeRangeAggregation The field-based DateTimeRangeAggregation aggregates search results by the value of the Date, DateTime, or Time field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "DateTimeRangeAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "event", "fieldDefinitionIdentifier": "start_date", "ranges": [ { "from": null, "to": "2024-01-01T00:00:00+00:00" }, { "from": "2024-01-01T00:00:00+00:00", "to": null } ] } } ] } ``` # FloatRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). FloatRangeAggregation The field-based FloatRangeAggregation aggregates search results by the value of the Float field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "FloatRangeAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "rating", "ranges": [ { "from": null, "to": 2.5 }, { "from": 2.5, "to": 5 } ] } } ] } ``` # FloatStatsAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). FloatStatsAggregation The field-based FloatStatsAggregation aggregates search results by the value of the Float field and provides statistical information for the values. You can use the provided getters to access the values: - sum (`getSum()`) - count of values (`getCount()`) - minimum value (`getMin()`) - maximum value (`getMax()`) - average (`getAvg()`) ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "FloatStatsAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "rating" } } ] } ``` # IntegerRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IntegerRangeAggregation The field-based IntegerRangeAggregation aggregates search results by the value of the Integer field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "IntegerRangeAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "views", "ranges": [ { "from": null, "to": 100 }, { "from": 100, "to": null } ] } } ] } ``` # IntegerStatsAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). IntegerStatsAggregation The field-based IntegerStatsAggregation aggregates search results by the value of the Integer field and provides statistical information for the values. You can use the provided getters to access the values: - sum (`getSum()`) - count of values (`getCount()`) - minimum value (`getMin()`) - maximum value (`getMax()`) - average (`getAvg()`) ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "IntegerStatsAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "views" } } ] } ``` # KeywordTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). KeywordTermAggregation The field-based KeywordTermAggregation aggregates search results by the value of the Keyword field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "KeywordTermAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "tags" } } ] } ``` # SelectionTermAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). SelectionTermAggregation The field-based SelectionTermAggregation aggregates search results by the value of the Selection field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "SelectionTermAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "article", "fieldDefinitionIdentifier": "categories" } } ] } ``` # TimeRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). TimeRangeAggregation The field-based TimeRangeAggregation aggregates search results by the value of the Date, DateTime, or Time field. ## Arguments - `name` - name of the Aggregation - `contentTypeIdentifier` - string representing the content type identifier - `fieldDefinitionIdentifier` - string representing the Field Definition identifier - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /views`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Views/operation/ibexa.rest.views.create) request: ```json "Query": { "Aggregations": [ { "TimeRangeAggregation": { "name": "aggregation_name", "contentTypeIdentifier": "event", "fieldDefinitionIdentifier": "start_time", "ranges": [ { "from": 0, "to": 43200 }, { "from": 43200, "to": 86400 } ] } } ] } ``` # Product attribute aggregations > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Product attribute aggregations aggregate search results by the value of the product's attributes. Product attribute aggregations aggregate search results by the value of the product's attributes. You use them over the REST API, in the `Aggregations` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request. Depending on the attribute type, the following aggregations are available: | Name | Type | Based on attribute type | | ------------------------ | ----- | ----------------------- | | `AttributeBooleanTerm` | Term | Checkbox | | `AttributeColorTerm` | Term | Color | | `AttributeFloatRange` | Range | Float | | `AttributeFloatStats` | Stats | Float | | `AttributeIntegerRange` | Range | Integer | | `AttributeIntegerStats` | Stats | Integer | | `AttributeSelectionTerm` | Term | Selection | ## Arguments - `name` - name of the Aggregation - `attributeDefinitionIdentifier` - identifier of the attribute Range aggregations (`AttributeFloatRange` and `AttributeIntegerRange`) additionally take: - `ranges` - array of ranges that define the borders of the specific range sets ## Example ```json "ProductQuery": { "Aggregations": [ { "AttributeSelectionTerm": { "name": "size", "attributeDefinitionIdentifier": "size" } }, { "AttributeIntegerRange": { "name": "length", "attributeDefinitionIdentifier": "length", "ranges": [ { "from": null, "to": 100 }, { "from": 100, "to": null } ] } } ] } ``` # ProductAvailabilityTerm > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductAvailabilityTerm The ProductAvailabilityTermAggregation aggregates search results by product availability (available/unavailable). ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: ```json "ProductQuery": { "Aggregations": [ { "ProductAvailabilityTerm": { "name": "availability" } } ] } ``` # ProductStockRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductStockRangeAggregation The ProductStockRangeAggregation aggregates search results by products' numerical stock. ## Arguments - `name` - name of the Aggregation - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: ```json "ProductQuery": { "Aggregations": [ { "ProductStockRange": { "name": "stock", "ranges": [ { "from": 0, "to": 10 }, { "from": 10, "to": null } ] } } ] } ``` # ProductPriceRangeAggregation > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductPriceRangeAggregation The ProductPriceRangeAggregation aggregates search results by the value of the product's price. ## Arguments - `name` - name of the Aggregation - `currencyCode` - currency code of the price - `ranges` - array of Range objects that define the borders of the specific range sets ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: ```json "ProductQuery": { "Aggregations": [ { "ProductPriceRange": { "name": "price", "currencyCode": "EUR", "ranges": [ { "from": 0, "to": 100 }, { "from": 100, "to": null } ] } } ] } ``` # ProductTypeTerm > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). ProductTypeTerm The ProductTypeTermAggregation aggregates search results by the product type. ## Arguments - `name` - name of the Aggregation object ## Example You can use this Aggregation over the REST API, in the `Aggregations` element of the payload of the [`POST /product/catalog/products/view`](https://doc.ibexa.co/en/saas/api/rest_api/rest_api_reference/rest_api_reference.html#tag/Product/operation/ibexa.product_catalog.rest.products.view) request: ```json "ProductQuery": { "Aggregations": [ { "ProductTypeTerm": { "name": "product_types" } } ] } ``` # Security # Security checklist > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Ensure that your Cohesivo installation is secure by following our set of recommendations. When getting ready to go live with your project for the first time, or when re-launching it, make sure that your setup is secure. > **Caution: Caution** > > Security is an ongoing process. After going live, you should pay attention to Ibexa security advisories released via [your Service portal](https://support.ibexa.co/), or via [Security advisories](https://developers.ibexa.co/security-advisories) if you're not a subscriber. ## Cohesivo ### Carefully select admin users Make sure Admin users and other privileged users who have access to System Information and setup in the back end are vetted and fully trustworthy. As administrator, you have access to full information about the system through the `setup/system_info` policy, and also to user data, role editing, and many other critical aspects. The users in your organization who have backend access must be kept up-to-date. Any user leaving the organization must be disabled without delay. If a user takes on a new role in the organization, any required role changes for them in Cohesivo must also be made as soon as possible. ### Strong passwords Enforce strong passwords for all users. This is specially important for admin accounts and other privileged users. - Never go online with admin password set to `publish` or any other default value. - Introduce password quality checks. Make sure the checks are strict enough (length/complexity). - 16 characters is a quite secure minimum length. Don't go below 10. - If using Cohesivo v4.5 or newer, enable the password rule that rejects any password which has been exposed in a public breach. > **Tip: Password rules** > > See [setting up password rules](https://doc.ibexa.co/en/saas/users/passwords/#password-rules). ### Use secure roles and policies Use the following checklist to ensure the roles and policies are secure: - Do roles restrict read/write access to content as they should? Is read/write access to personal data, like User content items, properly restricted? - Are the roles and their use properly differentiated and restricted? Is an editor role used for everyday editorial work? - Is the admin role used only for high-level administrative work? Is the number of people with admin access properly restricted and vetted? - Should people be allowed to create new user accounts themselves? Should such accounts be enabled by default, or require vetting by admins? - Is the role of self-created new users restricted as intended? - Is there a clear role separation between the organisation's internal and external users? - Is access to user data properly restricted, in accordance with GDPR? - Is access to Form Builder uploads managed properly? Files uploaded with the Form Builder are accessible to any user by default. If this doesn't suit you, restrict access to the Form Uploads folder. ### Don't use "hide" for read access restriction The [visibility switcher](https://doc.ibexa.co/en/saas/content_management/locations/#location-visibility) acts as a flag. You can choose to respect it or ignore it in your code. It isn't permission-based, and doesn't restrict read access to content. Hidden content can be read through the REST API. If you need to restrict read access to a given content item, you could create a role that grants read access for a given [**Section**](https://doc.ibexa.co/en/saas/administration/content_organization/sections/index.md) or [**Object State**](https://doc.ibexa.co/en/saas/administration/content_organization/object_states/index.md), and set a different section or object State for the given content. Or use other permission-based [**Limitations**](https://doc.ibexa.co/en/saas/permissions/limitations/index.md). ### Minimize exposure Security should be a multi-layered exercise. It's wise to minimize what features you make available to the world, even if there are no known or suspected vulnerabilities in those features, and even if your content is properly protected by roles and policies. Reduce your attack surface by exposing only what you must. ### Limit access to Code blocks The [Code block](https://doc.ibexa.co/projects/userguide/en/saas/content_management/block_reference/#code-block) in Page Builder is designed to accept any HTML, which includes embedded JavaScript. This means that editors who have access to Code blocks could add malicious JS including [cross site scripting (XSS)](https://en.wikipedia.org/wiki/Cross-site_scripting). As site administrator, be aware of this when giving editors access to the Page Builder features, and limit that access only to trusted editors. You can [limit access to specific blocks per content type](https://doc.ibexa.co/projects/userguide/en/saas/content_management/configure_ct_field_settings/#default-configuration-of-pages) by defining which page blocks are available to editors. ## Security headers There are a number of security related HTTP response headers that you can use to improve your security. Headers must be adapted to the site in question, and in most cases it's site owner's responsibility. You most likely need to vary the security headers based on the SiteAccess in question and site implementation details, such as frontend code and libraries used. - `Strict-Transport-Security` - ensures that all requests are sent over HTTPS, with no fallback to HTTP. All production sites should use HTTPS and this header unless they have particular needs. This header is less important during development provided that the site is on an internal, protected network. - `X-Frame-Options` - ensures that the site isn't embedded in a frame by a compliant browser. Set the header to `SAMEORIGIN` to allow embedding by your own site, or `DENY` to block framing completely. - `X-Content-Type-Options` - prevents the browser from second-guessing the mime-type of delivered content. This header is less important if users cannot upload content and/or you trust your editors. However, it's safer to use it at all times. Make sure that the `Content-Type` header is also correctly set, including for the top-level document, to avoid issues with HTML documents being downloaded while they should be rendered. - `Content-Security-Policy` - blocks cross site scripting (XSS) attacks by setting an allowlist (whitelist) of resources to be loaded for a given page. You can set separate lists for scripts, images, fonts, and more. For experimentation and testing, you can use `Content-Security-Policy-Report-Only` before activating the actual policy. - `Referrer-Policy` - limits what information is sent from the previous page or site when navigating to a new page or site. This header has several directives for fine-tuning the referrer information. - `Permissions-Policy` - limits what features the browser can use, such as fullscreen, notifications, location, camera, or microphone. For example, if someone succeeds in injecting their JavaScript into your site, this header prevents them from using those features to attack your users. ## Domain ### Enable Domain Name System Security Extensions (DNSSEC) DNSSEC is a DNS feature that authenticates responses to DNS requests. It protects against DNS poisoning attacks, which is when an attacker manipulates the responses to DNS requests with the goal of directing users to an IP address the attacker controls. Enabling DNSSEC involves creating the DNSSEC records in your domain, activating DNSSEC with your domain registrar, and enabling DNSSEC signature validation on all DNS servers. [Read more on DNSSEC on ICANN's website](https://www.icann.org/resources/pages/dnssec-what-is-it-why-important-2019-03-05-en). ### Enable domain update/delete protection Domain update/delete protection is a DNS setting that makes it harder for an attacker to take over a domain from the real owner, or hinder availability for users. You can enable this protection at your domain registrar's site. Log in to their site to enable these protection settings and save the new configuration. ### Enable Certificate Authority Authorization (CAA) CAA allows domain owners to specify which Certificate Authorities (CAs) are permitted to issue SSL/TLS certificates for their domain. This prevents attackers from having certificates issued for domains they don't own, hindering some types of attack. CAA is configured in your DNS zone file. # Reporting security issues in Ibexa products > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Learn how to report security issues in Cohesivo. The security of Ibexa software is a primary concern and is taken seriously. For more information on security in Ibexa products, see [Ibexa Security Policy](https://www.ibexa.co/software-information/security). No engineering team is perfect though, and if you do discover a security issue in one of our products we are very grateful for your help in reporting it to us privately, and refraining from public disclosure until we have found the solution and distributed it. Thank you! ## Channels - If you're a customer or partner, please log in to your Service portal at , click "New Ticket", and report the issue as you would report a normal support request. Ibexa Product Support will respond, take care of the report, and keep you informed of the developments. - It's also possible to report security issues by email to [security@ibexa.co](mailto:security@ibexa.co) - this requires no account. ## Verbosity Please be verbose when reporting issues. The issue will be solved faster if you include: - A **title** describing the gist of the issue in one sentence - A **description** which includes the steps you take to produce the problem, what you expect the result to be, and what actually happens. - Make it clear **why you consider it a security issue**. If you know, also include its type of security issue (example: SQL injection, CSRF, Role/Policy failure), its nature (example: slowing/stopping a web site, leaking sensitive information, destroying data, privilege escalation), and how easy it is to exploit (example: Does it require editor login?). ## Dialogue The engineering team may need your help to clarify certain specifics, so please respond to such inquiries. We keep you updated about the progress on our end and may invite you as collaborators on GitHub to make communication easier. ## Responsible disclosure Please give the engineering team time to produce and distribute a solution before you disclose the issue on other channels, if you plan to do so. Please discuss the specifics with the team. ## Attribution If you want, we can include your name and/or the name of your organisation, a link, and short description about you in the security notification we send out with the fix. Thank you! # Product guides # Product guides > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Discover various Cohesivo features. Cohesivo comes with a variety of features. Discover the primary ones with the help of product guides. Condensed content allows you to quickly learn about their capabilities and benefits. - [User management product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/users/user_management_guide/): Find out what's user management and check what functions Cohesivo offers in this area to effectively manage the digital ecosystem. - [Content management product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/content_management_guide/): Read the content management product guide and learn how to create, modify, and display information to the target audience. - [Online Editor product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/rich_text/online_editor_guide/): Learn how to use the Online Editor, a tool that allows you to edit RichText Fields in any content item in Cohesivo. - [Page Builder product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/pages/page_builder_guide/): Read about the Page Builder - a powerful tool for creating and modifying pages in Cohesivo. - [Form Builder product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/content_management/forms/form_builder_guide/): See the Form Builder product guide and learn how to create various forms to increase the functionality of your website. - [Customer Portal](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/customer_management/customer_portal/): Customer Portal allows your business clients to create and manage their company accounts. - [Product catalog guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/product_catalog_guide/): The product catalog guide provides a full description of the features and capabilities for managing products, their specifications, variants, pricing, and organization. - [Quable product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/product_catalog/quable/quable_guide/): The Quable product guide describes how you can use the product data from Quable in Cohesivo to create marketing campaigns built around your products. - [Raptor CDP product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/raptor_cdp/raptor_cdp_guide/): The Raptor CDP product guide describes all the possibilities that the Customer Data Platform offers to help you build great customer experiences. - [Raptor integration product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/recommendations/raptor_integration/raptor_connector_guide/): Discover Raptor integration - an add-on focused on recommendations and tracking customer behaviors. - [AI Actions product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/ai_actions/ai_actions_guide/): AI Actions help editors by automating repetitive tasks. - [MCP Servers product guide](https://ez-systems-developer-documentation--3409.com.readthedocs.build/en/3409/ai/mcp/mcp_guide/): MCP servers expose tools, specialized prompts, and resources to AI agents. # Release notes # Cohesivo release notes > For the complete documentation index, see [llms.txt](https://doc.ibexa.co/en/saas/llms.txt). Cohesivo release notes list the new features and improvements delivered to the platform. ## TODO: Release notes for SaaS (New feature) Release date: 2026-07-01 ### Highlights - ASD - QWE