If the introspection marks a field as required, and you would like to make it optional, use the setFieldNullable function on your collection.
Be wary that if your database system does not allow empty values on the specified field, updating that field on records with an empty value will result in an error.
collection.setFieldNullable('firstName');
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Forest Documentation","colors":{"primary":"#3F5B1E","light":"#DDF327","dark":"#3F5B1E"},"logo":{"light":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/Standard.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=d4e172941c964df57009cfa8be809b96","dark":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/LIME.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=91e95470256b93527860cba6c206cbc4"},"favicon":{"light":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/Standard.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=d4e172941c964df57009cfa8be809b96","dark":"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/LIME.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=91e95470256b93527860cba6c206cbc4"},"navbar":{"links":[{"href":"mailto:support@forestadmin.com","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.forestadmin.com"}},"footer":{"socials":{"twitter":"https://twitter.com/forest_admin","github":"https://github.com/ForestAdmin","linkedin":"https://linkedin.com/company/forestadmin"}},"contextual":{"options":["copy","view","claude","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"forest","hasAudioNarration":false,"actualSubdomain":"forest","customDomains":["docs.forest.app"],"gitSource":{"type":"github","owner":"forestadmin","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb428a343e8b4158140116","collectionId":"5365b6a4-fce8-4b58-90bc-27e15a3e4242","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb428a343e8b4158140116"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"DISABLED"},"CONTEXTUAL_FEEDBACK":{"status":"DISABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6adb428a343e8b4158140116","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"Legacy","count":289},{"language":"default","tag":"JavaScript Agents","count":141},{"language":"default","tag":"Ruby Agent","count":140},{"language":"default","tag":"Product","count":113},{"language":"default","tag":"Integrations","count":64},{"language":"default","tag":"Actions","count":48},{"language":"default","tag":"Smart Action Examples","count":34},{"language":"default","tag":"Process","count":32},{"language":"default","tag":"Upgrade","count":31},{"language":"default","tag":"Connect","count":30}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"support@forestadmin.com"}},"hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"product/process/fields/validation","slug":"/product/process/fields/validation","pageMetadata":{"title":"Field validation","description":null,"href":"/product/process/fields/validation"},"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`,li:`li`,p:`p`,pre:`pre`,span:`span`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Most data sources can import validation rules from their target.\nFor instance, if you are using the SQL data source:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Columns of type `,_jsx(_components.code,{children:`VARCHAR(15)`}),` will automatically carry a `,_jsx(_components.code,{children:`less than 15 chars`}),` validator`]}),`\n`,_jsxs(_components.li,{children:[`Non-nullable columns will automatically carry a `,_jsx(_components.code,{children:`Present`}),` validator`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`However, you may want to enforce stricter restrictions than the ones implemented in your data source.`}),`\n`,_jsx(Heading,{level:`2`,id:`adding-validation-rules`,children:`Adding validation rules`}),`\n`,_jsxs(_components.p,{children:[`The list of operators (`,_jsx(_components.code,{children:`Present`}),`, `,_jsx(_components.code,{children:`LongerThan`}),`, …) available when adding validators is the same as the filter operators.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`collection`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addFieldValidation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'firstName'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Present'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addFieldValidation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'firstName'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'LongerThan'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addFieldValidation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'firstName'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'ShorterThan'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`13`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addFieldValidation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'firstName'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Match'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D16969`},children:` /`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#DCDCAA`},children:`^`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:`[`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D16969`},children:`a-z`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#CE9178`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`+`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#DCDCAA`},children:`$`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D16969`},children:`/`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`i`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`custom-validators`,children:`Custom validators`}),`\n`,_jsxs(_components.p,{children:[`If you need to implement custom validators or validation over multiple fields you may use `,_jsx(_components.a,{href:`/product/process/advanced-concepts/hooks/overview`,children:`change hooks`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`make-a-field-optional`,children:`Make a field optional`}),`\n`,_jsxs(_components.p,{children:[`If the introspection marks a field as required, and you would like to make it optional, use the `,_jsx(_components.code,{children:`setFieldNullable`}),` function on your collection.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Be wary that if your database system does not allow empty values on the specified field, updating that field on records with an empty value will result in an error.`})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`collection`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`setFieldNullable`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'firstName'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})})]})}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":{"config":{},"pageMetadata":{"title":"Field validation","description":null,"href":"/product/process/fields/validation"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Adding validation rules","slug":"adding-validation-rules","depth":2,"children":[]},{"title":"Custom validators","slug":"custom-validators","depth":2,"children":[]},{"title":"Make a field optional","slug":"make-a-field-optional","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"forest","siteName":"Forest Documentation","title":"Field validation - Forest Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-15T15:39:15.364Z","originalFileLocation":"product/process/fields/validation.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=\"system\"}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=\"application-name\" content=\"Forest Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_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/forest/9euPPsOQWnB89Kt3/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Field validation - Forest Documentation\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Forest Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.forest.app/product/process/fields/validation\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://forest.mintlify.app/_mintlify/api/og/v2?division=Fields\u0026amp;title=Field+validation\u0026amp;theme=7cc620c0b37a08e7a7deb699\u0026amp;signature=8f3a52f64f2f0214fa48a81fce94d89bf2fd36a0a7eaeb812bfc694db2ab3079\">\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=\"Field validation - Forest Documentation\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://forest.mintlify.app/_mintlify/api/og/v2?division=Fields\u0026amp;title=Field+validation\u0026amp;theme=7cc620c0b37a08e7a7deb699\u0026amp;signature=8f3a52f64f2f0214fa48a81fce94d89bf2fd36a0a7eaeb812bfc694db2ab3079\">\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/forest/9euPPsOQWnB89Kt3/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Forest Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3F5B1E\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.forest.app/product/process/fields/validation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/product/process/fields/validation.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.forest.app/#organization\",\"name\":\"Forest Documentation\",\"url\":\"https://docs.forest.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/forest/ZO8t9buUjTuKyt-F/images/Standard.svg?fit=max\u0026auto=format\u0026n=ZO8t9buUjTuKyt-F\u0026q=85\u0026s=d4e172941c964df57009cfa8be809b96\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.forest.app#website\",\"name\":\"Forest Documentation\",\"url\":\"https://docs.forest.app\",\"publisher\":{\"@id\":\"https://docs.forest.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.forest.app/product/process/fields/validation#webpage\",\"url\":\"https://docs.forest.app/product/process/fields/validation\",\"name\":\"Field validation\",\"dateModified\":\"2026-10-15T15:39:15.364Z\",\"isPartOf\":{\"@id\":\"https://docs.forest.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.forest.app/product/process/fields/validation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.forest.app/product/process/fields/validation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Process\",\"item\":\"https://docs.forest.app/product/process/actions/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fields\",\"item\":\"https://docs.forest.app/product/process/fields/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Field validation\",\"item\":\"https://docs.forest.app/product/process/fields/validation\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.forest.app/product/process/fields/validation#article\",\"headline\":\"Field validation\",\"name\":\"Field validation\",\"url\":\"https://docs.forest.app/product/process/fields/validation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.forest.app/product/process/fields/validation#webpage\"},\"dateModified\":\"2026-10-15T15:39:15.364Z\",\"publisher\":{\"@id\":\"https://docs.forest.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.forest.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Forest Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Forest Documentation","nav":{"global":null,"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Get Started","pages":[{"title":"Get Started","href":"/get-started/intro-to-forest-admin"}]},{"tab":"Product","groups":[{"group":"Overview","pages":[{"title":"Product","href":"/product/overview"}]},{"group":"Connect","pages":[{"title":"Overview","href":"/get-started/connect/overview"},{"title":"Architecture","href":"/get-started/connect/architectures/self-hosted"},{"title":"Deployment options","href":"/get-started/connect/architectures/deployment-options"},{"group":"Data Sources","pages":[{"title":"Add datasources to your project","href":"/get-started/connect/data-sources/overview"},{"title":"SQL datasource","href":"/get-started/connect/data-sources/sql"},{"title":"Sequelize datasource","href":"/get-started/connect/data-sources/sequelize"},{"title":"Mongoose datasource","href":"/get-started/connect/data-sources/mongoose"},{"title":"MongoDB datasource","href":"/get-started/connect/data-sources/mongodb"},{"title":"Dummy datasource","href":"/get-started/connect/data-sources/dummy"},{"title":"ActiveRecord datasource","href":"/get-started/connect/data-sources/active-record"},{"title":"Mongoid datasource","href":"/get-started/connect/data-sources/mongoid"},{"title":"Hubspot","href":"/get-started/connect/data-sources/hubspot"},{"title":"Elasticsearch","href":"/get-started/connect/data-sources/elasticsearch"},{"title":"Airtable","href":"/get-started/connect/data-sources/airtable"},{"title":"Stripe","href":"/get-started/connect/data-sources/stripe"},{"title":"RPC","href":"/get-started/connect/data-sources/rpc"},{"title":"GraphQL / Hasura","href":"/get-started/connect/data-sources/graphql-hasura"},{"title":"CosmosDB","href":"/get-started/connect/data-sources/cosmosdb"},{"title":"Snowflake","href":"/get-started/connect/data-sources/snowflake"},{"title":"Pylon","href":"/get-started/connect/data-sources/pylon"},{"title":"Zendesk","href":"/get-started/connect/data-sources/zendesk"},{"group":"Custom datasources","pages":[{"title":"Overview","href":"/get-started/connect/data-sources/custom-datasources/overview"},{"title":"Translation","href":"/get-started/connect/data-sources/custom-datasources/translation"},{"title":"Replication","href":"/get-started/connect/data-sources/custom-datasources/replication"}]}]},{"group":"Integrations","pages":[{"title":"All integrations","href":"/get-started/connect/integrations/overview"},{"title":"MCP Connectors","href":"/get-started/connect/integrations/mcp-servers"},{"title":"Forest Gateway","href":"/product/embed/gateway"},{"title":"Standalone Forest Gateway","href":"/product/embed/gateway-standalone"},{"title":"Zendesk App","href":"/product/embed/zendesk"},{"title":"n8n Node","href":"/product/embed/n8n"}]},{"group":"Advanced Concepts","pages":[{"title":"Environment Variables","href":"/get-started/connect/environment-variables"},{"title":"Data Types","href":"/get-started/connect/data-types"},{"title":"Relationships","href":"/get-started/connect/relationships-schema"},{"title":"TypeScript Autocompletion","href":"/get-started/connect/typescript-autocompletion"},{"title":".forestadmin-schema.json","href":"/reference/schema/forestadmin-schema"}]}]},{"group":"Process","pages":[{"group":"Actions","pages":[{"title":"Overview","href":"/product/process/actions/overview"},{"title":"No-code actions","hidden":true,"href":"/product/process/actions/nocode-actions"},{"group":"Code-based actions","pages":[{"title":"Overview","href":"/product/process/actions/custom-actions/overview"},{"title":"Forms","href":"/product/process/actions/custom-actions/forms"},{"title":"Result types","href":"/product/process/actions/custom-actions/result-types"},{"title":"Context \u0026 scope","href":"/product/process/actions/custom-actions/context-scope"},{"title":"Related data invalidation","href":"/product/process/actions/custom-actions/related-data-invalidation"}]}]},{"group":"Fields","pages":[{"title":"Overview","href":"/product/process/fields/overview"},{"title":"Computed fields","href":"/product/process/fields/computed"},{"title":"Import, rename \u0026 remove fields","description":null,"href":"/product/process/fields/import-rename-remove"},{"title":"Field validation","href":"/product/process/fields/validation"},{"title":"Writing behavior","description":null,"href":"/product/process/fields/write"},{"title":"Filtering \u0026 Sorting","href":"/product/process/fields/filter"},{"title":"Binary fields","href":"/product/process/fields/binary"}]},{"group":"Segments","pages":[{"title":"Creating segments","href":"/product/process/segments/creating-segments"},{"title":"Code-based segments","href":"/product/process/segments/smart-segments/overview"}]},{"group":"Relationships","pages":[{"title":"Overview","href":"/product/process/relationships/overview"},{"title":"Single-record relationships","href":"/product/process/relationships/single-record"},{"title":"Multiple-records relationships","href":"/product/process/relationships/multiple-records"},{"title":"Computed foreign keys","href":"/product/process/relationships/computed-fks"},{"title":"Under the hood","href":"/product/process/relationships/under-the-hood"}]},{"group":"Workflows","pages":[{"title":"Workflows","href":"/product/process/workflows/overview"},{"title":"Workflow triggers","href":"/product/process/workflows/triggers"},{"title":"Forest Runtime","href":"/product/process/workflows/forest-runtime"}]},{"group":"Advanced Concepts","pages":[{"title":"Hooks","href":"/product/process/advanced-concepts/hooks/overview"},{"group":"Plugins","pages":[{"title":"Plugins","href":"/product/process/advanced-concepts/plugins/overview"},{"title":"Active Storage","href":"/product/process/advanced-concepts/plugins/active-storage"},{"title":"Pylon plugins","href":"/product/process/advanced-concepts/plugins/pylon"},{"title":"Zendesk plugins","href":"/product/process/advanced-concepts/plugins/zendesk"}]},{"title":"Testing your back-end","href":"/product/process/advanced-concepts/testing"},{"group":"Developer Workflow","pages":[{"title":"Environments \u0026 branches","href":"/product/process/advanced-concepts/developer-workflow/environments-and-branches"},{"title":"Schema updates","href":"/product/process/advanced-concepts/developer-workflow/schema-updates"},{"title":"TypeScript setup \u0026 autocompletion","href":"/product/process/advanced-concepts/developer-workflow/typescript-setup"}]}]}]},{"group":"Build","pages":[{"title":"Layout editor","href":"/product/build/layout-editor"},{"title":"Collection configuration","href":"/product/build/collection-configuration"},{"group":"Workspaces","pages":[{"title":"Workspaces","href":"/product/build/workspaces"},{"title":"Example 1: KYC","href":"/product/build/workspaces/kyc"},{"title":"Example 2: Incident Management","href":"/product/build/workspaces/incident-management"}]},{"title":"Dashboards","href":"/product/manage/dashboards"},{"title":"Fields \u0026 widgets","href":"/product/build/fields-and-widgets/overview"},{"group":"Advanced Concepts","pages":[{"title":"Layout versioning","href":"/product/build/layout-versioning"},{"title":"Smart views","href":"/product/build/custom-views/smart-views"},{"title":"Search Configuration","href":"/product/build/search-configuration"},{"title":"Pagination Configuration","href":"/product/build/pagination"}]}]},{"group":"Execute","pages":[{"title":"Browsing \u0026 searching data","href":"/product/execute/browse"},{"title":"Executing actions","href":"/product/execute/actions"},{"title":"Executing workflows","href":"/product/execute/workflows"},{"title":"Export data","href":"/product/execute/export"}]},{"group":"Collaborate","pages":[{"title":"Approval workflows","href":"/product/collaborate/approval-workflows"},{"title":"Notes","href":"/product/collaborate/notes"}]},{"group":"Manage","pages":[{"title":"Team performance","href":"/product/manage/team-performance"},{"title":"Inbox","href":"/product/manage/inbox"},{"title":"Charts","href":"/product/manage/charts/overview"},{"title":"Smart Charts","href":"/product/manage/charts/smart-charts"}]},{"group":"Embed","pages":[{"title":"Forest MCP Server","href":"/product/embed/mcp-server"},{"title":"Forest Gateway","href":"/product/embed/gateway"},{"title":"Standalone Forest Gateway","href":"/product/embed/gateway-standalone"},{"title":"Zendesk App","href":"/product/embed/zendesk"},{"title":"n8n Node","href":"/product/embed/n8n"}]},{"group":"Control","pages":[{"title":"Roles \u0026 Permissions","href":"/get-started/control/roles-permissions"},{"title":"Teams","href":"/get-started/control/teams"},{"title":"Scopes","href":"/get-started/control/scopes-and-visibility"},{"title":"Audit \u0026 Activity Logs","href":"/get-started/control/audit"},{"title":"Audit Trail","href":"/get-started/control/audit-trail"},{"group":"Authentication","pages":[{"title":"Single Sign-On (SSO)","href":"/get-started/control/authentication/sso"},{"group":"SSO Providers","pages":[{"title":"SSO Provider Guides","href":"/get-started/control/authentication/sso-providers/overview"},{"title":"Google Workspace SSO","href":"/get-started/control/authentication/sso-providers/google"},{"title":"Okta SSO","href":"/get-started/control/authentication/sso-providers/okta"},{"title":"Azure AD / Entra ID SSO","href":"/get-started/control/authentication/sso-providers/azure"},{"title":"Generic SAML 2.0 SSO","href":"/get-started/control/authentication/sso-providers/generic-saml"}]},{"title":"Two-Factor Authentication (2FA)","href":"/get-started/control/authentication/2fa"},{"group":"SCIM Provisioning","pages":[{"title":"SCIM Integration with Okta","href":"/get-started/control/authentication/scim-okta"},{"title":"SCIM Integration with OneLogin","href":"/get-started/control/authentication/scim-onelogin"},{"title":"Manual SCIM Integration with Okta","href":"/get-started/control/authentication/scim-okta-manual"}]}]},{"group":"Security","pages":[{"title":"Security \u0026 Privacy Architecture","href":"/get-started/control/security/architecture"},{"title":"IP Whitelisting","href":"/get-started/control/security/ip-whitelisting"},{"title":"Auto Logout","href":"/get-started/control/security/auto-logout"},{"title":"Two-Factor Authentication Enforcement","href":"/get-started/control/security/2fa-enforcement"}]}]},{"group":"Project Settings","pages":[{"title":"General Settings","href":"/get-started/project-settings/general"},{"title":"User Management","href":"/get-started/project-settings/users"},{"title":"Service Accounts","href":"/get-started/project-settings/service-accounts"},{"title":"Interface \u0026 Branding","href":"/get-started/project-settings/interface"},{"title":"Billing \u0026 Invoices","href":"/get-started/project-settings/billing"}]}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/overview"}]},{"tab":"Legacy","pages":[{"title":"Legacy","href":"/legacy/agents-overview"}]}]},"title":"Field validation - Forest Documentation","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":[],"chunks":[]}