The Project Data Model (PDM) lets you define reusable data types at the project level. These data types propagate to the process data models, ensuring data consistency across your FlowX.AI applications, including in Reusable Functions, Persistence Layer schemas, and other components.With PDM, you create a centralized data structure that serves as the foundation for all processes within your project. This ensures that core data types like Customer, Product, or Document maintain consistent definitions throughout your application.
FlowX.AI supports several data model layers, each serving different purposes:
Data Model Layer
Description
Process Data Model
Can use data types defined in the Project Data Model or Library Data Model.
Project Data Model (PDM)
Defines data types that can be reused across processes and other resources within the project
Library Data Model
Defined within a library. Allows data types to be reused across multiple projects, promoting standardization.
A data type defines the structure of a particular set of data. For example, a Customer data type might contain attributes like name, email, and address.An attribute is an individual property of a data type that specifies its data structure.Data types and attributes can be categorized based on their usage:
Used/Unused: A data type or attribute is considered “used” when it’s incorporated into the structure of another data type.
Referenced/Unreferenced: Refers to data types or attributes from the Project Data Model being used within a Process Data Model or a UI Template.
In the Project Data Model view, click + to add a new data type. A confirmation toast notifies you when the data type is created.
2
Name the data type
Provide a name for the data type.
3
Add attributes
Each data type displays an Add attribute button for creating the first attribute. After the first attribute exists, the button appears only on hover over the data type.When you select an attribute, a settings side panel opens on the right where you can configure:
Attribute name and type (string, number, boolean, object, array, enum)
Validations, sensitive data, and reporting settings
You can attach validation rules to a data model attribute so that the values held by that attribute follow the constraints you define. Validators are set per attribute from the attribute settings side panel, and they travel with the data model wherever it is used, including process data models, reusable functions, and reusable UI templates.
These validators are defined on the data model attribute itself. They are different from the UI Designer validators, which are configured on individual form components inside a UI template.
Enter the value the validator checks against. Required field and Email Format take no value; every other validator type takes one. For a date attribute, the Min Date and Max Date values are picked from a date picker.
5
Save the validator
Save the validator. It appears in the Validations list for the attribute. Changes to the data model are saved automatically.
You can add at most one validator of each type to an attribute. A type that is already applied no longer appears in the validator list.
The validator types offered depend on the attribute’s type. Required field is available for every type.
Attribute type
Available validators
String
Required field, Min Length, Max Length, Pattern, Email Format
Number
Required field, Min Value, Max Value
Boolean
Required field
Date
Required field, Min Date, Max Date
Enum
Required field
Array
Required field, Min Items, Max Items
Object
Required field
Currency
Required field, Min Amount Value, Max Amount Value, Min Code Length, Max Code Length, Code Pattern (regex)
For a currency attribute, the Min Amount Value and Max Amount Value validators apply to the amount, while Min Code Length, Max Code Length, and Code Pattern (regex) apply to the currency code.
Requires the attribute to hold a value. Takes no value of its own.
Min Length / Max Length
Sets the minimum or maximum number of characters for a string value. For a currency attribute these apply to the currency code and are labeled Min Code Length and Max Code Length. The configured limit is shown as a number of characters, for example 3 characters.
Min Value / Max Value
Sets the lower or upper bound for a numeric value. For a date attribute these are labeled Min Date and Max Date and the bound is entered as a date. For a currency attribute these are labeled Min Amount Value and Max Amount Value and the bound is displayed together with the attribute’s currency code, for example 100 EUR.
Pattern
Checks a string value against a regular expression. For a currency attribute this is labeled Code Pattern (regex) and validates the currency code.
Email Format
Checks that a string value is a valid email address. Takes no value of its own.
Min Items / Max Items
Sets the minimum or maximum number of items for an array attribute.
When you change an attribute’s type, every validator except Required field is removed automatically, because the other validators may no longer apply to the new type. Re-add the validators you need after changing the type.
Each attribute displays a path button next to its name. Click it to view the full key path and copy it to your clipboard. This is useful when referencing keys in business rules, UI component bindings, or integration mappings.
Changes to data types propagate to all processes referencing them. If a process is using this data type, it will automatically get the updated structure.
However, changes do NOT propagate to UI Designer paths, which will need to be adjusted manually.
You can either delete an entire object or just a single attribute.
2
Click remove
Click the remove button.
3
Confirm deletion
You can delete the data type even if it’s in use. The system will show you a warning message indicating which processes reference the data type.
If the data type is in use by processes, you will receive a warning message showing which processes reference it. You can still proceed with the deletion, but this may affect the referenced processes.
Show Current limitations of the Project Data Model
Custom Data Types from the Project or Library Data Model level cannot be modified at the resource level.
Removing or changing Data Types in use may break resources using it.
Project Data Model becomes read-only after version commitment. This is available for any configuration on commited versions; it applies also for resources data models.
Library builds with breaking changes to Data Types require usage review.
Data Types defined at the Project or Library level can be referenced in the data models of Processes, Reusable Functions, and Reusable UI Templates.
Learn attribute types, JSON format, and data modeling fundamentals
Handle Dynamic Data course
Configure dynamic dropdowns and data-driven UI from process data
Academy playground — explore the DataModel101 project for hands-on data modeling examples.
Last modified on October 30, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"FlowX.AI","description":"Comprehensive documentation for FlowX.AI, the AI-driven process automation platform.","colors":{"primary":"#fcb813","light":"#fcb813","dark":"#fcb813"},"logo":{"light":"https://mintcdn.com/flowxai/38fXEM0a7v86Lg2m/logo/light.png?fit=max\u0026auto=format\u0026n=38fXEM0a7v86Lg2m\u0026q=85\u0026s=d767c06cef433b0a02f40a1f4f785eab","dark":"https://mintcdn.com/flowxai/38fXEM0a7v86Lg2m/logo/dark.png?fit=max\u0026auto=format\u0026n=38fXEM0a7v86Lg2m\u0026q=85\u0026s=6b8b8c3e7abd17acf6be8bffce4e599d"},"favicon":"https://mintcdn.com/flowxai/VVxnbzjz7JuL1Ngt/favicon2.svg?fit=max\u0026auto=format\u0026n=VVxnbzjz7JuL1Ngt\u0026q=85\u0026s=ef6a780a1ed3894c7b276bcc7b3c6c69","appearance":{"default":"dark","strict":false},"background":{"decoration":"grid","color":{"light":"#f4f4f5","dark":"#0a0b0d"}},"navbar":{"links":[],"primary":{"type":"button","label":"Academy","href":"https://academy.flowx.ai/"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/flowxai","x":"https://x.com/FlowX_ai","youtube":"https://www.youtube.com/@FlowX_AI"},"links":[{"header":"Documentation","items":[{"label":"Introduction","href":"https://docs.flowx.ai/5.9/docs/introduction"},{"label":"Platform overview","href":"https://docs.flowx.ai/5.9/docs/platform-overview/flowx-architecture"},{"label":"Designer","href":"https://docs.flowx.ai/5.9/docs/flowx-designer/overview"},{"label":"AI Platform","href":"https://docs.flowx.ai/5.9/ai-platform/ai-in-flowx"},{"label":"Use the docs with AI","href":"https://docs.flowx.ai/5.9/docs/getting-started/using-flowx-docs-with-ai"},{"label":"Release notes","href":"https://docs.flowx.ai/release-notes/overview"}]},{"header":"Resources","items":[{"label":"FlowX.AI Academy","href":"https://academy.flowx.ai"},{"label":"Support","href":"https://flowxai.zendesk.com/"}]},{"header":"Company","items":[{"label":"About FlowX.AI","href":"https://www.flowx.ai/about"},{"label":"Contact us","href":"mailto:hello@flowx.ai"},{"label":"Careers","href":"https://apply.workable.com/flowxai"}]},{"header":"Legal","items":[{"label":"Privacy Policy","href":"https://www.flowx.ai/privacy-policy"},{"label":"Cookie Policy","href":"https://www.flowx.ai/cookie-policy"},{"label":"Terms and Conditions","href":"https://www.flowx.ai/terms-and-conditions"}]}]},"search":{"prompt":"Search the docs"},"seo":{"metatags":{"zd-site-verification":"94tteg5ir5of8gkb4twzh"}},"fonts":{"heading":{"family":"Sora"},"body":{"family":"Geist"}},"styling":{"eyebrows":"breadcrumbs","codeblocks":"dark","latex":true},"integrations":{"ga4":{"measurementId":"G-CGW0FVK9YM"}},"banner":{"content":"🚀 [See the latest FlowX.AI releases →](/release-notes/overview)","dismissible":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"flowxai","hasAudioNarration":false,"actualSubdomain":"flowxai","customDomains":["docs.flowx.ai"],"gitSource":{"type":"github","owner":"flowx-ai","repo":"flowx-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae4c8fd7f8a500a1fd86923","collectionId":"f43bb162-8d91-4fce-8112-9a85f1f82724","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae4c8fd7f8a500a1fd86923"},"feedback":{"thumbs":true,"contextualFeedback":{"allowEmail":true},"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae4c8fd7f8a500a1fd86923","clientVersion":"0.0.4039","searchFilterCounts":[{"language":"default","tag":"Documentation","count":787},{"language":"default","tag":"Building blocks","count":329},{"language":"default","tag":"Platform deep dive","count":257},{"language":"default","tag":"Setup guides","count":191},{"language":"default","tag":"UI Designer","count":140},{"language":"default","tag":"Release notes","count":137},{"language":"default","tag":"Release Notes","count":137},{"language":"default","tag":"Microservices","count":112},{"language":"default","tag":"Core extensions","count":107},{"language":"default","tag":"Nodes","count":88}],"searchSettings":{"isFiltersEnabled":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"type":"email","email":"learning.team@flowx.ai","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":true},"customCss":[{"filePath":"custom.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@keyframes fxh-tick-pulse{0%,to{opacity:1}50%{opacity:.35}}@keyframes fxh-caret-blink{50%{opacity:0}}@keyframes fxh-ln-in{to{opacity:1;transform:none}}@keyframes fxh-rv-in{to{opacity:1;transform:none}}@keyframes fxl-stack-ride{0%{top:0;opacity:0}4%{opacity:1}52%{top:calc(100% - 7px);opacity:1}58%,to{top:calc(100% - 7px);opacity:0}}@keyframes fxl-stack-lit{0%,2%,30%,to{color:var(--fxl-faint)}18%,6%{color:var(--fxl-text)}}@keyframes fxl-stack-tick{0%,2%,30%,to{background:var(--fxl-line)}18%,6%{background:#fcb813}}code,kbd,pre,samp{font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace}#topbar-cta-button{color:#131007!important}.label-version{display:inline-block;font-weight:700;color:#fff;background-color:#007bff;padding:.5px 15px;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.1);font-size:.9em;text-transform:uppercase;letter-spacing:.5px;margin-right:5px;transition:background-color .3s ease;text-decoration:none}.label-version:hover{background-color:#0056b3}#banner{background:linear-gradient(90deg,#0a0b0d 0,#0e1013 55%,#2a2310 100%)!important;border-bottom:1px solid rgba(252,184,19,.3);backdrop-filter:saturate(120%)}#banner a{color:#fcb813!important;text-decoration-color:rgba(252,184,19,.55)!important;transition:opacity .2s ease}#banner a:hover{opacity:.85}:root{--flowx-yellow-50:#fff8e7;--flowx-yellow-200:#ffdf92;--flowx-yellow-400:#ffc739;--flowx-yellow-500:#fcb813;--flowx-yellow-800:#8a5e00;--flowx-yellow-900:#6b4e08;--flowx-neutrals-50:#f7f8f9;--flowx-neutrals-100:#e3e8ed;--flowx-neutrals-200:#cbd1db;--flowx-neutrals-300:#a6b0be;--flowx-neutrals-400:#8390a2;--flowx-neutrals-500:#64748b;--flowx-neutrals-700:#475263;--flowx-neutrals-800:#2a313a;--flowx-neutrals-900:#1d232c;--flowx-blue-50:#e6f0fb;--flowx-blue-200:#8abbed;--flowx-blue-700:#004c99;--flowx-blue-900:#002d5b;--flowx-elevation-m:0 8px 16px #1634621a}.cb-wrap{margin-top:32px}.cb-filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px}.cb-filters input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.cb-filters label{cursor:pointer;user-select:none;font-size:12px;line-height:16px;font-weight:600;padding:8px 16px;border-radius:120px;border:1px solid var(--flowx-neutrals-200);color:var(--flowx-neutrals-500);background:0 0;transition:border-color .15s ease,background .15s ease,color .15s ease}.cb-filters label span{margin-left:6px;opacity:.55;font-variant-numeric:tabular-nums}.cb-filters label:hover{border-color:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.cb-filters input:checked+label,.dark .cb-filters input:checked+label{background:var(--flowx-yellow-500);border-color:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.cb-filters input:focus-visible+label{outline:2px solid var(--flowx-yellow-500);outline-offset:2px}.dark .cb-filters label{border-color:var(--flowx-neutrals-700);color:var(--flowx-neutrals-400)}.dark .cb-filters label:hover{border-color:var(--flowx-yellow-400);color:var(--flowx-neutrals-50)}.cb-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}@media (max-width:1024px){.cb-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:640px){.cb-grid{grid-template-columns:1fr}}.cb-wrap:has(#cb-conv:checked) .cb-card:not([data-f~=conversational]),.cb-wrap:has(#cb-cookbook:checked) .cb-card:not([data-f~=cookbook]),.cb-wrap:has(#cb-docs:checked) .cb-card:not([data-f~=docs]),.cb-wrap:has(#cb-guide:checked) .cb-card:not([data-f~=guide]),.cb-wrap:has(#cb-integr:checked) .cb-card:not([data-f~=integrations]),.cb-wrap:has(#cb-pattern:checked) .cb-card:not([data-f~=pattern]),.cb-wrap:has(#cb-tutorial:checked) .cb-card:not([data-f~=tutorial]),.cb-wrap:has(#cb-ui:checked) .cb-card:not([data-f~=ui]){display:none}.cb-card{position:relative;display:flex;flex-direction:column;gap:12px;padding:24px;border:1px solid var(--flowx-neutrals-100);border-radius:16px;background:0 0;text-decoration:none!important;transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease}.cb-card::after{content:\"\\2192\";position:absolute;top:20px;right:24px;font-size:14px;line-height:22px;color:var(--flowx-neutrals-300);transition:color .2s ease,transform .2s ease}.cb-card:hover{transform:translateY(-2px);border-color:var(--flowx-yellow-500);box-shadow:var(--flowx-elevation-m)}.cb-card:hover::after{color:var(--flowx-neutrals-900);transform:translateX(4px)}.dark .cb-card{border-color:var(--flowx-neutrals-800)}.dark .cb-card:hover{border-color:var(--flowx-yellow-400);box-shadow:0 8px 16px rgba(0,0,0,.4)}.dark .cb-card:hover::after,.dark .cb-foot a:hover{color:var(--flowx-yellow-400)}@media (prefers-reduced-motion:reduce){.cb-card,.cb-card::after{transition:none}.cb-card:hover,.cb-card:hover::after{transform:none}}.cb-tags{display:flex;flex-wrap:wrap;gap:6px;padding-right:24px}.cb-tag{font-size:10px;line-height:12px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:4px 8px;border-radius:4px;background:var(--flowx-neutrals-50);color:var(--flowx-neutrals-500)}.cb-tag-tut{background:var(--flowx-yellow-50);color:var(--flowx-yellow-800)}.cb-tag-pat{background:var(--flowx-neutrals-900);color:#fff}.cb-tag-cook{background:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.cb-tag-gui{background:var(--flowx-blue-50);color:var(--flowx-blue-700)}.dark .cb-tag{background:var(--flowx-neutrals-800);color:var(--flowx-neutrals-400)}.dark .cb-tag-tut{background:var(--flowx-yellow-900);color:var(--flowx-yellow-200)}.dark .cb-tag-pat{background:var(--flowx-neutrals-50);color:var(--flowx-neutrals-900)}.dark .cb-tag-cook{background:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.dark .cb-tag-gui{background:var(--flowx-blue-900);color:var(--flowx-blue-200)}.cb-foot a,.cb-title{font-weight:600;color:var(--flowx-neutrals-900)}.cb-title{display:block;font-size:14px;line-height:22px;letter-spacing:-.01em}.dark .cb-foot a,.dark .cb-title{color:var(--flowx-neutrals-50)}.cb-desc{display:block;font-size:12px;line-height:18px;font-weight:400;color:var(--flowx-neutrals-500)}.cb-foot span,.dark .cb-desc{color:var(--flowx-neutrals-400)}.cb-foot{display:flex;flex-wrap:wrap;align-items:baseline;gap:16px;margin-top:40px;padding-top:24px;border-top:1px solid var(--flowx-neutrals-100);font-size:12px;line-height:16px}.dark .cb-foot{border-top-color:var(--flowx-neutrals-800)}.dark .cb-foot span{color:var(--flowx-neutrals-500)}.cb-foot a{text-decoration:none;border-bottom:1px solid var(--flowx-yellow-500);padding-bottom:1px}.cb-foot a:hover{color:var(--flowx-yellow-800)}#content-area:has(.fxh-hero) #header{display:none}main#content-container:has(.fxh-hero){max-width:none}#content-area:has(.fxh-hero){width:100%!important}#content-area:has(.fxh-hero) #content{max-width:none;margin-top:0}#content-area:has(.fxh-hero) #content div[class*=\"--page-padding\"]{--page-padding:0px}#content-area:has(.fxh-hero) #content>:not(.fxh-hero){max-width:1360px;margin-left:auto;margin-right:auto}.fxh-hero{position:relative;text-align:center}@media (min-width:1024px){.fxh-hero{margin-top:-2.5rem}}.fxh-hero__bg{position:sticky;top:0;z-index:0;height:100dvh;overflow:clip;border-radius:18px;background:#0a0b0d;border:1px solid rgba(255,255,255,.08)}.fxh-hero__bg::after,.fxh-hero__bg::before{content:\"\";position:absolute;pointer-events:none}.fxh-hero__bg::before{inset:0;background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:56px 56px;-webkit-mask-image:radial-gradient(ellipse at 50% 0,#000 25%,transparent 75%);mask-image:radial-gradient(ellipse at 50% 0,#000 25%,transparent 75%)}.fxh-hero__bg::after{top:-45%;left:25%;width:50%;height:90%;background:radial-gradient(closest-side,rgba(252,184,19,.1),transparent 70%)}.fxh-hero__steps{position:relative;z-index:1;margin-top:-100dvh}.fxh-hero__step{position:relative;min-height:calc(100dvh - 9.5rem);display:grid;grid-template-columns:minmax(0,1fr);align-content:center;padding:48px clamp(24px,5vw,56px) 96px}.fxh-hero__step:not(:first-child){min-height:72dvh;padding-top:48px;padding-bottom:48px}.fxh-hero--single .fxh-hero__bg{position:absolute;inset:0;height:auto;z-index:0}.fxh-hero--single .fxh-hero__steps{margin-top:0}.fxh-hero--single .fxh-hero__step{min-height:calc(100dvh - 9.5rem)}.fxh-hero--slim .fxh-hero__step{min-height:min(46dvh,480px);padding-top:clamp(40px,6vh,64px);padding-bottom:clamp(40px,6vh,64px)}.fxh-step-title{display:block;font-family:\"Sora\",sans-serif;font-size:clamp(1.7rem,3.4vw,2.6rem);font-weight:700;letter-spacing:-.02em;line-height:1.1;color:#f5f5f0;max-width:20ch;margin:0 auto clamp(18px,3vh,28px)}.fxh-vs{display:flex;flex-wrap:wrap;justify-content:center;gap:clamp(9px,1.1vw,14px);max-width:min(780px,100%);margin:clamp(14px,3vh,30px) auto 0;padding:0;list-style:none}.fxh-vs li{display:flex;align-items:center;gap:12px;padding:11px clamp(18px,1.6vw,24px);border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.035);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:999px}.fxh-vs__no{font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:rgba(255,255,255,.42)}.fxh-vs__name{font-family:\"Sora\",sans-serif;font-size:clamp(12.5px,1.1vw,15px);font-weight:600;letter-spacing:.01em;color:rgba(255,255,255,.9)}.fxh-scroll{position:absolute;bottom:clamp(20px,4vh,40px);left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:8px;font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:rgba(255,255,255,.42)}.fxh-scroll-line{width:1px;height:46px;background:linear-gradient(rgba(255,255,255,.45),transparent)}.fxh-eyebrow{font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;display:inline-flex;align-items:center;gap:12px;font-size:13px;font-weight:400;letter-spacing:.22em;text-transform:uppercase;color:#a3a39a;margin-bottom:28px}.fxh-tick{display:inline-block;width:8px;height:8px;flex-shrink:0;background:#fcb813;animation:fxh-tick-pulse 2.6s ease-in-out infinite}.fxh-title{display:block;font-family:\"Sora\",sans-serif;font-weight:700;letter-spacing:-.02em;line-height:1.08;max-width:920px;margin:0 auto clamp(20px,3vh,28px);text-wrap:balance}.fxh-line{display:block;font-size:clamp(1.7rem,3.4vw,2.7rem);color:#f5f5f0}.fxh-line--dim{color:rgba(244,245,243,.58);margin-top:.06em}.fxh-amber{color:#fcb813}.fxh-sub{display:block;max-width:62ch;margin:0 auto clamp(20px,3vh,28px);font-size:15px;line-height:1.55;color:#b9b9b1}.fxh-cta,.fxh-ctas{justify-content:center}.fxh-ctas{display:flex;flex-wrap:wrap;gap:12px;position:relative}.fxh-cta{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;padding:12px 22px;border-radius:10px;font-size:15px;font-weight:550;text-decoration:none!important;transition:background .2s ease,border-color .2s ease,color .2s ease}.fxh-cta--primary{background:#fcb813;color:#131007!important;font-weight:640}.fxh-cta--primary:hover{background:#ffc739}.fxh-cta--ghost{border:1px solid rgba(255,255,255,.16);color:#f4f5f3!important}.fxh-cta--ghost:hover{border-color:rgba(255,255,255,.42);background:rgba(255,255,255,.04)}.fxh-term,.fxh-term__dots i{border:1px solid rgba(255,255,255,.12)}.fxh-term{position:relative;width:min(680px,100%);margin:clamp(24px,4vh,36px) auto clamp(22px,3.5vh,32px);text-align:left;border-radius:18px;overflow:hidden;background:linear-gradient(180deg,rgba(255,255,255,.1) 0,rgba(255,255,255,.03) 20%,rgba(255,255,255,.01) 60%,rgba(255,255,255,.045) 100%),rgba(10,11,13,.91);box-shadow:0 24px 60px rgba(0,0,0,.5)}.fxh-term__bar{display:flex;align-items:center;gap:16px;padding:14px 22px;font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;letter-spacing:.06em;color:rgba(255,255,255,.62);border-bottom:1px solid rgba(255,255,255,.12)}.fxh-term__dots{display:inline-flex;gap:7px}.fxh-term__dots i{width:11px;height:11px;border-radius:50%}.fxh-term__body{display:flex;flex-direction:column;gap:14px;padding:24px 26px 26px;font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:14px}.fxh-term__body p{margin:0;color:rgba(255,255,255,.72)}.fxh-term__prompt{color:#fcb813;margin-right:8px}.fxh-caret{display:inline-block;width:9px;height:1.05em;margin-left:6px;vertical-align:text-bottom;background:rgba(252,184,19,.85);animation:fxh-caret-blink 1.1s steps(1) infinite}.fxh-term__log{display:grid;gap:5px;align-content:start}.fxh-term__log:empty{display:none}.fxh-term__log .ln{display:flex;justify-content:space-between;gap:16px;font-size:12.5px;color:rgba(255,255,255,.58);opacity:0;transform:translateY(6px);animation:fxh-ln-in .45s cubic-bezier(.16,1,.3,1) forwards}.fxh-term__log .ok{color:#fcb813;margin-right:8px}.fxh-term__log .t,.fxh-term__ver{color:rgba(255,255,255,.34)}.fxh-term__ver{margin-left:auto}.fxh-field{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;opacity:.55}#footer a[href*=\"utm_campaign=poweredBy\"],.fxh-hero--live .fxh-hero__bg::before{display:none}.fxh-hero--live .fxh-hero__step:first-child .fxh-ctas,.fxh-hero--live .fxh-hero__step:first-child .fxh-eyebrow,.fxh-hero--live .fxh-hero__step:first-child .fxh-scroll,.fxh-hero--live .fxh-hero__step:first-child .fxh-sub,.fxh-hero--live .fxh-hero__step:first-child .fxh-title{opacity:0;transform:translateY(26px);animation:fxh-rv-in .9s cubic-bezier(.16,1,.3,1) forwards}.fxh-hero--live .fxh-hero__step:first-child .fxh-eyebrow{animation-delay:.15s}.fxh-hero--live .fxh-hero__step:first-child .fxh-title{animation-delay:.26s}.fxh-hero--live .fxh-hero__step:first-child .fxh-sub{animation-delay:.48s}.fxh-hero--live .fxh-hero__step:first-child .fxh-ctas{animation-delay:.59s}.fxh-hero--live .fxh-hero__step:first-child .fxh-scroll{animation-delay:.92s}@media (max-width:640px){.fxh-hero__step{padding:72px 20px}}@media (prefers-reduced-motion:reduce){.fxh-caret,.fxh-tick{animation:none}.fxh-hero--live .fxh-hero__step:first-child .fxh-ctas,.fxh-hero--live .fxh-hero__step:first-child .fxh-eyebrow,.fxh-hero--live .fxh-hero__step:first-child .fxh-scroll,.fxh-hero--live .fxh-hero__step:first-child .fxh-sub,.fxh-hero--live .fxh-hero__step:first-child .fxh-title{animation:none;opacity:1;transform:none}}.cb-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}@media (max-width:640px){.cb-grid--2{grid-template-columns:1fr}}:root{--fxl-mono:\"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, monospace;--fxl-display:\"Sora\", sans-serif;--fxl-ease:cubic-bezier(0.16, 1, 0.3, 1);--fxl-text:#17181b;--fxl-dim:rgba(23, 24, 27, 0.64);--fxl-faint:rgba(23, 24, 27, 0.44);--fxl-line:rgba(24, 24, 27, 0.12);--fxl-line-soft:rgba(24, 24, 27, 0.07);--fxl-amber-text:#8a5e00;--fxl-bg:#f4f4f5;--fxl-panel:#fcfcfd;--fxl-amber-soft:rgba(252, 184, 19, 0.12)}.dark{--fxl-text:#f4f5f3;--fxl-dim:rgba(244, 245, 243, 0.58);--fxl-faint:rgba(244, 245, 243, 0.34);--fxl-line:rgba(255, 255, 255, 0.08);--fxl-line-soft:rgba(255, 255, 255, 0.05);--fxl-amber-text:#fcb813;--fxl-bg:#0a0b0d;--fxl-panel:#0c0e11;--fxl-amber-soft:rgba(252, 184, 19, 0.08)}.fxl-no{display:flex;align-items:center;gap:12px;font-family:var(--fxl-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--fxl-faint);margin-top:8px}.fxl-no::after{content:\"\";flex:1;height:1px;background:var(--fxl-line-soft)}.fxl-no+h2{margin-top:10px}.fxl-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:var(--fxl-line);border:1px solid var(--fxl-line);border-radius:16px;overflow:hidden}.fxl-cell{position:relative;display:block;background:var(--fxl-panel);padding:clamp(24px,2.6vw,34px);text-decoration:none!important;transition:background .2s ease}.fxl-cell:hover{background:var(--fxl-amber-soft)}.fxl-cell::after{content:\"\\2192\";position:absolute;top:24px;right:26px;font-family:var(--fxl-mono);font-size:14px;color:var(--fxl-faint);transition:color .2s ease,transform .2s ease}.fxl-cell:hover::after{color:var(--fxl-amber-text);transform:translateX(4px)}.fxl-cell__no{display:block;font-family:var(--fxl-mono);font-size:11px;letter-spacing:.2em;color:var(--fxl-amber-text);margin-bottom:14px}.fxl-cell__title{display:block;font-family:var(--fxl-display);font-size:18px;font-weight:600;letter-spacing:-.01em;color:var(--fxl-text);margin-bottom:6px}.fxl-cell__desc{display:block;font-size:13.5px;line-height:1.5;color:var(--fxl-dim);max-width:46ch}.fxl-grid--1{grid-template-columns:1fr}.fxl-grid--3{grid-template-columns:repeat(3,1fr)}@media (max-width:1024px){.fxl-grid--3{grid-template-columns:repeat(2,1fr)}}@media (max-width:640px){.fxl-grid,.fxl-grid--3{grid-template-columns:1fr}}.fxl-cell--eval{grid-column:1/-1;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);gap:32px;align-items:center}.fxl-cell--eval::after{content:none}.fxl-cell--eval:hover{background:var(--fxl-panel)}.fxl-eval__links{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:18px}.fxl-eval__links a,.fxl-stack{font-family:var(--fxl-mono);font-size:12px}.fxl-eval__links a{color:var(--fxl-amber-text);text-decoration:none!important;border-bottom:1px solid rgba(252,184,19,.45);padding-bottom:1px}.fxl-eval__links a:hover{border-bottom-color:var(--fxl-amber-text)}.fxl-stack{color:var(--fxl-faint)}.fxl-stack__row{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 12px 7px 30px;border-bottom:1px solid var(--fxl-line-soft)}.fxl-rails li:last-child,.fxl-stack__row:last-child{border-bottom:none}.fxl-stack__row span:last-child{font-size:10.5px;letter-spacing:.08em;opacity:.8}.fxl-stack__tick{position:absolute;left:10px;top:50%;width:7px;height:7px;margin-top:-3.5px;border-radius:2px;background:var(--fxl-line)}.fxl-stack__client{border:1px solid var(--fxl-line);border-radius:10px;color:var(--fxl-dim)}.fxl-stack__client .fxl-stack__tick{background:#fcb813}.fxl-stack__gw{display:flex;align-items:center;gap:10px;padding:10px 0 10px 30px;font-size:10.5px;letter-spacing:.16em;text-transform:uppercase}.fxl-stack__gw::after{content:\"\";flex:1;height:1px;background:repeating-linear-gradient(90deg,var(--fxl-line) 0 4px,transparent 4px 8px)}.fxl-stack__svc{position:relative;border:1px solid var(--fxl-line);border-radius:10px;overflow:hidden}.fxl-stack__spine{position:absolute;left:13px;top:0;bottom:0;width:1px;background:var(--fxl-line)}.fxl-stack__pulse{position:absolute;left:10px;top:0;width:7px;height:7px;border-radius:50%;background:#fcb813;box-shadow:0 0 0 4px rgba(252,184,19,.18);opacity:0;animation:fxl-stack-ride 6.6s linear infinite}.fxl-stack__svc .fxl-stack__row,.fxl-stack__svc .fxl-stack__tick{animation:6.6s linear infinite}.fxl-stack__svc .fxl-stack__row{animation-name:fxl-stack-lit}.fxl-stack__svc .fxl-stack__tick{animation-name:fxl-stack-tick}.fxl-stack__svc .fxl-stack__row:nth-child(4),.fxl-stack__svc .fxl-stack__row:nth-child(4) .fxl-stack__tick{animation-delay:.55s}.fxl-stack__svc .fxl-stack__row:nth-child(5),.fxl-stack__svc .fxl-stack__row:nth-child(5) .fxl-stack__tick{animation-delay:1.1s}.fxl-stack__svc .fxl-stack__row:nth-child(6),.fxl-stack__svc .fxl-stack__row:nth-child(6) .fxl-stack__tick{animation-delay:1.65s}.fxl-stack__svc .fxl-stack__row:nth-child(7),.fxl-stack__svc .fxl-stack__row:nth-child(7) .fxl-stack__tick{animation-delay:2.2s}.fxl-stack__svc .fxl-stack__row:nth-child(8),.fxl-stack__svc .fxl-stack__row:nth-child(8) .fxl-stack__tick{animation-delay:2.75s}.fxl-stack__foot{display:flex;justify-content:space-between;margin-top:8px;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase}.fxl-rails a:hover,.fxl-stack__bus{color:var(--fxl-amber-text)}@media (prefers-reduced-motion:reduce){.fxl-stack__pulse,.fxl-stack__svc .fxl-stack__row,.fxl-stack__svc .fxl-stack__tick{animation:none}.fxl-stack__svc .fxl-stack__row{color:var(--fxl-dim)}}@media (max-width:768px){.fxl-cell--eval{grid-template-columns:1fr;gap:24px}}.fxl-flow{display:flex;align-items:stretch;gap:14px}.fxl-flow__stage{flex:1;border:1px solid var(--fxl-line);background:var(--fxl-panel);border-radius:14px;padding:20px 22px}.fxl-flow__no{display:block;font-family:var(--fxl-mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--fxl-amber-text);margin-bottom:10px}.fxl-flow__title{display:block;font-family:var(--fxl-display);font-size:15px;font-weight:600;letter-spacing:-.01em;color:var(--fxl-text)}.fxl-flow__desc{display:block;margin-top:6px;font-size:12.5px;line-height:1.5;color:var(--fxl-dim)}.fxl-flow__arrow{align-self:center;flex-shrink:0;font-family:var(--fxl-mono);font-size:16px;color:var(--fxl-amber-text)}@media (max-width:768px){.fxl-flow{flex-direction:column}.fxl-flow__arrow{transform:rotate(90deg)}}.fxl-rails{list-style:none;padding:0;margin:0;font-family:var(--fxl-mono);font-size:13px;color:var(--fxl-dim)}.fxl-rails li{display:flex;align-items:baseline;gap:12px;padding:12px 0;border-bottom:1px solid var(--fxl-line-soft)}.fxl-rails__state{align-self:center;flex-shrink:0;width:7px;height:7px;border-radius:2px;background:#fcb813}.fxl-rails a{color:var(--fxl-text);text-decoration:none;border-bottom:1px solid rgba(252,184,19,.45);padding-bottom:1px;transition:color .15s ease}.fxl-rails em{margin-left:auto;padding-left:16px;flex-shrink:0;font-style:normal;font-size:11px;letter-spacing:.1em;color:var(--fxl-faint)}.fxl-proc{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;list-style:none;padding:0;margin:0;background:var(--fxl-line);border:1px solid var(--fxl-line);border-radius:16px;overflow:hidden}.fxl-proc li{background:var(--fxl-bg);padding:clamp(22px,2.4vw,32px);margin:0}.fxl-proc a,.fxl-proc__no{font-family:var(--fxl-mono);color:var(--fxl-amber-text)}.fxl-proc__no{display:block;font-size:11px;letter-spacing:.2em;margin-bottom:16px}.fxl-proc__title{display:block;font-family:var(--fxl-display);font-size:17px;font-weight:600;letter-spacing:-.01em;color:var(--fxl-text);margin-bottom:8px}.fxl-proc__desc{display:block;font-size:13.5px;line-height:1.55;color:var(--fxl-dim)}.fxl-proc a{display:inline-block;margin-top:12px;font-size:12px;text-decoration:none;border-bottom:1px solid rgba(252,184,19,.45);padding-bottom:1px}.fxl-proc a:hover{border-bottom-color:var(--fxl-amber-text)}@media (max-width:1024px){.fxl-proc{grid-template-columns:repeat(2,1fr)}}@media (max-width:640px){.fxl-proc{grid-template-columns:1fr}}.fxl-reg{border:1px solid var(--fxl-line);background:var(--fxl-panel);border-radius:16px;padding:clamp(16px,2.5vw,28px)}.fxl-reg__hd,.fxl-reg__row{display:grid;grid-template-columns:minmax(180px,1.2fr) 2fr 150px 24px;gap:16px;align-items:baseline;font-family:var(--fxl-mono)}.fxl-reg__hd{font-size:11px;letter-spacing:.08em;color:var(--fxl-faint);padding-bottom:10px}.fxl-reg__hd,.fxl-reg__item{border-bottom:1px solid var(--fxl-line-soft)}.fxl-reg__item:last-child{border-bottom:none}.fxl-reg__toggle{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fxl-reg__row{padding:14px 0;cursor:pointer;font-size:12.5px;user-select:none}.fxl-reg__toggle:focus-visible+.fxl-reg__row{outline:2px solid #fcb813;outline-offset:2px}.fxl-reg__type{font-size:10px;letter-spacing:.12em;color:var(--fxl-faint);margin-left:6px}.fxl-reg__type--lts,a.fxl-reg__row:hover .fxl-reg__name{color:var(--fxl-amber-text)}a.fxl-reg__row{text-decoration:none!important;transition:background .15s ease}a.fxl-reg__row:hover{background:var(--fxl-amber-soft)}.fxl-reg__name{color:var(--fxl-text);font-weight:500}.fxl-reg__caps{color:var(--fxl-dim)}.fxl-reg__status{color:var(--fxl-amber-text);white-space:nowrap}.fxl-reg__mark{color:var(--fxl-amber-text);font-size:14px;text-align:right;transition:transform .3s var(--fxl-ease)}.fxl-reg__item:has(.fxl-reg__toggle:checked) .fxl-reg__mark{transform:rotate(45deg)}.fxl-reg__body{display:none;padding:2px 0 18px;font-size:13.5px;line-height:1.6;color:var(--fxl-dim);max-width:72ch}.fxl-reg__item:has(.fxl-reg__toggle:checked) .fxl-reg__body{display:block}.fxl-reg__body p{margin:0 0 8px}.fxl-reg__body strong{color:var(--fxl-text);font-weight:600}@media (max-width:768px){.fxl-reg__hd,.fxl-reg__row{grid-template-columns:1fr 132px 20px;gap:10px}.fxl-reg__caps,.fxl-reg__hd span:nth-child(2){display:none}}.fxl-dgv{display:grid;gap:10px}.fxl-dgv__row{display:grid;grid-template-columns:150px 1fr;gap:18px;align-items:baseline;border:1px solid var(--fxl-line);border-radius:12px;padding:14px 20px}.fxl-dgv__key{font-family:var(--fxl-mono);font-size:12.5px;color:var(--fxl-amber-text)}.fxl-dgv__val{font-size:13.5px;line-height:1.55;color:var(--fxl-dim)}@media (max-width:640px){.fxl-dgv__row{grid-template-columns:1fr;gap:6px}}.fxl-cta{position:relative;overflow:hidden;border-radius:18px;padding:clamp(40px,6vw,64px) clamp(24px,5vw,56px);background:#0a0b0d;border:1px solid rgba(255,255,255,.08);text-align:center}.fxl-cta::before{content:\"\";position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:56px 56px;-webkit-mask-image:radial-gradient(ellipse at 50% 100%,#000 25%,transparent 75%);mask-image:radial-gradient(ellipse at 50% 100%,#000 25%,transparent 75%);pointer-events:none}.fxl-cta>*{position:relative;z-index:1}.fxl-cta__title{display:block;font-family:var(--fxl-display);font-size:clamp(1.5rem,3vw,2.2rem);font-weight:700;letter-spacing:-.02em;line-height:1.1;color:#f5f5f0;margin-bottom:12px}.fxl-cta__sub{display:block;font-size:14.5px;color:#b9b9b1;max-width:56ch;margin:0 auto 24px}html.fxl-js .rv{opacity:0;transform:translateY(12px);transition:opacity .6s var(--fxl-ease),transform .6s var(--fxl-ease);transition-delay:calc(var(--i, 0)*.06s)}html.fxl-js .rv.in{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){html.fxl-js .rv{opacity:1;transform:none;transition:none}.fxl-rails__state{animation:none}}"}],"page":{"pagePath":"6.x/docs/building-blocks/project-data-model","slug":"/6.x/docs/building-blocks/project-data-model","pageMetadata":{"title":"Project data model","description":"Define reusable data types at the project level to ensure consistency across processes","icon":"square-binary","owner":"docs","last_reviewed":"2026-08-11T00:00:00.000Z","href":"/6.x/docs/building-blocks/project-data-model"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Define reusable data types at the project level to ensure consistency across processes\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,hr:`hr`,img:`img`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Check,Expandable,Frame,Heading,Info,Note,OptimizedImage,Step,Steps,Tab,Table,Tabs,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`what-is-a-project-data-model`,children:`What is a project data model?`}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm.png`,alt:`Project Data Model`})})}),`\n`,_jsx(_components.p,{children:`The Project Data Model (PDM) lets you define reusable data types at the project level. These data types propagate to the process data models, ensuring data consistency across your FlowX.AI applications, including in Reusable Functions, Persistence Layer schemas, and other components.`}),`\n`,_jsx(_components.p,{children:`With PDM, you create a centralized data structure that serves as the foundation for all processes within your project. This ensures that core data types like Customer, Product, or Document maintain consistent definitions throughout your application.`}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_process.png`,alt:`Project Data Model`})})}),`\n`,_jsx(Heading,{level:`2`,id:`key-concepts`,children:`Key concepts`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Data Model Types`,id:`data-model-types`,children:[_jsx(_components.p,{children:`FlowX.AI supports several data model layers, each serving different purposes:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Data Model Layer`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Process Data Model`}),_jsx(_components.td,{children:`Can use data types defined in the Project Data Model or Library Data Model.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Project Data Model (PDM)`}),_jsx(_components.td,{children:`Defines data types that can be reused across processes and other resources within the project`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Library Data Model`}),_jsx(_components.td,{children:`Defined within a library. Allows data types to be reused across multiple projects, promoting standardization.`})]})]})]}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_process.png`,alt:`Data Model Types`})})})]}),_jsxs(Tab,{title:`Data Types \u0026 Attributes`,id:`data-types-%26-attributes`,children:[_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`data type`}),` defines the structure of a particular set of data. For example, a `,_jsx(_components.code,{children:`Customer`}),` data type might contain attributes like `,_jsx(_components.code,{children:`name`}),`, `,_jsx(_components.code,{children:`email`}),`, and `,_jsx(_components.code,{children:`address`}),`.`]}),_jsxs(_components.p,{children:[`An `,_jsx(_components.strong,{children:`attribute`}),` is an individual property of a data type that specifies its data structure.`]}),_jsx(_components.p,{children:`Data types and attributes can be categorized based on their usage:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Used/Unused`}),`: A data type or attribute is considered “used” when it’s incorporated into the structure of another data type.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Referenced/Unreferenced`}),`: Refers to data types or attributes from the Project Data Model being used within a Process Data Model or a UI Template.`]}),`\n`]}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_usage.gif`,alt:`PDM usage`})})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`benefits-of-project-data-model`,children:`Benefits of project data model`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Consistency`,icon:`check-double`,children:_jsx(_components.p,{children:`Ensures data structure consistency across multiple processes and resources`})}),_jsx(Card,{title:`Reusability`,icon:`recycle`,children:_jsx(_components.p,{children:`Define once, use many times across processes, business rules, and other components`})}),_jsx(Card,{title:`Efficiency`,icon:`bolt`,children:_jsx(_components.p,{children:`Reduces development time by eliminating duplicate definitions`})}),_jsx(Card,{title:`Maintainability`,icon:`wrench`,children:_jsx(_components.p,{children:`Centralized management of data structures`})}),_jsx(Card,{title:`Standardization`,icon:`ruler`,children:_jsx(_components.p,{children:`Promotes the use of common data structures across projects`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`how-to-use-the-project-data-model`,children:`How to use the project data model`}),`\n`,_jsx(Heading,{level:`3`,id:`access-the-project-data-model`,children:`Access the project data model`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open FlowX.AI Designer`,children:_jsx(_components.p,{children:`Open FlowX.AI Designer.`})}),_jsx(Step,{title:`Navigate to your project`,children:_jsx(_components.p,{children:`Select the project where you want to configure the Project Data Model.`})}),_jsxs(Step,{title:`Select Data Model`,children:[_jsx(_components.p,{children:`Select “Project Data Model” from the project menu.`}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/where_to_find_pdm.png`,alt:`Project Data Model`})})})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`define-a-project-data-model`,children:`Define a project data model`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Add a new data type`,children:[_jsxs(_components.p,{children:[`In the Project Data Model view, click `,_jsx(_components.strong,{children:`+`}),` to add a new data type. A confirmation toast notifies you when the data type is created.`]}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/add_new_data_type.png`,alt:`Add data type`})})})]}),_jsx(Step,{title:`Name the data type`,children:_jsx(_components.p,{children:`Provide a name for the data type.`})}),_jsxs(Step,{title:`Add attributes`,children:[_jsxs(_components.p,{children:[`Each data type displays an `,_jsx(_components.strong,{children:`Add attribute`}),` button for creating the first attribute. After the first attribute exists, the button appears only on hover over the data type.`]}),_jsxs(_components.p,{children:[`When you select an attribute, a `,_jsx(_components.strong,{children:`settings side panel`}),` opens on the right where you can configure:`]}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Attribute name and type (string, number, boolean, object, array, enum)`}),`\n`,_jsx(_components.li,{children:`Validations, sensitive data, and reporting settings`}),`\n`,_jsx(_components.li,{children:`Example values for data mapping`}),`\n`]}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/add_attributes.png`,alt:`Add attributes`})})})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`manage-data-types`,children:`Manage data types`}),`\n`,_jsx(Heading,{level:`4`,id:`add-a-data-type`,children:`Add a data type`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`+`}),` in the Data Types panel.`]}),`\n`,_jsx(_components.li,{children:`Enter the name and properties of the data type.`}),`\n`,_jsxs(_components.li,{children:[`Use the inline `,_jsx(_components.strong,{children:`Add attribute`}),` button on the data type to add attributes.`]}),`\n`,_jsx(_components.li,{children:`Save changes.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`edit-a-data-type`,children:`Edit a data type`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Select the data type`,children:_jsx(_components.p,{children:`Select the data type in the Project Data Model.`})}),_jsx(Step,{title:`Select an attribute`,children:_jsxs(_components.p,{children:[`Click an attribute to open the `,_jsx(_components.strong,{children:`settings side panel`}),` on the right with all configuration options.`]})}),_jsx(Step,{title:`Edit the attribute`,children:_jsx(_components.p,{children:`Edit the attribute settings as needed. Changes are saved automatically.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`attribute-validations`,children:`Attribute validations`}),`\n`,_jsxs(_components.p,{children:[`You can attach validation rules to a data model attribute so that the values held by that attribute follow the constraints you define. Validators are set per attribute from the attribute `,_jsx(_components.strong,{children:`settings side panel`}),`, and they travel with the data model wherever it is used, including process data models, reusable functions, and reusable UI templates.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`These validators are defined on the `,_jsx(_components.strong,{children:`data model attribute`}),` itself. They are different from the `,_jsx(_components.a,{href:`/6.x/docs/building-blocks/ui-designer/validators`,children:`UI Designer validators`}),`, which are configured on individual form components inside a UI template.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`add-a-validator`,children:`Add a validator`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Select an attribute`,children:_jsxs(_components.p,{children:[`In the Project Data Model, select an attribute to open the `,_jsx(_components.strong,{children:`settings side panel`}),` on the right.`]})}),_jsx(Step,{title:`Open the Validations section`,children:_jsxs(_components.p,{children:[`In the side panel, expand the `,_jsx(_components.strong,{children:`Validations`}),` section and click `,_jsx(_components.strong,{children:`Add validator`}),`.`]})}),_jsx(Step,{title:`Choose a validator type`,children:_jsxs(_components.p,{children:[`Select a validator type. Only the validator types that apply to the attribute’s type are listed (see `,_jsx(_components.a,{href:`#available-validators-by-attribute-type`,children:`Available validators by attribute type`}),`).`]})}),_jsx(Step,{title:`Enter a value`,children:_jsx(_components.p,{children:`Enter the value the validator checks against. Required field and Email Format take no value; every other validator type takes one. For a date attribute, the Min Date and Max Date values are picked from a date picker.`})}),_jsx(Step,{title:`Save the validator`,children:_jsx(_components.p,{children:`Save the validator. It appears in the Validations list for the attribute. Changes to the data model are saved automatically.`})})]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`You can add at most one validator of each type to an attribute. A type that is already applied no longer appears in the validator list.`})}),`\n`,_jsx(Heading,{level:`3`,id:`available-validators-by-attribute-type`,children:`Available validators by attribute type`}),`\n`,_jsx(_components.p,{children:`The validator types offered depend on the attribute’s type. Required field is available for every type.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Attribute type`}),_jsx(_components.th,{children:`Available validators`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`String`}),_jsx(_components.td,{children:`Required field, Min Length, Max Length, Pattern, Email Format`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Number`}),_jsx(_components.td,{children:`Required field, Min Value, Max Value`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Boolean`}),_jsx(_components.td,{children:`Required field`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Date`}),_jsx(_components.td,{children:`Required field, Min Date, Max Date`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Enum`}),_jsx(_components.td,{children:`Required field`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Array`}),_jsx(_components.td,{children:`Required field, Min Items, Max Items`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Object`}),_jsx(_components.td,{children:`Required field`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Currency`}),_jsx(_components.td,{children:`Required field, Min Amount Value, Max Amount Value, Min Code Length, Max Code Length, Code Pattern (regex)`})]})]})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`For a currency attribute, the Min Amount Value and Max Amount Value validators apply to the amount, while Min Code Length, Max Code Length, and Code Pattern (regex) apply to the currency code.`})}),`\n`,_jsx(Heading,{level:`3`,id:`what-each-validator-checks`,children:`What each validator checks`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Required field`,icon:`asterisk`,id:`required-field`,children:_jsx(_components.p,{children:`Requires the attribute to hold a value. Takes no value of its own.`})}),_jsx(Accordion,{title:`Min Length / Max Length`,icon:`ruler`,id:`min-length-max-length`,children:_jsxs(_components.p,{children:[`Sets the minimum or maximum number of characters for a string value. For a currency attribute these apply to the currency code and are labeled `,_jsx(_components.strong,{children:`Min Code Length`}),` and `,_jsx(_components.strong,{children:`Max Code Length`}),`. The configured limit is shown as a number of characters, for example `,_jsx(_components.code,{children:`3 characters`}),`.`]})}),_jsx(Accordion,{title:`Min Value / Max Value`,icon:`arrows-up-down`,id:`min-value-max-value`,children:_jsxs(_components.p,{children:[`Sets the lower or upper bound for a numeric value. For a date attribute these are labeled `,_jsx(_components.strong,{children:`Min Date`}),` and `,_jsx(_components.strong,{children:`Max Date`}),` and the bound is entered as a date. For a currency attribute these are labeled `,_jsx(_components.strong,{children:`Min Amount Value`}),` and `,_jsx(_components.strong,{children:`Max Amount Value`}),` and the bound is displayed together with the attribute’s currency code, for example `,_jsx(_components.code,{children:`100 EUR`}),`.`]})}),_jsx(Accordion,{title:`Pattern`,icon:`brackets-angle`,id:`pattern`,children:_jsxs(_components.p,{children:[`Checks a string value against a regular expression. For a currency attribute this is labeled `,_jsx(_components.strong,{children:`Code Pattern (regex)`}),` and validates the currency code.`]})}),_jsx(Accordion,{title:`Email Format`,icon:`envelope`,id:`email-format`,children:_jsx(_components.p,{children:`Checks that a string value is a valid email address. Takes no value of its own.`})}),_jsx(Accordion,{title:`Min Items / Max Items`,icon:`brackets-square`,id:`min-items-max-items`,children:_jsx(_components.p,{children:`Sets the minimum or maximum number of items for an array attribute.`})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`When you change an attribute’s type, every validator except `,_jsx(_components.strong,{children:`Required field`}),` is removed automatically, because the other validators may no longer apply to the new type. Re-add the validators you need after changing the type.`]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`attribute-path`,children:`Attribute path`}),`\n`,_jsxs(_components.p,{children:[`Each attribute displays a `,_jsx(_components.strong,{children:`path button`}),` next to its name. Click it to view the full key path and copy it to your clipboard. This is useful when referencing keys in business rules, UI component bindings, or integration mappings.`]}),`\n`,_jsxs(Info,{children:[_jsx(_components.p,{children:`Changes to data types propagate to all processes referencing them. If a process is using this data type, it will automatically get the updated structure.`}),_jsx(Warning,{children:_jsx(_components.p,{children:`However, changes do NOT propagate to UI Designer paths, which will need to be adjusted manually.`})}),_jsx(`video`,{autoPlay:true,muted:true,loop:true,playsInline:true,src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_usage.mp4`})]}),`\n`,_jsx(Heading,{level:`3`,id:`remove-a-data-type`,children:`Remove a data type`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Select the data type`,children:[_jsx(_components.p,{children:`Select the data type to remove.`}),_jsx(Info,{children:_jsx(_components.p,{children:`You can either delete an entire object or just a single attribute.`})}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/remove_dm_obj.png`,alt:`Delete data type`})})})]}),_jsx(Step,{title:`Click remove`,children:_jsx(_components.p,{children:`Click the remove button.`})}),_jsx(Step,{title:`Confirm deletion`,children:_jsx(_components.p,{children:`You can delete the data type even if it’s in use. The system will show you a warning message indicating which processes reference the data type.`})})]}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:`If the data type is in use by processes, you will receive a warning message showing which processes reference it. You can still proceed with the deletion, but this may affect the referenced processes.`}),_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_delete.png`,alt:`Delete data type`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`working-with-referenced-data-types`,children:`Working with referenced data types`}),`\n`,_jsx(_components.p,{children:`When a data type from the Project Data Model is used in a Process Data Model:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`The Process Data Model will display the referenced data type.`}),`\n`,_jsx(_components.li,{children:`The referenced data type cannot be modified at the process level.`}),`\n`,_jsx(_components.li,{children:`Changes to the data type in the Project Data Model will propagate to all referencing processes.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`common-scenarios`,children:`Common scenarios`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`Edit a Key`,id:`edit-a-key`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Access PDM`,children:_jsx(_components.p,{children:`Navigate to the Project Data Model.`})}),_jsx(Step,{title:`Make changes`,children:_jsx(_components.p,{children:`Make changes to an existing key or attribute.`})}),_jsx(Step,{title:`Propagation`,children:_jsx(_components.p,{children:`The changes automatically propagate to all processes using that key.`})}),_jsx(Step,{title:`Updates`,children:_jsx(_components.p,{children:`Referenced components in processes will be updated to reflect the changes, but UI Designer paths require manual adjustment.`})})]})}),_jsx(Tab,{title:`Remove a Key`,id:`remove-a-key`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Access PDM`,children:_jsx(_components.p,{children:`Navigate to the Project Data Model.`})}),_jsx(Step,{title:`Remove key`,children:_jsx(_components.p,{children:`Attempt to remove a key or object.`})}),_jsx(Step,{title:`System check`,children:_jsx(_components.p,{children:`System checks if the key is in use by any process.`})}),_jsx(Step,{title:`Result`,children:_jsx(_components.p,{children:`A warning modal shows references but allows deletion.`})})]})}),_jsx(Tab,{title:`Change Type`,id:`change-type`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Access PDM`,children:_jsx(_components.p,{children:`Navigate to the Project Data Model.`})}),_jsx(Step,{title:`Change type`,children:_jsx(_components.p,{children:`Change the type of an attribute (e.g., from string to boolean).`})}),_jsx(Step,{title:`Confirmation`,children:_jsx(_components.p,{children:`System will prompt for confirmation as this might break processes.`})}),_jsxs(Step,{title:`Result`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Incompatible change`}),`: References will be broken and removed from UI templates.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Compatible change`}),`: No changes to references are required.`]})]})]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`use-the-project-data-model-in-processes`,children:`Use the Project Data Model in processes`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Navigate to a process within your project.`}),`\n`,_jsx(_components.li,{children:`Open the Process Data Model.`}),`\n`,_jsx(_components.li,{children:`Project data types are available for selection.`}),`\n`,_jsx(_components.li,{children:`Select the desired project data type to use in your process.`}),`\n`,_jsx(_components.li,{children:`The data type is added to your Process Data Model, maintaining reference to the Project Data Model.`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`work-with-libraries`,children:`Work with libraries`}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/library_pdm.png`,alt:`Library PDM`})})}),`\n`,_jsx(Heading,{level:`4`,id:`integrate-library-data-models`,children:`Integrate Library Data Models`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Navigate to your project dependencies.`}),`\n`,_jsx(_components.li,{children:`Add a library as a dependency. The library must have a build created.`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/lib_pdm_dependency.png`,alt:`Library PDM`})})}),`\n`,_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsx(_components.li,{children:`Library data types become available in your Project Data Model.`}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Library data types are not visible by default! You must select the library source in the filter to display them.`})}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:`To filter by library types you can use the “Filter by source” feature.`}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_lib_filter.png`,alt:`Library PDM`})})})]}),`\n`,_jsxs(_components.ol,{start:`4`,children:[`\n`,_jsx(_components.li,{children:`You can now use the library data types in your data model.`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/lib_pdm_flow.gif`,alt:`Library PDM`})})}),`\n`,_jsx(Heading,{level:`4`,id:`handle-duplicate-types-from-libraries`,children:`Handle duplicate types from libraries`}),`\n`,_jsx(_components.p,{children:`When multiple libraries contain data types with the same name:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Both types will be visible in the Project Data Model with visual indicators.`}),`\n`,_jsx(_components.li,{children:`Namespacing functionality will prevent technical issues.`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/lib_multiple.png`,alt:`Library PDM`})})}),`\n`,_jsx(Heading,{level:`2`,id:`configure-reporting-and-sensitive-data-settings`,children:`Configure reporting and sensitive data settings`}),`\n`,_jsx(_components.p,{children:`You can configure reporting and sensitive data settings directly from the attribute settings side panel:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Go to the Project Data Model.`}),`\n`,_jsxs(_components.li,{children:[`Select an attribute to open the `,_jsx(_components.strong,{children:`settings side panel`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Toggle `,_jsx(_components.strong,{children:`Sensitive data`}),` or `,_jsx(_components.strong,{children:`Use in Reporting`}),` as needed.`]}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_reporting_sensitive.png`,alt:`Reporting Sensitive`})})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`These settings apply to all instances of the attribute across processes.`})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`You can also access these settings from the three-dots menu in the upper right corner of the side panel → `,_jsx(_components.strong,{children:`Show details`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`project-data-model-after-version-commitment`,children:`Project Data Model after version commitment`}),`\n`,_jsx(_components.p,{children:`After committing a project version:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`The Project Data Model becomes read-only.`}),`\n`,_jsx(_components.li,{children:`You can still view the diagram and monitor usage.`}),`\n`,_jsx(_components.li,{children:`This read-only configuration is available for any configuration on committed versions and applies also to resource data models.`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_read_only.png`,alt:`PDM after version commitment`})})}),`\n`,_jsxs(_components.ol,{start:`3`,children:[`\n`,_jsx(_components.li,{children:`To make changes to the data model, you will require a new project version.`}),`\n`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_new_version.png`,alt:`PDM after version commitment`})})}),`\n`,_jsx(Heading,{level:`2`,id:`search-and-filter`,children:`Search and filter`}),`\n`,_jsx(_components.p,{children:`The Project Data Model interface provides tools to help you find and work with your data types:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Navigate to the Project Data Model.`}),`\n`,_jsx(_components.li,{children:`By default, only project-level types are displayed.`}),`\n`,_jsx(_components.li,{children:`Use filters to view library types as well.`}),`\n`,_jsx(_components.li,{children:`Use the search function to find specific types by name.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`update-library-dependencies`,children:`Update library dependencies`}),`\n`,_jsx(_components.p,{children:`When updating library dependencies:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Navigate to the dependencies section.`}),`\n`,_jsx(_components.li,{children:`Select the new library version.`}),`\n`,_jsx(_components.li,{children:`The system will inform you of any breaking changes to data types.`}),`\n`,_jsx(_components.li,{children:`You can decide whether to proceed with the update.`}),`\n`,_jsx(_components.li,{children:`If you proceed, changes will propagate to processes according to compatibility rules.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`real-world-example-insurance-claims-processing`,children:`Real-world example: Insurance claims processing`}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`This example demonstrates how an insurance company uses project data model for their claims processing system.`})}),`\n`,_jsxs(Accordion,{title:`Core data types in PDM`,id:`core-data-types-in-pdm`,children:[_jsx(_components.p,{children:`The insurance company created these data types in their Project Data Model:`}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_example2.png`,alt:`Insurance PDM`})})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Customer`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`customerId`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`firstName`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`lastName`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`dateOfBirth`}),`: date`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`contactInformation`}),`: ContactInfo (reference)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`policyNumbers`}),`: array of string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`customerSince`}),`: date`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`riskProfile`}),`: RiskProfile (reference)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Settings`}),`: Sensitive data = True, Used in reporting = True`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`ContactInfo`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`email`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`phone`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`address`}),`: Address (reference)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Settings`}),`: Sensitive data = True, Used in reporting = False`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Claim`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`claimId`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`policyNumber`}),`: string (reference to Policy)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`claimType`}),`: enum [“Auto”, “Property”, “Medical”, “Liability”]`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`incidentDate`}),`: date`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`reportedDate`}),`: date`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`status`}),`: enum [“New”, “Under Review”, “Pending Documents”, “Approved”, “Denied”, “Closed”]`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`estimatedAmount`}),`: number`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`approvedAmount`}),`: number`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`documents`}),`: array of Document (reference)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Settings`}),`: Sensitive data = False, Used in reporting = True`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Document`})}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`documentId`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`documentType`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`fileName`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`fileUrl`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`uploadDate`}),`: date`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.em,{children:`Settings`}),`: Sensitive data = False, Used in reporting = False`]}),`\n`]}),`\n`]}),`\n`]})]}),`\n`,_jsxs(Accordion,{title:`Process-specific data models`,id:`process-specific-data-models`,children:[_jsx(_components.p,{children:`The company created multiple processes using the PDM:`}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Auto Claim Processing`,id:`auto-claim-processing`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Root`}),`: ClaimProcess`]}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_example1.png`,alt:`Auto Claim Processing`})})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Data Structure`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`ClaimProcess`}),` (Process-specific type)`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`claim`}),`: Claim (reference from PDM)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`assignedAdjuster`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`vehicleInfo`}),`: AutoClaimDetails (reference)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`processingStage`}),`: enum [“Initial Review”, “Damage Assessment”, “Liability Determination”, “Settlement Negotiation”, “Payment Processing”]`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`AutoClaimDetails`}),` (Process-specific type)`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`vehicleMake`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`vehicleModel`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`vehicleYear`}),`: number`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`vin`}),`: string`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`accidentLocation`}),`: Address (reference from PDM)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`damageDescription`}),`: string`]}),`\n`]}),`\n`]}),`\n`]})]}),_jsxs(Tab,{title:`Policy Renewal Process`,id:`policy-renewal-process`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Root`}),`: RenewalProcess`]}),_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_example3.png`,alt:`Policy Renewal Process`})})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Data Structure`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`RenewalProcess`}),` (Process-specific type)`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`customer`}),`: Customer (reference from PDM)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`renewalDate`}),`: date`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`premiumChange`}),`: number`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`renewalStatus`}),`: enum [“Pending Review”, “Offer Generated”, “Offer Sent”, “Accepted”, “Declined”, “Expired”]`]}),`\n`]}),`\n`]}),`\n`]})]})]})]}),`\n`,_jsx(Accordion,{title:`Example use cases`,id:`example-use-cases`,children:_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Add an attribute`,id:`add-an-attribute`,children:[_jsx(`video`,{autoPlay:true,muted:true,loop:true,playsInline:true,src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/470/pdm_new.mp4`}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`A configurator adds a new attribute `,_jsx(_components.code,{children:`loyaltyTier`}),` to the Customer data type in the PDM.`]}),`\n`,_jsx(_components.li,{children:`This attribute is an enum [“Bronze”, “Silver”, “Gold”, “Platinum”].`}),`\n`,_jsx(_components.li,{children:`The new attribute automatically propagates to all processes using the Customer data type.`}),`\n`,_jsx(_components.li,{children:`The Policy Renewal Process now has access to the customer’s loyalty tier without any process-level changes.`}),`\n`]})]}),_jsxs(Tab,{title:`Remove a field`,id:`remove-a-field`,children:[_jsx(Frame,{caption:`Warning when trying to remove a field in use`,children:_jsx(OptimizedImage,{src:`https://mintlify.s3.us-west-1.amazonaws.com/flowxai/images/pdm-remove-warning.png`,alt:`Remove field warning`})}),_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`A configurator tries to remove the `,_jsx(_components.code,{children:`contactInformation`}),` attribute from the Customer data type.`]}),`\n`,_jsx(_components.li,{children:`The system displays a warning that the attribute is in use by multiple processes.`}),`\n`,_jsx(_components.li,{children:`The configurator is prevented from making the change until the references are resolved.`}),`\n`]})]}),_jsxs(Tab,{title:`Library integration`,id:`library-integration`,children:[_jsx(Frame,{caption:`Using a library-defined Vehicle data type`,children:_jsx(OptimizedImage,{src:`https://mintlify.s3.us-west-1.amazonaws.com/flowxai/images/pdm-library-integration.png`,alt:`Library integration`})}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`The company uses a “Common Insurance Standards” library with standardized data types.`}),`\n`,_jsx(_components.li,{children:`After setting the library as a dependency, they can use the library’s “Vehicle” data type in their PDM.`}),`\n`,_jsx(_components.li,{children:`When the library updates, the configurator can choose to adopt the changes.`}),`\n`]})]})]})}),`\n`,_jsx(Accordion,{title:`Benefits demonstrated`,id:`benefits-demonstrated`,children:_jsxs(Card,{children:[_jsx(_components.p,{children:`This example shows how the Project Data Model:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Ensures data consistency`}),`: Core entities like Customer and Policy maintain consistent structures across all processes and resources.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Promotes reusability`}),`: Common data types are defined once and reused in in multiple processes, business rules, and other resources.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Simplifies changes`}),`: Updates to data types are propagated automatically to all processes.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Enforces governance`}),`: Sensitive data is marked at the project level for consistent handling.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Allows flexibility`}),`: Process-specific data can extend the PDM while maintaining core data integrity.`]}),`\n`]})]})}),`\n`,_jsx(Heading,{level:`2`,id:`export-and-import`,children:`Export and import`}),`\n`,_jsx(_components.p,{children:`You can export and import project data types to transfer them between projects or environments.`}),`\n`,_jsx(Heading,{level:`3`,id:`exporting`,children:`Exporting`}),`\n`,_jsx(_components.p,{children:`To export project data types:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open the context menu on the Project Data Model page`}),`\n`,_jsxs(_components.li,{children:[`Select `,_jsx(_components.strong,{children:`Export`})]}),`\n`,_jsx(_components.li,{children:`The data types are downloaded as a ZIP file`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`importing`,children:`Importing`}),`\n`,_jsx(_components.p,{children:`To import project data types:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Open the context menu on the Project Data Model page`}),`\n`,_jsxs(_components.li,{children:[`Select `,_jsx(_components.strong,{children:`Import`})]}),`\n`,_jsx(_components.li,{children:`Select the ZIP file exported from another project or environment`}),`\n`,_jsxs(_components.li,{children:[`If data types with the same identifiers already exist, a `,_jsx(_components.strong,{children:`Review Resource Identifiers Conflicts`}),` modal appears`]}),`\n`,_jsxs(_components.li,{children:[`Choose a strategy for each conflicting data type (or use `,_jsx(_components.strong,{children:`Apply to all`}),`):`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Keep both`}),` - imports the data type as a new copy alongside the existing one`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Replace`}),` - overwrites the existing data type with the imported version`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Skip this one`}),` - keeps the existing data type unchanged`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`Click `,_jsx(_components.strong,{children:`Continue`}),` to complete the import`]}),`\n`]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Importing is only available for work-in-progress (WIP) project versions. You cannot import into a committed version.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`best-practices`,children:`Best practices`}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Plan before implementation`}),`: Design your Project Data Model before creating processes to ensure consistency.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Always provide example values`}),`: Example values will be used in data mapping and other operations.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Use descriptive names`}),`: Choose clear, descriptive names for data types and attributes.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Document your model`}),`: Add descriptions to data types and attributes for better understanding and for AI agents.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Consider reusability`}),`: Design data types with reusability in mind across processes and resources.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Review impact of changes`}),`: Before modifying data types, check their usage across processes.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Use libraries for cross-project standards`}),`: For data types needed across multiple projects, define them in libraries.`]})}),`\n`,_jsx(Check,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Maintain regularly`}),`: Periodically review and clean up unused data types.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`limitations`,children:`Limitations`}),`\n`,_jsxs(Expandable,{title:`Current limitations of the Project Data Model`,children:[_jsx(Warning,{children:_jsx(_components.p,{children:`Custom Data Types from the Project or Library Data Model level cannot be modified at the resource level.`})}),_jsx(Warning,{children:_jsx(_components.p,{children:`Removing or changing Data Types in use may break resources using it.`})}),_jsx(Warning,{children:_jsx(_components.p,{children:`Project Data Model becomes read-only after version commitment. This is available for any configuration on commited versions; it applies also for resources data models.`})}),_jsx(Warning,{children:_jsx(_components.p,{children:`Library builds with breaking changes to Data Types require usage review.`})}),_jsx(Info,{children:_jsx(_components.p,{children:`Data Types defined at the Project or Library level can be referenced in the data models of Processes, Reusable Functions, and Reusable UI Templates.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsx(Accordion,{title:`Cannot modify a referenced data type in process`,id:`cannot-modify-a-referenced-data-type-in-process`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Problem`,children:_jsx(_components.p,{children:`You’re trying to edit a data type from the PDM within a process, but the fields are read-only.`})}),_jsxs(Step,{title:`Solution`,children:[_jsx(_components.p,{children:`Make changes at the project level instead:`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Navigate to the Project Data Model`}),`\n`,_jsx(_components.li,{children:`Locate and edit the data type`}),`\n`,_jsx(_components.li,{children:`Save changes`}),`\n`,_jsx(_components.li,{children:`The changes will propagate to all processes`}),`\n`]})]})]})}),`\n`,_jsx(Accordion,{title:`Cannot delete a data type that is in use`,id:`cannot-delete-a-data-type-that-is-in-use`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Problem`,children:_jsx(_components.p,{children:`You’re trying to delete a data type, but receive an error that it’s in use.`})}),_jsxs(Step,{title:`Solution`,children:[_jsx(_components.p,{children:`Either:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Remove all references to the data type first`}),`\n`,_jsx(_components.li,{children:`Create a new version of your project to make the change`}),`\n`]})]})]})}),`\n`,_jsx(Accordion,{title:`References broken after type change`,id:`references-broken-after-type-change`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Problem`,children:_jsx(_components.p,{children:`After changing a data type (e.g., from string to number), references are broken in processes.`})}),_jsxs(Step,{title:`Solution`,children:[_jsx(_components.p,{children:`Review affected processes and update references manually:`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Check the warning message that lists affected processes`}),`\n`,_jsx(_components.li,{children:`Open each process`}),`\n`,_jsx(_components.li,{children:`Update UI templates or other components that referenced the changed attribute`}),`\n`]})]})]})}),`\n`,_jsx(Accordion,{title:`Library update warning about breaking changes`,id:`library-update-warning-about-breaking-changes`,children:_jsxs(Steps,{children:[_jsx(Step,{title:`Problem`,children:_jsx(_components.p,{children:`When updating a library dependency, you receive warnings about breaking changes to data types.`})}),_jsxs(Step,{title:`Solution`,children:[_jsx(_components.p,{children:`Carefully review the changes and their impact before proceeding:`}),_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Check which data types are affected`}),`\n`,_jsx(_components.li,{children:`Review how these types are used in your processes`}),`\n`,_jsx(_components.li,{children:`Decide whether to proceed with the update or maintain the current version`}),`\n`]})]})]})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`academy-courses`,children:`Academy courses`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Data Model 101 course`,icon:`graduation-cap`,href:`https://academy.flowx.ai/explore/data-model-101-0`,children:_jsx(_components.p,{children:`Learn attribute types, JSON format, and data modeling fundamentals`})}),_jsx(Card,{title:`Handle Dynamic Data course`,icon:`graduation-cap`,href:`https://academy.flowx.ai/explore/handle-dynamic-data-flowxai`,children:_jsx(_components.p,{children:`Configure dynamic dropdowns and data-driven UI from process data`})})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Academy playground`}),` — explore the `,_jsx(_components.a,{href:`https://designer-workshop-51x.playground.flowxai.dev/workspace/00000000-0000-0000-0000-000000000001/projects/248681ec-3ba4-40e1-95ce-60a0856280ff/config/a38b8942-8eaf-41aa-8e80-e32d74bc9273/processes`,children:_jsx(_components.strong,{children:`DataModel101`})}),` project for hands-on data modeling examples.`]})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Project data model","description":"Define reusable data types at the project level to ensure consistency across processes","icon":"square-binary","owner":"docs","last_reviewed":"2026-08-11T00:00:00.000Z","href":"/6.x/docs/building-blocks/project-data-model"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What is a project data model?","slug":"what-is-a-project-data-model","depth":2,"children":[]},{"title":"Key concepts","slug":"key-concepts","depth":2,"children":[]},{"title":"Benefits of project data model","slug":"benefits-of-project-data-model","depth":2,"children":[]},{"title":"How to use the project data model","slug":"how-to-use-the-project-data-model","depth":2,"children":[{"title":"Access the project data model","slug":"access-the-project-data-model","depth":3,"children":[]},{"title":"Define a project data model","slug":"define-a-project-data-model","depth":3,"children":[]},{"title":"Manage data types","slug":"manage-data-types","depth":3,"children":[]},{"title":"Add a data type","slug":"add-a-data-type","depth":4,"children":[]},{"title":"Edit a data type","slug":"edit-a-data-type","depth":3,"children":[]}]},{"title":"Attribute validations","slug":"attribute-validations","depth":2,"children":[{"title":"Add a validator","slug":"add-a-validator","depth":3,"children":[]},{"title":"Available validators by attribute type","slug":"available-validators-by-attribute-type","depth":3,"children":[]},{"title":"What each validator checks","slug":"what-each-validator-checks","depth":3,"children":[]},{"title":"Attribute path","slug":"attribute-path","depth":3,"children":[]},{"title":"Remove a data type","slug":"remove-a-data-type","depth":3,"children":[]},{"title":"Working with referenced data types","slug":"working-with-referenced-data-types","depth":3,"children":[]}]},{"title":"Common scenarios","slug":"common-scenarios","depth":2,"children":[{"title":"Use the Project Data Model in processes","slug":"use-the-project-data-model-in-processes","depth":3,"children":[]},{"title":"Work with libraries","slug":"work-with-libraries","depth":3,"children":[]},{"title":"Integrate Library Data Models","slug":"integrate-library-data-models","depth":4,"children":[]},{"title":"Handle duplicate types from libraries","slug":"handle-duplicate-types-from-libraries","depth":4,"children":[]}]},{"title":"Configure reporting and sensitive data settings","slug":"configure-reporting-and-sensitive-data-settings","depth":2,"children":[]},{"title":"Project Data Model after version commitment","slug":"project-data-model-after-version-commitment","depth":2,"children":[]},{"title":"Search and filter","slug":"search-and-filter","depth":2,"children":[]},{"title":"Update library dependencies","slug":"update-library-dependencies","depth":2,"children":[]},{"title":"Real-world example: Insurance claims processing","slug":"real-world-example-insurance-claims-processing","depth":2,"children":[]},{"title":"Export and import","slug":"export-and-import","depth":2,"children":[{"title":"Exporting","slug":"exporting","depth":3,"children":[]},{"title":"Importing","slug":"importing","depth":3,"children":[]}]},{"title":"Best practices","slug":"best-practices","depth":2,"children":[]},{"title":"Limitations","slug":"limitations","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Academy courses","slug":"academy-courses","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/flowxai/9795f3937492dd76/snippets/zendesk-verification.js","/_mintlify/custom/flowxai/93d12cb97573b7cd/snippets/intro-hero.js","/_mintlify/custom/flowxai/90103fefc8b4bea0/snippets/footer-horizon.js"],"subdomain":"flowxai","siteName":"FlowX.AI","title":"Project data model - FlowX.AI","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[{"_id":"6ae4be492e85ccd8a8a6d867","deploymentId":"694954a421c35c020852b639","questionText":"What are the data model layers?","status":"active","generatedBy":"contextual","path":"6.x/docs/building-blocks/project-data-model","createdAt":"2026-10-30T15:56:57.984Z","updatedAt":"2026-10-30T15:56:57.984Z","__v":0},{"_id":"6ae4be492e85ccd8a8a6d866","deploymentId":"694954a421c35c020852b639","questionText":"How do I define reusable data types?","status":"active","generatedBy":"contextual","path":"6.x/docs/building-blocks/project-data-model","createdAt":"2026-10-30T15:56:57.984Z","updatedAt":"2026-10-30T15:56:57.984Z","__v":0},{"_id":"6ae4be492e85ccd8a8a6d865","deploymentId":"694954a421c35c020852b639","questionText":"What is a project data model?","status":"active","generatedBy":"contextual","path":"6.x/docs/building-blocks/project-data-model","createdAt":"2026-10-30T15:56:57.984Z","updatedAt":"2026-10-30T15:56:57.984Z","__v":0}],"navMaps":{"firstHrefInVersion":{"v6.x":{"href":"/6.x/docs/building-blocks/project-data-model","matchLevel":0},"v5.9.x":{"href":"/5.9/docs/building-blocks/project-data-model","matchLevel":1},"v5.1.x":{"href":"/5.1/docs/building-blocks/project-data-model","matchLevel":1},"v4.7.x":{"href":"/4.7.x/docs/building-blocks/process/process","matchLevel":2},"v4.1.x":{"href":"/4.1.x/docs/building-blocks/process/process","matchLevel":2},"v3.x":{"href":"/3.x/docs/building-blocks/process/process","matchLevel":2}},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T15:55:57.756Z","gitLastModified":"2026-10-30T15:55:04.000Z","originalFileLocation":"6.x/docs/building-blocks/project-data-model.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Define reusable data types at the project level to ensure consistency across processes\">\u003cmeta data-mint-head name=\"application-name\" content=\"FlowX.AI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Project data model - FlowX.AI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Define reusable data types at the project level to ensure consistency across processes\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"FlowX.AI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://flowxai.mintlify.app/_mintlify/api/og/v2?division=Building+blocks\u0026amp;title=Project+data+model\u0026amp;description=Define+reusable+data+types+at+the+project+level+to+ensure+consistency+across+processes\u0026amp;theme=021ad2ee1834111be160e8a7\u0026amp;signature=26023a7a2aebf6c3c17d6268344aa348c13ca88b3358c151839c09c99ed86ee4\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Project data model - FlowX.AI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Define reusable data types at the project level to ensure consistency across processes\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://flowxai.mintlify.app/_mintlify/api/og/v2?division=Building+blocks\u0026amp;title=Project+data+model\u0026amp;description=Define+reusable+data+types+at+the+project+level+to+ensure+consistency+across+processes\u0026amp;theme=021ad2ee1834111be160e8a7\u0026amp;signature=26023a7a2aebf6c3c17d6268344aa348c13ca88b3358c151839c09c99ed86ee4\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"FlowX.AI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#fcb813\">\u003cmeta data-mint-head name=\"zd-site-verification\" content=\"94tteg5ir5of8gkb4twzh\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/6.x/docs/building-blocks/project-data-model.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.flowx.ai/#organization\",\"name\":\"FlowX.AI\",\"url\":\"https://docs.flowx.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/flowxai/38fXEM0a7v86Lg2m/logo/light.png?fit=max\u0026auto=format\u0026n=38fXEM0a7v86Lg2m\u0026q=85\u0026s=d767c06cef433b0a02f40a1f4f785eab\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.flowx.ai#website\",\"name\":\"FlowX.AI\",\"url\":\"https://docs.flowx.ai\",\"publisher\":{\"@id\":\"https://docs.flowx.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model#webpage\",\"url\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model\",\"name\":\"Project data model\",\"description\":\"Define reusable data types at the project level to ensure consistency across processes\",\"dateModified\":\"2026-10-30T15:55:04.000Z\",\"isPartOf\":{\"@id\":\"https://docs.flowx.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Building blocks\",\"item\":\"https://docs.flowx.ai/6.x/docs/building-blocks/process/process\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Project data model\",\"item\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model#article\",\"headline\":\"Project data model\",\"name\":\"Project data model\",\"description\":\"Define reusable data types at the project level to ensure consistency across processes\",\"url\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model\",\"mainEntityOfPage\":{\"@id\":\"https://docs.flowx.ai/6.x/docs/building-blocks/project-data-model#webpage\"},\"dateModified\":\"2026-10-30T15:55:04.000Z\",\"publisher\":{\"@id\":\"https://docs.flowx.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.flowx.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"FlowX.AI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"FlowX.AI","nav":{"global":null,"versions":[{"version":"v6.x","tag":"Preview","tabs":[{"tab":"Documentation","icon":"book","groups":[{"group":"Getting Started","pages":[{"title":"FlowX.AI documentation","icon":"book-open","mode":"wide","href":"/6.x/docs/introduction"},{"title":"Tutorial: Build a credit card application","sidebarTitle":"Build your first process","icon":"rocket","href":"/6.x/docs/getting-started/building-your-first-proc"},{"title":"Tutorial: Build your first workflow","sidebarTitle":"Build your first workflow","icon":"diagram-next","href":"/6.x/docs/getting-started/building-your-first-workflow"},{"title":"Tutorial: Build your first UI Flow","sidebarTitle":"Build your first UI Flow","icon":"browser","href":"/6.x/docs/getting-started/building-your-first-ui-flow"},{"title":"Glossary","icon":"book","href":"/6.x/docs/getting-started/glossary"},{"title":"Using FlowX docs with AI assistants","icon":"robot","href":"/6.x/docs/getting-started/using-flowx-docs-with-ai"}]},{"group":"Concepts","pages":[{"title":"FlowX.AI architecture: services, layers, and data flow","sidebarTitle":"FlowX.AI architecture","icon":"diagram-project","href":"/6.x/docs/platform-overview/flowx-architecture"},{"title":"FlowX.AI data architecture: which service uses which store","sidebarTitle":"Data architecture","icon":"database","href":"/6.x/docs/platform-overview/data-architecture"},{"title":"Security","icon":"shield-check","href":"/6.x/docs/platform-overview/security"},{"title":"Intro to BPMN","icon":"diagram-project","href":"/6.x/docs/platform-overview/frameworks-and-standards/business-process-industry-standards/intro-to-bpmn"},{"group":"Infrastructure technologies","icon":"server","pages":[{"title":"Intro to Elasticsearch","href":"/6.x/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-elasticsearch"},{"title":"Intro to Kafka concepts","href":"/6.x/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-kafka-concepts"},{"title":"Intro to Kubernetes","href":"/6.x/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-kubernetes"},{"title":"Intro to NGINX","href":"/6.x/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-nginx"},{"title":"Intro to Redis","href":"/6.x/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-redis"}]}]},{"group":"FlowX.AI Designer","pages":[{"title":"FlowX.AI Designer","icon":"pen-ruler","href":"/6.x/docs/flowx-designer/overview"},{"title":"Notification center","icon":"bell","href":"/6.x/docs/flowx-designer/notification-center"},{"group":"Design Assets","icon":"pen","pages":[{"title":"Themes","href":"/6.x/docs/flowx-designer/design-assets/themes"},{"title":"Fonts","href":"/6.x/docs/flowx-designer/design-assets/font-files"},{"title":"Global Media Library","href":"/6.x/docs/flowx-designer/design-assets/global-media-library"}]},{"group":"Managing a project flow","icon":"arrow-progress","pages":[{"title":"Creating a new project","href":"/6.x/docs/flowx-designer/managing-a-project-flow/creating-a-project"},{"title":"Creating and managing process definitions","href":"/6.x/docs/flowx-designer/managing-a-project-flow/creating-a-new-process-definition"},{"title":"Adding a new node","href":"/6.x/docs/flowx-designer/managing-a-project-flow/adding-a-new-node"},{"title":"Adding an action to a node","href":"/6.x/docs/flowx-designer/managing-a-project-flow/adding-an-action-to-a-node"},{"title":"Handling decisions in the flow","href":"/6.x/docs/flowx-designer/managing-a-project-flow/handling-decisions-in-the-flow"},{"title":"Adding parallel flow branches","href":"/6.x/docs/flowx-designer/managing-a-project-flow/adding-more-flow-branches"},{"title":"Creating a user interface","href":"/6.x/docs/flowx-designer/managing-a-project-flow/creating-a-user-interface"},{"title":"Moving a token backwards in a process","href":"/6.x/docs/flowx-designer/managing-a-project-flow/moving-a-token-backwards-in-a-process"},{"title":"Exporting and importing projects","href":"/6.x/docs/flowx-designer/managing-a-project-flow/export-import-a-process-definition"},{"title":"Initiating/starting processes","href":"/6.x/docs/flowx-designer/managing-a-project-flow/starting-a-process"}]}]},{"group":"Building projects","pages":[{"title":"Workspaces","icon":"building-columns","href":"/6.x/docs/projects/workspaces"},{"title":"Resources","icon":"building-wheat","href":"/6.x/docs/projects/resources"},{"title":"Reference types in resources usage","icon":"link","href":"/6.x/docs/projects/reference-types"},{"group":"Configuration","icon":"box","pages":[{"title":"Projects","href":"/6.x/docs/projects/managing-applications/application"},{"title":"Libraries","href":"/6.x/docs/projects/managing-applications/libraries"},{"title":"Versioning","href":"/6.x/docs/projects/managing-applications/versioning"},{"title":"Checking a version for issues","icon":"triangle-exclamation","href":"/6.x/docs/projects/managing-applications/checking-for-issues"},{"title":"Dependencies","href":"/6.x/docs/projects/managing-applications/dependencies"}]},{"group":"Runtime","icon":"play","pages":[{"title":"Builds","href":"/6.x/docs/projects/runtime/builds"},{"title":"Active policy","href":"/6.x/docs/projects/runtime/active-policy"},{"title":"Configuration parameters overrides","href":"/6.x/docs/projects/runtime/configuration-parameters-overrides"},{"group":"Active process","pages":[{"title":"Process instance","href":"/6.x/docs/projects/runtime/active-process/process-instance"},{"title":"Update process variables","href":"/6.x/docs/projects/runtime/active-process/update-process-variables"},{"title":"Migrate process instances","href":"/6.x/docs/projects/runtime/active-process/migrate-process-instances"},{"title":"Move tokens","href":"/6.x/docs/projects/runtime/active-process/move-token"},{"title":"Failed process start (exceptions)","href":"/6.x/docs/projects/runtime/active-process/failed-process-start"}]},{"title":"Schedules","href":"/6.x/docs/projects/runtime/scheduled-processes"},{"title":"Manage Triggers","href":"/6.x/docs/projects/runtime/manage-triggers"},{"title":"Workflow instances","icon":"diagram-project","href":"/6.x/docs/projects/runtime/workflow-instances"},{"title":"UI Flow Sessions","href":"/6.x/docs/projects/runtime/ui-flow-sessions"}]}]},{"group":"Building blocks","pages":[{"group":"Processes","icon":"network-wired","pages":[{"title":"Process Designer","href":"/6.x/docs/building-blocks/process/process"},{"title":"Process definition","href":"/6.x/docs/building-blocks/process/process-definition"},{"title":"Permission-based expressions","href":"/6.x/docs/building-blocks/process/permission-based-expressions"},{"title":"Process data model","href":"/6.x/docs/building-blocks/process/data-model"},{"title":"Data mappers","href":"/6.x/docs/building-blocks/process/data-mappers"},{"title":"Passing data between nodes","href":"/6.x/docs/building-blocks/process/passing-data-between-nodes"},{"title":"Subprocess management","href":"/6.x/docs/building-blocks/process/subprocess"},{"title":"Navigation areas","href":"/6.x/docs/building-blocks/process/navigation-areas"},{"title":"Navigation best practices","href":"/6.x/docs/building-blocks/process/navigation-best-practices"},{"title":"Process design principles","href":"/6.x/docs/building-blocks/process/design-principles"}]},{"group":"Nodes","icon":"circle-nodes","pages":[{"title":"Process nodes (BPMN)","href":"/6.x/docs/building-blocks/node/node"},{"title":"Start/end nodes","href":"/6.x/docs/building-blocks/node/start-end-node"},{"title":"Send message/receive message tasks","href":"/6.x/docs/building-blocks/node/message-send-received-task-node"},{"title":"Service Task node","href":"/6.x/docs/building-blocks/node/task-node"},{"title":"User task node","href":"/6.x/docs/building-blocks/node/user-task-node"},{"title":"Exclusive gateway","href":"/6.x/docs/building-blocks/node/exclusive-gateway-node"},{"title":"Parallel gateway","href":"/6.x/docs/building-blocks/node/parallel-gateway"},{"group":"Call subprocess tasks","pages":[{"title":"Call activity node","href":"/6.x/docs/building-blocks/node/call-subprocess-tasks/call-activity-node"},{"title":"Start embedded subprocess","href":"/6.x/docs/building-blocks/node/call-subprocess-tasks/start-embedded-subprocess"}]},{"group":"Message events","pages":[{"title":"Message Events","href":"/6.x/docs/building-blocks/node/message-events/message-events"},{"title":"Message Start Event","href":"/6.x/docs/building-blocks/node/message-events/message-catch-start-event"},{"group":"Message intermediate events","pages":[{"title":"Message intermediate events overview","href":"/6.x/docs/building-blocks/node/message-events/message-intermediate/message-intermediate"},{"title":"Message throw intermediate event","href":"/6.x/docs/building-blocks/node/message-events/message-intermediate/message-throw-intermediate-event"},{"title":"Message catch intermediate event","href":"/6.x/docs/building-blocks/node/message-events/message-intermediate/message-catch-intermediate-event"},{"title":"Intermediate message events in business processes","href":"/6.x/docs/building-blocks/node/message-events/message-intermediate/example-intermediate-message-events"}]},{"title":"Message catch boundary events","href":"/6.x/docs/building-blocks/node/message-events/message-catch-boundary-event"}]},{"group":"Timer events","pages":[{"title":"Timer events","href":"/6.x/docs/building-blocks/node/timer-events/timer-events"},{"title":"Timer start event","href":"/6.x/docs/building-blocks/node/timer-events/timer-start-event"},{"title":"Timer Intermediate Event (interrupting)","href":"/6.x/docs/building-blocks/node/timer-events/timer-intermediate-event"},{"title":"Timer boundary event","href":"/6.x/docs/building-blocks/node/timer-events/timer-boundary-event"},{"title":"Timer expressions","href":"/6.x/docs/building-blocks/node/timer-events/timer-expressions"}]},{"title":"Error events","href":"/6.x/docs/building-blocks/node/error-events"}]},{"group":"Actions","icon":"bolt","pages":[{"title":"Node actions","href":"/6.x/docs/building-blocks/actions/actions"},{"group":"Business rule actions","pages":[{"title":"Business rules types","href":"/6.x/docs/building-blocks/actions/business-rule-action/business-rule-action"},{"title":"Extracting additional data in business rules","href":"/6.x/docs/building-blocks/actions/business-rule-action/extracting-additional-data"}]},{"title":"Send data to user interface","href":"/6.x/docs/building-blocks/actions/send-data-to-user-interface"},{"title":"Upload file action","href":"/6.x/docs/building-blocks/actions/upload-file-action"},{"title":"Start subprocess action","href":"/6.x/docs/building-blocks/actions/start-subprocess-action"},{"title":"Append params to parent process","href":"/6.x/docs/building-blocks/actions/append-params-to-parent-process"},{"title":"Kafka send action","href":"/6.x/docs/building-blocks/actions/kafka-send-action"},{"title":"Start integration workflow action","href":"/6.x/docs/building-blocks/actions/start-integration-workflow"},{"title":"Start new project instance","href":"/6.x/docs/building-blocks/actions/start-new-project-instance"},{"title":"Send notification action","href":"/6.x/docs/building-blocks/actions/send-notification-action"}]},{"group":"UI Designer","icon":"paintbrush","pages":[{"title":"UI Designer","href":"/6.x/docs/building-blocks/ui-designer/ui-designer"},{"title":"Platform-specific considerations","href":"/6.x/docs/building-blocks/ui-designer/platform-considerations"},{"title":"Screen configuration guide","href":"/6.x/docs/building-blocks/ui-designer/screen-configuration-guide"},{"title":"UI Designer best practices","href":"/6.x/docs/building-blocks/ui-designer/best-practices"},{"group":"Root components","pages":[{"title":"Root Components in UI Design","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/root-components/root-components"},{"title":"Container","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/root-components/container"},{"title":"Card","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/root-components/card"},{"title":"Custom component","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/root-components/custom"},{"title":"Global Header and Footer","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/root-components/global-header-footer"}]},{"group":"Collections UI elements","pages":[{"title":"Collection","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/collection/collection"},{"title":"Collection Prototype","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/collection/collection-prototype"}]},{"group":"Form elements","pages":[{"title":"Input field","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/input-form-field"},{"title":"Text area","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/text-area"},{"title":"Single Select","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/select-form-field"},{"title":"Multi select","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/multi-select"},{"title":"Checkbox","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/checkbox-form-field"},{"title":"Radio","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/radio-form-field"},{"title":"Switch","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/switch-form-field"},{"title":"Datepicker","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/datepicker-form-field"},{"title":"Slider","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/slider"},{"title":"Segmented button","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/form-elements/segmented-button"}]},{"title":"Buttons","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/buttons"},{"title":"Multiple file upload","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/multiple-file-upload"},{"title":"File preview","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/file-preview"},{"title":"File download","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/file-download"},{"title":"Table","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/table"},{"title":"Image","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/image"},{"title":"Indicators","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/indicators"},{"title":"Typography","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/typography"},{"title":"Chat","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/chat"},{"title":"Markdown","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/markdown"},{"title":"Separator","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/separator"},{"title":"Progress bar","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/progress-bar"},{"title":"Tooltip","href":"/6.x/docs/building-blocks/ui-designer/ui-component-types/tooltip"},{"title":"Event Handlers","href":"/6.x/docs/building-blocks/ui-designer/event-handlers"},{"title":"Validators","href":"/6.x/docs/building-blocks/ui-designer/validators"},{"title":"Dynamic \u0026 computed values","href":"/6.x/docs/building-blocks/ui-designer/dynamic-and-computed-values"},{"title":"Localization and internationalization","href":"/6.x/docs/building-blocks/ui-designer/localization-and-i18n"},{"title":"Layout configuration","href":"/6.x/docs/building-blocks/ui-designer/layout-configuration"},{"title":"Conditional styling","href":"/6.x/docs/building-blocks/ui-designer/conditional-styling"}]},{"title":"UI Flows","icon":"file-pen","href":"/6.x/docs/building-blocks/ui-flows"},{"title":"Combine UI Flows, processes, and workflows","sidebarTitle":"Combine UI Flows, processes, and workflows","description":"Connect a UI Flow, a process, and a workflow in one FlowX app. See which action starts each one, where its output lands, and what happens when a process ends.","icon":"diagram-project","href":"/6.x/docs/building-blocks/combining-ui-flows-processes-and-workflows"},{"title":"Project data model","icon":"square-binary","href":"/6.x/docs/building-blocks/project-data-model"},{"title":"Token","description":"Token represents the current position in the process flow. When you start a process, you have a graph of nodes that connect based on the defined sequence and configuration.","icon":"coins","href":"/6.x/docs/building-blocks/token"},{"title":"Supported scripts","icon":"file-code","href":"/6.x/docs/building-blocks/supported-scripts"},{"group":"Reusable resources","icon":"puzzle-piece","pages":[{"title":"Reusable Functions","href":"/6.x/docs/building-blocks/reusable-resources/reusable-functions"},{"title":"Reusable UI Templates","href":"/6.x/docs/building-blocks/reusable-resources/reusable-ui"},{"title":"Custom Components","href":"/6.x/docs/building-blocks/reusable-resources/custom-components"}]}]},{"group":"Platform deep dive","pages":[{"group":"Core components","icon":"puzzle","pages":[{"title":"FlowX.AI Engine","href":"/6.x/docs/platform-deep-dive/core-components/flowx-engine"},{"title":"FlowX.AI Advancing Controller","href":"/6.x/docs/platform-deep-dive/core-components/advancing-controller"},{"title":"FlowX.AI Events Gateway","href":"/6.x/docs/platform-deep-dive/core-components/events-gateway"}]},{"group":"Core extensions","icon":"puzzle-piece","pages":[{"group":"Content management","pages":[{"title":"FlowX.AI CMS","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/content-management"},{"title":"Enumerations","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/enumerations"},{"title":"Substitution tags","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/substitution-tags"},{"title":"Media library","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/media-library"},{"group":"Document Templates","pages":[{"title":"Document Templates","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/documents-plugin-overview"},{"title":"Generating documents","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/generating-from-html-templates"},{"title":"Managing templates","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/managing-html-templates"},{"title":"Creating and uploading a new document","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/uploading-a-new-document"},{"title":"Converting files","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/converting-documents-to-different-formats"},{"title":"Splitting documents","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/splitting-a-document"},{"title":"Combining files","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/combining-files"},{"title":"Deleting files","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/deleting-a-file"},{"title":"Getting URLs","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/getting-urls-to-documents"},{"title":"Listing stored files","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/listing-stored-files"},{"title":"Encrypting and decrypting files","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/encrypting-decrypting-files"}]},{"group":"Notification Templates","pages":[{"title":"Notification Templates","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/notifications-plugin-overview"},{"title":"Managing notification templates","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/managing-notification-templates"},{"title":"Sending a notification","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/sending-a-notification"},{"title":"Sending an email","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/sending-an-email-with-attachments"},{"title":"Forwarding notifications","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/forwarding-notifications-to-an-external-system"},{"group":"OTP flow","pages":[{"title":"Handling OTP","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/otp-flow/otp-flow"},{"title":"Generate OTP","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/otp-flow/generate-otp"},{"title":"Validate OTP","href":"/6.x/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/otp-flow/validate-otp"}]}]}]},{"group":"Task management","pages":[{"title":"Task management","href":"/6.x/docs/platform-deep-dive/core-extensions/task-management/task-management-overview"},{"title":"Task Management localization","href":"/6.x/docs/platform-deep-dive/core-extensions/task-management/task-management-localization"},{"title":"Using allocation rules","href":"/6.x/docs/platform-deep-dive/core-extensions/task-management/using-allocation-rules"},{"title":"Using out of office records","href":"/6.x/docs/platform-deep-dive/core-extensions/task-management/using-out-of-office-records"},{"title":"Using stages","href":"/6.x/docs/platform-deep-dive/core-extensions/task-management/using-stages"}]},{"title":"Configuration parameters","href":"/6.x/docs/platform-deep-dive/core-extensions/configuration-parameters"},{"title":"FlowX.AI Audit","href":"/6.x/docs/platform-deep-dive/core-extensions/audit"},{"title":"FlowX.AI Scheduler","href":"/6.x/docs/platform-deep-dive/core-extensions/scheduler"},{"title":"FlowX.AI Data Search","href":"/6.x/docs/platform-deep-dive/core-extensions/search-data-service"}]},{"group":"Plugins","icon":"puzzle-piece-simple","pages":[{"title":"FlowX custom plugins","href":"/6.x/docs/platform-deep-dive/plugins/custom-plugins"},{"title":"OCR plugin","href":"/6.x/docs/platform-deep-dive/plugins/custom-plugins/ocr-plugin"},{"group":"Reporting plugin","pages":[{"title":"Reporting plugin","href":"/6.x/docs/platform-deep-dive/plugins/custom-plugins/reporting/reporting-overview"},{"title":"Authorization \u0026 access roles","href":"/6.x/docs/platform-deep-dive/plugins/custom-plugins/reporting/access-and-authorization"}]},{"title":"WYSIWYG editor","href":"/6.x/docs/platform-deep-dive/plugins/wysiwyg"}]},{"group":"Integrations","icon":"link","pages":[{"title":"Choose how to connect FlowX.AI to external systems","sidebarTitle":"Overview","href":"/6.x/docs/platform-deep-dive/integrations/integrations-overview"},{"title":"Consuming FlowX from external apps","href":"/6.x/docs/platform-deep-dive/integrations/consuming-flowx-from-external-apps"},{"title":"Finding identifiers and parameters","href":"/6.x/docs/platform-deep-dive/integrations/finding-identifiers-and-parameters"},{"group":"Integration Designer","pages":[{"title":"Integration Designer","href":"/6.x/docs/platform-deep-dive/integrations/integration-designer"},{"title":"Workflow data model","href":"/6.x/docs/platform-deep-dive/integrations/workflow-data-models"},{"title":"Custom Agent node","href":"/6.x/docs/platform-deep-dive/integrations/custom-agent-node"},{"title":"Deep Research node","href":"/6.x/docs/platform-deep-dive/integrations/deep-research-node"},{"title":"Document classifiers","href":"/6.x/docs/platform-deep-dive/integrations/document-classifiers"},{"title":"Proxy connections","href":"/6.x/docs/platform-deep-dive/integrations/proxy-connections"},{"group":"MCP Integration","pages":[{"title":"MCP integration","href":"/6.x/docs/platform-deep-dive/integrations/mcp-integration/mcp-integration-overview"},{"title":"MCP Data Sources","href":"/6.x/docs/platform-deep-dive/integrations/mcp-integration/adding-mcp-data-source"}]},{"group":"Knowledge Base Integration","pages":[{"title":"Knowledge Base integration","href":"/6.x/docs/platform-deep-dive/integrations/knowledge-base-integration/knowledge-base-overview"},{"title":"Managing stores","href":"/6.x/docs/platform-deep-dive/integrations/knowledge-base-integration/managing-content"},{"title":"Using Knowledge Base in workflows","href":"/6.x/docs/platform-deep-dive/integrations/knowledge-base-integration/using-knowledge-base-in-workflows"},{"title":"Testing a knowledge base","href":"/6.x/docs/platform-deep-dive/integrations/knowledge-base-integration/testing-knowledge-base"}]}]},{"group":"Data sources","pages":[{"title":"FlowX Database","href":"/6.x/docs/platform-deep-dive/integrations/flowx-database"},{"title":"Unmanaged MongoDB","href":"/6.x/docs/platform-deep-dive/integrations/unmanaged-mongodb"},{"title":"Oracle Database","href":"/6.x/docs/platform-deep-dive/integrations/oracle-database"},{"title":"PostgreSQL Database","href":"/6.x/docs/platform-deep-dive/integrations/postgresql-database"},{"title":"Db2 Database","href":"/6.x/docs/platform-deep-dive/integrations/db2-database"},{"title":"Testing data sources from Runtime","href":"/6.x/docs/platform-deep-dive/integrations/testing-data-sources"},{"title":"SOAP System","href":"/6.x/docs/platform-deep-dive/integrations/soap-system"},{"title":"File Storage","href":"/6.x/docs/platform-deep-dive/integrations/file-storage"},{"title":"Email Trigger","href":"/6.x/docs/platform-deep-dive/integrations/email-trigger"},{"title":"Email Sender","href":"/6.x/docs/platform-deep-dive/integrations/email-sender"},{"title":"Microsoft Outlook","href":"/6.x/docs/platform-deep-dive/integrations/microsoft-outlook-data-source"},{"title":"Incoming Webhooks","href":"/6.x/docs/platform-deep-dive/integrations/incoming-webhooks"}]},{"group":"Custom integrations","pages":[{"title":"Building a connector","href":"/6.x/docs/platform-deep-dive/integrations/building-a-connector"},{"title":"Creating a Kafka consumer","href":"/6.x/docs/platform-deep-dive/integrations/creating-a-kafka-consumer"},{"title":"Creating a Kafka producer","href":"/6.x/docs/platform-deep-dive/integrations/creating-a-kafka-producer"}]},{"group":"Testing \u0026 monitoring","pages":[{"title":"Mock integrations","href":"/6.x/docs/platform-deep-dive/integrations/mock-integrations"},{"title":"Observability with OpenTelemetry","href":"/6.x/docs/platform-deep-dive/integrations/open-telemetry"}]}]},{"title":"Third-party components","icon":"cube","href":"/6.x/docs/platform-deep-dive/third-party-components"},{"title":"Accessibility","icon":"universal-access","href":"/6.x/docs/platform-deep-dive/accessibility"},{"group":"User roles management","icon":"user","pages":[{"title":"Swimlanes","href":"/6.x/docs/platform-deep-dive/user-roles-management/swimlanes"},{"title":"Business filters","href":"/6.x/docs/platform-deep-dive/user-roles-management/business-filters"},{"title":"Anonymous runtime access","href":"/6.x/docs/platform-deep-dive/user-roles-management/anonymous-runtime-access"}]}]},{"group":"Resources","pages":[{"title":"Error glossary","icon":"circle-exclamation","href":"/6.x/docs/resources/error-glossary"}]},{"group":"API reference","pages":[{"group":"Start processes","pages":[{"title":"Get Build Info","api":"GET https://admin.devmain.flowxai.dev/rtm/api/runtime/wks/{workspaceId}/app/{appId}/build/info","href":"/6.x/docs/api/start-process/get-build-info"},{"title":"Get build info by process instance","api":"GET {BASE_URL}/api/runtime/process-instance/{processInstanceUuid}/build/info","href":"/6.x/docs/api/start-process/build-info-by-process-instance"},{"title":"Get build info by UI flow session","api":"GET {BASE_URL}/api/runtime/ui-flow-session/{uiFlowSessionUuid}/build/info","href":"/6.x/docs/api/start-process/build-info-by-ui-flow-session"},{"title":"Start process by workspace, app, and process name","api":"POST {BASE_URL}/api/runtime/wks/{workspaceId}/app/{appId}/process-name/{processName}/start","href":"/6.x/docs/api/start-process/start-by-process-name"},{"title":"Start process by build id and process name","api":"POST https://admin.devmain.flowxai.dev/rtm/api/runtime/app/{appId}/build/{buildId}/process-name/{processDefinitionName}/start","href":"/6.x/docs/api/start-process/rest2"},{"title":"Start process and copy data from another instance","api":"POST {BASE_URL}/api/runtime/wks/{workspaceId}/app/{appId}/process-name/{processName}/start/copyDataFrom/{processInstanceId}","href":"/6.x/docs/api/start-process/start-with-copy-data"},{"title":"Start process from UI with resource definition and inherit values","api":"POST {BASE_URL}/api/runtime/wks/{workspaceId}/app/{appId}/rdi/{resourceDefinitionId}/start/inherit-from/{processInstanceId}","href":"/6.x/docs/api/start-process/start-process-rdi-inherit"}]},{"group":"Mocks","pages":[{"title":"Add new Kafka exchange mock","api":"POST {MOCK_ADAPTER_URL}/api/kafka-exchanges/","href":"/6.x/docs/api/mocks/add-kafka-mock"},{"title":"View Kafka Exchanges","api":"GET {MOCK_ADAPTER_URL}/api/kafka-exchanges","href":"/6.x/docs/api/mocks/view-kafka-exchanges"}]},{"group":"Storage","pages":[{"title":"List storage buckets","api":"GET {{documentUrl}}/internal/storage/buckets","href":"/6.x/docs/api/storage/list-buckets"},{"title":"List objects in a bucket","api":"GET {{documentURL}}/internal/storage/buckets/{BUCKET_NAME}","href":"/6.x/docs/api/storage/list-objects-in-buckets"},{"title":"Download a file","api":"GET documentURL/internal/storage/download","href":"/6.x/docs/api/storage/download-file"}]},{"title":"Clear cache","api":"POST {{baseUrlAdmin}}/api/internal/cache/clear","href":"/6.x/docs/api/clear-cache"},{"title":"Force platform rescan","api":"GET {baseUrl}/api/platform/discover","href":"/6.x/docs/api/force-rescan"},{"title":"MCP API Reference","href":"/6.x/docs/api/mcp-api-reference"}]}]},{"tab":"AI Platform","icon":"robot","pages":[{"title":"AI Platform","href":"/6.x/ai-platform/ai-in-flowx"}]},{"tab":"SDKs","icon":"code","pages":[{"title":"SDKs","href":"/6.x/sdks/sdks-overview"}]},{"tab":"Release notes","icon":"newspaper","pages":[{"title":"Release notes","href":"/release-notes/overview"}]},{"tab":"Cookbooks","icon":"utensils","pages":[{"title":"Cookbooks","href":"/6.x/cookbooks/overview"}]},{"tab":"Observatory","icon":"telescope","pages":[{"title":"Observatory","href":"/6.x/observatory/overview"}]},{"tab":"FlowX SaaS","icon":"cloud","pages":[{"title":"FlowX SaaS","href":"/6.x/docs/saas/saas-overview"}]},{"tab":"Setup guides","icon":"screwdriver-wrench","pages":[{"title":"Setup guides","href":"/6.x/setup-guides/migrate-to-flowx-ai-helm-chart"}]}]},{"version":"v5.9.x","default":true,"tag":"Latest LTS","pages":[{"title":"v5.9.x","href":"/5.9/docs/building-blocks/project-data-model"}]},{"version":"v5.1.x","tag":"LTS","pages":[{"title":"v5.1.x","href":"/5.1/docs/building-blocks/project-data-model"}]},{"version":"v4.7.x","tag":"Legacy","pages":[{"title":"v4.7.x","href":"/4.7.x/docs/building-blocks/process/process"}]},{"version":"v4.1.x","tag":"Legacy","pages":[{"title":"v4.1.x","href":"/4.1.x/docs/building-blocks/process/process"}]},{"version":"v3.x","tag":"Legacy","pages":[{"title":"v3.x","href":"/3.x/docs/building-blocks/process/process"}]}]},"basePath":"","title":"Project data model - FlowX.AI","buildId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","deploymentId":"dpl_77Hw7ZuAABM8E3WMbYAf2ohQCr3v","dynamics":["10e4515597","07c022d89b","a74be98ba7"],"chunks":["BannerMarkdown-Br4Fx2_Z.js","dist-ptfS1uB_.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-rIpTdK8h.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","Frame-CNMfPRAk.js","DynamicMarkdown-D9cdbgj9.js","zoom-image-lightbox-CqbnXZMj.js","lightbox-handle-r17bVUz3.js"]}