[{"data":1,"prerenderedAt":1641},["ShallowReactive",2],{"nav-docs":3,"page-/docs/webspace/api-overview":880,"surround-/docs/webspace/api-overview":1635,"raw-/docs/webspace/api-overview":1638},[4,56,226,546,634,773,806,863],{"title":5,"path":6,"stem":7,"children":8,"page":55},"Space Builder","/getting-started","00.getting-started",[9,13,17,23,29,33,38,42,46,50],{"title":10,"path":11,"stem":12,"children":-1},"Introducing SpaceBuilder","/getting-started/overview","00.getting-started/00.overview",{"title":14,"path":15,"stem":16,"children":-1},"Create a SetFN Account","/getting-started/create-setfn-account","00.getting-started/05.create-setfn-account",{"title":18,"path":19,"stem":20,"tags":21,"children":-1},"Installing on Linux","/getting-started/install-linux","00.getting-started/10.install-linux",[22],"recommended",{"title":24,"path":25,"stem":26,"tags":27,"children":-1},"Installing with Docker","/getting-started/install-docker","00.getting-started/12.install-docker",[28],"preparing",{"title":30,"path":31,"stem":32,"children":-1},"Installing on Windows","/getting-started/install-windows","00.getting-started/14.install-windows",{"title":34,"path":35,"stem":36,"tags":37,"children":-1},"Installing on macOS","/getting-started/install-macos","00.getting-started/16.install-macos",[28],{"title":39,"path":40,"stem":41,"children":-1},"Initial Setup","/getting-started/initial-setup","00.getting-started/20.initial-setup",{"title":43,"path":44,"stem":45,"children":-1},"License Activation","/getting-started/license-activation","00.getting-started/30.license-activation",{"title":47,"path":48,"stem":49,"children":-1},"Checking Your Access Address (Local/Internal Network)","/getting-started/access-url","00.getting-started/35.access-url",{"title":51,"path":52,"stem":53,"tags":54,"children":-1},"Choosing an External Access Method","/getting-started/access-domain","00.getting-started/40.access-domain",[22],false,{"title":57,"path":58,"stem":59,"children":60,"page":55},"Space management","/admin","10.admin",[61,74,107,136,171,184,209],{"title":62,"path":63,"stem":64,"children":65,"page":55},"Admin Home","/admin/home","10.admin/00.home",[66,70],{"title":67,"path":68,"stem":69,"children":-1},"Accessing the Admin Page","/admin/home/admin-page-access","10.admin/00.home/00.admin-page-access",{"title":71,"path":72,"stem":73,"children":-1},"License Management","/admin/home/license","10.admin/00.home/20.license",{"title":75,"path":76,"stem":77,"children":78,"page":55},"User management","/admin/user-management","10.admin/10.user-management",[79,83,87,91,95,99,103],{"title":80,"path":81,"stem":82,"children":-1},"Setting Signup Policy and Default Permissions","/admin/user-management/signup-policy","10.admin/10.user-management/02.signup-policy",{"title":84,"path":85,"stem":86,"children":-1},"Creating a User Account","/admin/user-management/invite-new-member","10.admin/10.user-management/10.invite-new-member",{"title":88,"path":89,"stem":90,"children":-1},"Editing a User Account","/admin/user-management/edit-member","10.admin/10.user-management/11.edit-member",{"title":92,"path":93,"stem":94,"children":-1},"Adding an Admin","/admin/user-management/add-new-admin","10.admin/10.user-management/12.add-new-admin",{"title":96,"path":97,"stem":98,"children":-1},"Team Management","/admin/user-management/team","10.admin/10.user-management/22.team",{"title":100,"path":101,"stem":102,"children":-1},"Level Management","/admin/user-management/level","10.admin/10.user-management/24.level",{"title":104,"path":105,"stem":106,"children":-1},"Checking Access Logs","/admin/user-management/access-log","10.admin/10.user-management/30.access-log",{"title":108,"path":109,"stem":110,"children":111,"page":55},"Service Configuration","/admin/service-config","10.admin/20.service-config",[112,116,120,124,128,132],{"title":113,"path":114,"stem":115,"children":-1},"File Area Settings","/admin/service-config/file-area","10.admin/20.service-config/10.file-area",{"title":117,"path":118,"stem":119,"children":-1},"Webhook Settings","/admin/service-config/webhook-settings","10.admin/20.service-config/16.webhook-settings",{"title":121,"path":122,"stem":123,"children":-1},"Community Settings","/admin/service-config/community-space","10.admin/20.service-config/22.community-space",{"title":125,"path":126,"stem":127,"children":-1},"AI Chatbot Policy Settings","/admin/service-config/community-ai-chatbot","10.admin/20.service-config/24.community-ai-chatbot",{"title":129,"path":130,"stem":131,"children":-1},"Email Settings","/admin/service-config/email-settings","10.admin/20.service-config/30.email-settings",{"title":133,"path":134,"stem":135,"children":-1},"Branding Settings","/admin/service-config/brand","10.admin/20.service-config/40.brand",{"title":137,"path":138,"stem":139,"children":140,"page":55},"Intelligent Service (AI)","/admin/ai","10.admin/30.ai",[141,145,149,153,159,163,167],{"title":142,"path":143,"stem":144,"children":-1},"AI Model Settings","/admin/ai/ai-model-setting","10.admin/30.ai/10.ai-model-setting",{"title":146,"path":147,"stem":148,"children":-1},"AI DB Settings","/admin/ai/ai-db-setting","10.admin/30.ai/20.ai-db-setting",{"title":150,"path":151,"stem":152,"children":-1},"Setting Up a Qdrant Server","/admin/ai/qdrant-server-setup","10.admin/30.ai/25.qdrant-server-setup",{"title":154,"path":155,"stem":156,"children":157},"Knowledge Indexing","/admin/ai/knowledge-indexing","10.admin/30.ai/30.knowledge-indexing",[158],{"title":154,"path":155,"stem":156,"children":-1},{"title":160,"path":161,"stem":162,"children":-1},"AI Integration and Policy Settings","/admin/ai/ai-link","10.admin/30.ai/40.ai-link",{"title":164,"path":165,"stem":166,"children":-1},"MCP Server Management","/admin/ai/mcp-server","10.admin/30.ai/50.mcp-server",{"title":168,"path":169,"stem":170,"children":-1},"Search Management","/admin/ai/search-management","10.admin/30.ai/60.search-management",{"title":172,"path":173,"stem":174,"children":175,"page":55},"plugin","/admin/plugin","10.admin/40.plugin",[176,180],{"title":177,"path":178,"stem":179,"children":-1},"Managing Plugins","/admin/plugin/overview","10.admin/40.plugin/00.overview",{"title":181,"path":182,"stem":183,"children":-1},"Extension Plugin Settings","/admin/plugin/settings","10.admin/40.plugin/10.settings",{"title":185,"path":186,"stem":187,"children":188,"page":55},"Security Management","/admin/security","10.admin/50.security",[189,193,197,201,205],{"title":190,"path":191,"stem":192,"children":-1},"Security Overview","/admin/security/overview","10.admin/50.security/00.overview",{"title":194,"path":195,"stem":196,"children":-1},"Checking the Audit Log","/admin/security/audit-log","10.admin/50.security/05.audit-log",{"title":198,"path":199,"stem":200,"children":-1},"Block Management","/admin/security/block-management","10.admin/50.security/10.block-management",{"title":202,"path":203,"stem":204,"children":-1},"Security Settings","/admin/security/security-setting","10.admin/50.security/12.security-setting",{"title":206,"path":207,"stem":208,"children":-1},"IP Access Restriction","/admin/security/ip-restriction","10.admin/50.security/16.ip-restriction",{"title":210,"path":211,"stem":212,"children":213,"page":55},"System management","/admin/system-admin","10.admin/60.system-admin",[214,218,222],{"title":215,"path":216,"stem":217,"children":-1},"Device Information","/admin/system-admin/device-info","10.admin/60.system-admin/10.device-info",{"title":219,"path":220,"stem":221,"children":-1},"Server Restart and System Maintenance","/admin/system-admin/server-restart","10.admin/60.system-admin/12.server-restart",{"title":223,"path":224,"stem":225,"children":-1},"Background Services","/admin/system-admin/background-service","10.admin/60.system-admin/14.background-service",{"title":227,"path":228,"stem":229,"children":230,"page":55},"Use workspace","/workspace","20.workspace",[231,264,281,337,448,495,527],{"title":232,"path":233,"stem":234,"children":235,"page":55},"menu","/workspace/menu","20.workspace/05.menu",[236,240,244,248,252,256,260],{"title":237,"path":238,"stem":239,"children":-1},"Workspace Overview","/workspace/menu/overview","20.workspace/05.menu/00.overview",{"title":241,"path":242,"stem":243,"children":-1},"Team Space","/workspace/menu/team-space","20.workspace/05.menu/05.team-space",{"title":245,"path":246,"stem":247,"children":-1},"Client Space","/workspace/menu/client-space","20.workspace/05.menu/06.client-space",{"title":249,"path":250,"stem":251,"children":-1},"Favorites","/workspace/menu/favorites","20.workspace/05.menu/10.favorites",{"title":253,"path":254,"stem":255,"children":-1},"Recent Documents","/workspace/menu/recent","20.workspace/05.menu/20.recent",{"title":257,"path":258,"stem":259,"children":-1},"External Share","/workspace/menu/external-share","20.workspace/05.menu/30.external-share",{"title":261,"path":262,"stem":263,"children":-1},"Trash","/workspace/menu/trash","20.workspace/05.menu/40.trash",{"title":265,"path":266,"stem":267,"children":268,"page":55},"Account","/workspace/account","20.workspace/10.account",[269,273,277],{"title":270,"path":271,"stem":272,"children":-1},"Sign Up and Log In","/workspace/account/signup","20.workspace/10.account/10.signup",{"title":274,"path":275,"stem":276,"children":-1},"Resetting Your Password","/workspace/account/reset-password","20.workspace/10.account/20.reset-password",{"title":278,"path":279,"stem":280,"children":-1},"Account Settings","/workspace/account/account-settings","20.workspace/10.account/30.account-settings",{"title":282,"path":283,"stem":284,"children":285,"page":55},"folder","/workspace/folder","20.workspace/20.folder",[286,290,294,298,302,308,312,316,321,325,329,333],{"title":287,"path":288,"stem":289,"children":-1},"Folder Basics","/workspace/folder/basic","20.workspace/20.folder/10.basic",{"title":291,"path":292,"stem":293,"children":-1},"Creating Multiple Folders at Once","/workspace/folder/bulk-folder-creation","20.workspace/20.folder/12.bulk-folder-creation",{"title":295,"path":296,"stem":297,"children":-1},"Filter","/workspace/folder/filter","20.workspace/20.folder/13.filter",{"title":299,"path":300,"stem":301,"children":-1},"Configuring Folder View Options","/workspace/folder/folder-view-options","20.workspace/20.folder/14.folder-view-options",{"title":303,"path":304,"stem":305,"tags":306,"children":-1},"Folder Web View","/workspace/folder/folder-web-view","20.workspace/20.folder/16.folder-web-view",[307],"hot",{"title":309,"path":310,"stem":311,"children":-1},"Folder Organization","/workspace/folder/folder-organize","20.workspace/20.folder/17.folder-organize",{"title":313,"path":314,"stem":315,"children":-1},"Folder Notice (README)","/workspace/folder/folder-readme","20.workspace/20.folder/18.folder-readme",{"title":317,"path":318,"stem":319,"tags":320,"children":-1},"Exporting Folder/File Lists","/workspace/folder/folder-export","20.workspace/20.folder/20.folder-export",[307],{"title":322,"path":323,"stem":324,"children":-1},"Setting Level-Based Access Permissions","/workspace/folder/level-access-permissions","20.workspace/20.folder/24.level-access-permissions",{"title":326,"path":327,"stem":328,"children":-1},"Setting Team-Based Access Permissions","/workspace/folder/team-access-permissions","20.workspace/20.folder/26.team-access-permissions",{"title":330,"path":331,"stem":332,"children":-1},"Folder Webhooks","/workspace/folder/webhook","20.workspace/20.folder/30.webhook",{"title":334,"path":335,"stem":336,"children":-1},"Work Automation Folder","/workspace/folder/automation","20.workspace/20.folder/40.automation",{"title":338,"path":339,"stem":340,"children":341,"page":55},"file","/workspace/file","20.workspace/30.file",[342,346,351,355,359,363,367,371,375,379,384,388,392,396,400,404,408,412,416,420,424,428,432,436,440,444],{"title":343,"path":344,"stem":345,"children":-1},"File Management Basics","/workspace/file/overview","20.workspace/30.file/00.overview",{"title":347,"path":348,"stem":349,"tags":350,"children":-1},"Checking the List While Viewing a File","/workspace/file/list-in-file","20.workspace/30.file/05.list-in-file",[307],{"title":352,"path":353,"stem":354,"children":-1},"Register disk files","/workspace/file/disk-file-registration","20.workspace/30.file/06.disk-file-registration",{"title":356,"path":357,"stem":358,"children":-1},"Viewing and Editing Text Files","/workspace/file/text-file-viewer","20.workspace/30.file/10.text-file-viewer",{"title":360,"path":361,"stem":362,"children":-1},"Viewing HTML Files","/workspace/file/html-viewer","20.workspace/30.file/11.html-viewer",{"title":364,"path":365,"stem":366,"children":-1},"Viewing and Editing CSV Files","/workspace/file/csv-viewer","20.workspace/30.file/12.csv-viewer",{"title":368,"path":369,"stem":370,"children":-1},"Viewing Image/Video Files","/workspace/file/image-file-viewer","20.workspace/30.file/13.image-file-viewer",{"title":372,"path":373,"stem":374,"children":-1},"Viewing Office/PDF Files","/workspace/file/office-viewer","20.workspace/30.file/14.office-viewer",{"title":376,"path":377,"stem":378,"children":-1},"Pasting Web Pages (HTML)","/workspace/file/paste-html","20.workspace/30.file/20.paste-html",{"title":380,"path":381,"stem":382,"tags":383,"children":-1},"Pasting Screenshots","/workspace/file/paste-screenshot","20.workspace/30.file/21.paste-screenshot",[307],{"title":385,"path":386,"stem":387,"children":-1},"Pasting Markdown (MD)","/workspace/file/paste-md","20.workspace/30.file/22.paste-md",{"title":389,"path":390,"stem":391,"children":-1},"Screen Recording","/workspace/file/screen-recording","20.workspace/30.file/23.screen-recording",{"title":393,"path":394,"stem":395,"children":-1},"File Tags","/workspace/file/file-tag","20.workspace/30.file/33.file-tag",{"title":397,"path":398,"stem":399,"children":-1},"Bulk Renaming Files","/workspace/file/bulk-name-revise","20.workspace/30.file/34.bulk-name-revise",{"title":401,"path":402,"stem":403,"children":-1},"File Conversion","/workspace/file/file-convert-overview","20.workspace/30.file/40.file-convert-overview",{"title":405,"path":406,"stem":407,"children":-1},"Template Files","/workspace/file/templates","20.workspace/30.file/41.templates",{"title":409,"path":410,"stem":411,"children":-1},"To-Do List","/workspace/file/template-todo","20.workspace/30.file/42.template-todo",{"title":413,"path":414,"stem":415,"children":-1},"Approval Form","/workspace/file/template-approval","20.workspace/30.file/43.template-approval",{"title":417,"path":418,"stem":419,"children":-1},"Kanban Board","/workspace/file/template-kanban","20.workspace/30.file/44.template-kanban",{"title":421,"path":422,"stem":423,"children":-1},"Timeline","/workspace/file/template-timeline","20.workspace/30.file/45.template-timeline",{"title":425,"path":426,"stem":427,"children":-1},"Memo","/workspace/file/template-memo","20.workspace/30.file/46.template-memo",{"title":429,"path":430,"stem":431,"children":-1},"AI Chat File","/workspace/file/ai-chat-file","20.workspace/30.file/47.ai-chat-file",{"title":433,"path":434,"stem":435,"children":-1},"Checking the File Change History","/workspace/file/audit-trail","20.workspace/30.file/50.audit-trail",{"title":437,"path":438,"stem":439,"children":-1},"File Version Control","/workspace/file/version-trail","20.workspace/30.file/51.version-trail",{"title":441,"path":442,"stem":443,"children":-1},"Edit Lock","/workspace/file/file-lock","20.workspace/30.file/52.file-lock",{"title":445,"path":446,"stem":447,"children":-1},"File Encryption","/workspace/file/file-encrypt","20.workspace/30.file/53.file-encrypt",{"title":449,"path":450,"stem":451,"children":452,"page":55},"Collaboration","/workspace/cooperation","20.workspace/35.cooperation",[453,457,461,465,470,474,478,482,487,491],{"title":454,"path":455,"stem":456,"children":-1},"File/Folder Comments","/workspace/cooperation/file-comments","20.workspace/35.cooperation/00.file-comments",{"title":458,"path":459,"stem":460,"children":-1},"Chat","/workspace/cooperation/chat","20.workspace/35.cooperation/10.chat",{"title":462,"path":463,"stem":464,"children":-1},"Collaboration Chat and Edit Lock","/workspace/cooperation/collaboration-chat","20.workspace/35.cooperation/11.collaboration-chat",{"title":466,"path":467,"stem":468,"tags":469,"children":-1},"Following a Team Member's Location","/workspace/cooperation/follow-team-location","20.workspace/35.cooperation/12.follow-team-location",[307],{"title":471,"path":472,"stem":473,"children":-1},"Mentions","/workspace/cooperation/mention","20.workspace/35.cooperation/14.mention",{"title":475,"path":476,"stem":477,"children":-1},"Direct Messages","/workspace/cooperation/dm","20.workspace/35.cooperation/16.dm",{"title":479,"path":480,"stem":481,"children":-1},"Notification Inbox","/workspace/cooperation/notification-inbox","20.workspace/35.cooperation/18.notification-inbox",{"title":483,"path":484,"stem":485,"tags":486,"children":-1},"Checking Team Activity","/workspace/cooperation/file-activity","20.workspace/35.cooperation/30.file-activity",[307],{"title":488,"path":489,"stem":490,"children":-1},"Creating an External Share Link","/workspace/cooperation/share-link-creation","20.workspace/35.cooperation/40.share-link-creation",{"title":492,"path":493,"stem":494,"children":-1},"Sending an External Share Link by Email","/workspace/cooperation/share-link-email","20.workspace/35.cooperation/42.share-link-email",{"title":496,"path":497,"stem":498,"children":499,"page":55},"Search","/workspace/search","20.workspace/40.search",[500,504,509,515,519,523],{"title":501,"path":502,"stem":503,"children":-1},"File Search","/workspace/search/search","20.workspace/40.search/00.search",{"title":505,"path":506,"stem":507,"tags":508,"children":-1},"Context Search (AI Search)","/workspace/search/context-search","20.workspace/40.search/10.context-search",[307],{"title":510,"path":511,"stem":512,"tags":513,"children":-1},"Image Search","/workspace/search/image-search","20.workspace/40.search/20.image-search",[514],"new",{"title":516,"path":517,"stem":518,"children":-1},"Chat Search","/workspace/search/chat-search","20.workspace/40.search/30.chat-search",{"title":520,"path":521,"stem":522,"children":-1},"Comment Search","/workspace/search/comment-search","20.workspace/40.search/40.comment-search",{"title":524,"path":525,"stem":526,"children":-1},"Synonym Search","/workspace/search/synonym-search","20.workspace/40.search/50.synonym-search",{"title":528,"path":529,"stem":530,"children":531,"page":55},"AI","/workspace/ai","20.workspace/50.ai",[532,536,541],{"title":533,"path":534,"stem":535,"children":-1},"AI Features Summary","/workspace/ai/overview","20.workspace/50.ai/00.overview",{"title":537,"path":538,"stem":539,"tags":540,"children":-1},"Requesting Work from the Local AI","/workspace/ai/ai-work","20.workspace/50.ai/10.ai-work",[307],{"title":542,"path":543,"stem":544,"tags":545,"children":-1},"Using External AI","/workspace/ai/external-ai","20.workspace/50.ai/20.external-ai",[514],{"title":547,"path":548,"stem":549,"children":550,"page":55},"Webspace","/webspace","40.webspace",[551,555,559,563,567,571,576,580,584,588,592,621],{"title":552,"path":553,"stem":554,"children":-1},"What is WebSpace?","/webspace/overview","40.webspace/00.overview",{"title":556,"path":557,"stem":558,"children":-1},"Deploying a Website","/webspace/website-release","40.webspace/10.website-release",{"title":560,"path":561,"stem":562,"children":-1},"Create a schema file (.sfn)","/webspace/create-database","40.webspace/20.create-database",{"title":564,"path":565,"stem":566,"children":-1},"Build APIs and deploy a database","/webspace/api-overview","40.webspace/24.api-overview",{"title":568,"path":569,"stem":570,"children":-1},"Checking the Frontend Sample","/webspace/frontend-example","40.webspace/26.frontend-example",{"title":572,"path":573,"stem":574,"tags":575,"children":-1},"Building an Internal Team Web Service","/webspace/internal-webservice","40.webspace/32.internal-webservice",[307],{"title":577,"path":578,"stem":579,"children":-1},"Building a Publicly Accessible Web Service","/webspace/external-webservice","40.webspace/34.external-webservice",{"title":581,"path":582,"stem":583,"children":-1},"Import and export SQL","/webspace/sql-converter","40.webspace/42.sql-converter",{"title":585,"path":586,"stem":587,"children":-1},"Developer Tip 2: Code Converter","/webspace/code-converter","40.webspace/44.code-converter",{"title":589,"path":590,"stem":591,"children":-1},"Performance and scaling","/webspace/performance","40.webspace/48.performance",{"title":593,"path":594,"stem":595,"children":596,"page":55},"Webspace Management","/webspace/admin","40.webspace/50.admin",[597,601,605,609,613,617],{"title":598,"path":599,"stem":600,"children":-1},"Get started with WebSpace administration","/webspace/admin/overview","40.webspace/50.admin/00.overview",{"title":602,"path":603,"stem":604,"children":-1},"Operations","/webspace/admin/operations","40.webspace/50.admin/10.operations",{"title":606,"path":607,"stem":608,"children":-1},"Workspace access","/webspace/admin/workspace-access","40.webspace/50.admin/20.workspace-access",{"title":610,"path":611,"stem":612,"children":-1},"API & site security","/webspace/admin/api-site-security","40.webspace/50.admin/30.api-site-security",{"title":614,"path":615,"stem":616,"children":-1},"Services and capacity","/webspace/admin/service-capacity","40.webspace/50.admin/40.service-capacity",{"title":618,"path":619,"stem":620,"children":-1},"Deployment management and frontend releases","/webspace/admin/deployments","40.webspace/50.admin/50.deployments",{"title":622,"path":623,"stem":624,"children":625,"page":55},"Try WebSpace","/webspace/examples","40.webspace/60.examples",[626,630],{"title":627,"path":628,"stem":629,"children":-1},"WebSpace examples","/webspace/examples/overview","40.webspace/60.examples/00.overview",{"title":631,"path":632,"stem":633,"children":-1},"Build a real-time Gomoku game","/webspace/examples/realtime-gomoku","40.webspace/60.examples/20.realtime-gomoku",{"title":635,"path":636,"stem":637,"children":638,"page":55},"Using plugin","/plugin","50.plugin",[639,643,660,704,722,752],{"title":640,"path":641,"stem":642,"children":-1},"Plugin Overview","/plugin/overview","50.plugin/00.overview",{"title":644,"path":645,"stem":646,"children":647,"page":55},"Calendar","/plugin/calendar","50.plugin/10.calendar",[648,652,656],{"title":649,"path":650,"stem":651,"children":-1},"Calendar Introduction","/plugin/calendar/overview","50.plugin/10.calendar/00.overview",{"title":653,"path":654,"stem":655,"children":-1},"Creating, Editing, and Deleting Events","/plugin/calendar/create-event","50.plugin/10.calendar/10.create-event",{"title":657,"path":658,"stem":659,"children":-1},"Checking Activity History","/plugin/calendar/file-activity","50.plugin/10.calendar/40.file-activity",{"title":661,"path":662,"stem":663,"children":664,"page":55},"Email","/plugin/email","50.plugin/20.email",[665,669,672,676,680,684,688,692,696,700],{"title":666,"path":667,"stem":668,"children":-1},"Email Introduction","/plugin/email/overview","50.plugin/20.email/00.overview",{"title":129,"path":670,"stem":671,"children":-1},"/plugin/email/setfn-email-setting","50.plugin/20.email/05.setfn-email-setting",{"title":673,"path":674,"stem":675,"children":-1},"Connect an External Email Account","/plugin/email/external-email","50.plugin/20.email/07.external-email",{"title":677,"path":678,"stem":679,"children":-1},"Basic Email Functionality","/plugin/email/email-basic","50.plugin/20.email/10.email-basic",{"title":681,"path":682,"stem":683,"children":-1},"Composing and Sending Email","/plugin/email/email-compose","50.plugin/20.email/20.email-compose",{"title":685,"path":686,"stem":687,"children":-1},"Attaching Files","/plugin/email/email-attachment","50.plugin/20.email/30.email-attachment",{"title":689,"path":690,"stem":691,"children":-1},"Mail Folder Management","/plugin/email/email-folders","50.plugin/20.email/40.email-folders",{"title":693,"path":694,"stem":695,"children":-1},"Automatic Email Classification","/plugin/email/email-auto-classify","50.plugin/20.email/50.email-auto-classify",{"title":697,"path":698,"stem":699,"children":-1},"Email File Archiving and Sharing","/plugin/email/email-open-in-space","50.plugin/20.email/60.email-open-in-space",{"title":701,"path":702,"stem":703,"children":-1},"Email Security","/plugin/email/email-security","50.plugin/20.email/70.email-security",{"title":705,"path":706,"stem":707,"children":708,"page":55},"Workflow","/plugin/workflow","50.plugin/30.workflow",[709,713,718],{"title":710,"path":711,"stem":712,"children":-1},"Workflow Introduction","/plugin/workflow/overview","50.plugin/30.workflow/00.overview",{"title":714,"path":715,"stem":716,"tags":717,"children":-1},"Creating a New Workflow","/plugin/workflow/new-workflow","50.plugin/30.workflow/10.new-workflow",[307],{"title":719,"path":720,"stem":721,"children":-1},"Checking Execution History","/plugin/workflow/execution-history","50.plugin/30.workflow/20.execution-history",{"title":723,"path":724,"stem":725,"children":726,"page":55},"Pinetuning (AI learning)","/plugin/fine-tuning","50.plugin/40.fine-tuning",[727,732,736,740,744,748],{"title":728,"path":729,"stem":730,"tags":731,"children":-1},"Fine-tuning Introduction","/plugin/fine-tuning/overview","50.plugin/40.fine-tuning/00.overview",[307],{"title":733,"path":734,"stem":735,"children":-1},"Preprocessing Training Data","/plugin/fine-tuning/pre-processing","50.plugin/40.fine-tuning/10.pre-processing",{"title":737,"path":738,"stem":739,"children":-1},"Training","/plugin/fine-tuning/training","50.plugin/40.fine-tuning/20.training",{"title":741,"path":742,"stem":743,"children":-1},"Evaluation","/plugin/fine-tuning/evaluation","50.plugin/40.fine-tuning/30.evaluation",{"title":745,"path":746,"stem":747,"children":-1},"Chat Test","/plugin/fine-tuning/chat-test","50.plugin/40.fine-tuning/40.chat-test",{"title":749,"path":750,"stem":751,"children":-1},"Export","/plugin/fine-tuning/export","50.plugin/40.fine-tuning/50.export",{"title":753,"path":754,"stem":755,"children":756,"page":55},"EDC (data collection)","/plugin/edc","50.plugin/50.edc",[757,761,765,769],{"title":758,"path":759,"stem":760,"children":-1},"EDC Introduction","/plugin/edc/overview","50.plugin/50.edc/00.overview",{"title":762,"path":763,"stem":764,"children":-1},"Data Entry, Audit Trail","/plugin/edc/data-entry","50.plugin/50.edc/10.data-entry",{"title":766,"path":767,"stem":768,"children":-1},"Builder","/plugin/edc/builder","50.plugin/50.edc/20.builder",{"title":770,"path":771,"stem":772,"children":-1},"User/Site Settings","/plugin/edc/account","50.plugin/50.edc/30.account",{"title":774,"path":775,"stem":776,"children":777,"page":55},"FAQ","/faq","99.FAQ",[778,782,786,790,794,798,802],{"title":779,"path":780,"stem":781,"children":-1},"SetFN vs Cloud Services Comparison","/faq/comparison-cloud","99.FAQ/10.comparison-cloud",{"title":783,"path":784,"stem":785,"children":-1},"SetFN vs NAS Comparison","/faq/comparison-nas","99.FAQ/20.comparison-nas",{"title":787,"path":788,"stem":789,"children":-1},"Security Policy","/faq/security-policy","99.FAQ/30.security-policy",{"title":791,"path":792,"stem":793,"children":-1},"Why Is SetFN Fast","/faq/why-fast","99.FAQ/40.why-fast",{"title":795,"path":796,"stem":797,"children":-1},"License FAQ","/faq/license-faq","99.FAQ/50.license-faq",{"title":799,"path":800,"stem":801,"children":-1},"AI Features FAQ","/faq/ai-faq","99.FAQ/60.ai-faq",{"title":803,"path":804,"stem":805,"children":-1},"Troubleshooting Guide","/faq/troubleshooting","99.FAQ/70.troubleshooting",{"title":807,"path":808,"stem":809,"children":810,"page":55},"Applied (draft)","/draft","draft",[811,815,819,823,827,831,835,839,843,847,851,855,859],{"title":812,"path":813,"stem":814,"children":-1},"Example 1. Building an Introduction Page","/draft/static-intro","draft/05.static-intro",{"title":816,"path":817,"stem":818,"children":-1},"Example 2. Building a Notice Board","/draft/public-notice-board","draft/07.public-notice-board",{"title":820,"path":821,"stem":822,"children":-1},"Example 3. Building a Coffee Chat Booking System","/draft/coffee-chat-booking","draft/08.coffee-chat-booking",{"title":824,"path":825,"stem":826,"children":-1},"Example 4. Building a Leave Request System","/draft/leave-request","draft/09.leave-request",{"title":828,"path":829,"stem":830,"children":-1},"Example 5. Building Real-Time Team Chat","/draft/team-chat","draft/10.team-chat",{"title":832,"path":833,"stem":834,"children":-1},"Example 6. Building a Job Application Intake","/draft/client-submission","draft/11.client-submission",{"title":836,"path":837,"stem":838,"children":-1},"Example 7. Building an Issue Tracker with Team and Level Conditions","/draft/crm-basic","draft/12.crm-basic",{"title":840,"path":841,"stem":842,"children":-1},"Example 8. Building a Status Filter and Stats Summary Screen","/draft/crm-search-filter","draft/13.crm-search-filter",{"title":844,"path":845,"stem":846,"children":-1},"Example 9. Building Real-Time Community Chat with Moderation","/draft/community-moderation","draft/14.community-moderation",{"title":848,"path":849,"stem":850,"children":-1},"Example 10. Building a Real-Time Attendance Check / Poll","/draft/attendance-poll","draft/15.attendance-poll",{"title":852,"path":853,"stem":854,"children":-1},"Example 11. Building a Debate Battle","/draft/debate-battle","draft/16.debate-battle",{"title":856,"path":857,"stem":858,"children":-1},"Example 13. Building an Announcement Read Receipt","/draft/announcement-read","draft/18.announcement-read",{"title":860,"path":861,"stem":862,"children":-1},"Example 14. Building an Inventory Management System","/draft/inventory-management","draft/19.inventory-management",{"title":864,"path":865,"stem":866,"children":867,"page":55},"SJAUTO","/sjauto","sjauto",[868,872,876],{"title":869,"path":870,"stem":871,"children":-1},"Access the Administrator Page","/sjauto/admin-page-access","sjauto/00.admin-page-access",{"title":873,"path":874,"stem":875,"children":-1},"Sign Up and Sign In","/sjauto/signup","sjauto/10.signup",{"title":877,"path":878,"stem":879,"children":-1},"AI Chat Files","/sjauto/ai-chat-file","sjauto/ai-chat-file",{"id":881,"title":564,"body":882,"cover":1617,"description":1618,"extension":1619,"image":1617,"meta":1620,"navigation":1622,"path":565,"seo":1623,"stem":566,"tags":1617,"thumbnail":1617,"__hash__":1634},"docs_en/40.webspace/24.api-overview.md",{"type":883,"value":884,"toc":1597},"minimal",[885,889,902,905,908,913,932,936,942,948,953,956,1033,1044,1047,1051,1074,1080,1084,1091,1135,1157,1161,1164,1170,1177,1188,1192,1203,1209,1216,1220,1226,1232,1364,1377,1381,1384,1421,1425,1428,1450,1487,1498,1502,1509,1519,1525,1531,1535,1538,1542,1563,1567],[886,887,564],"h1",{"id":888},"build-apis-and-deploy-a-database",[890,891,892,893,897,898,901],"p",{},"After creating a schema file (",[894,895,896],"code",{},".sfn","), turn the design into a working service. ",[894,899,900],{},"API Build"," prepares create, read, update, and delete APIs for every table and shows who can use each address.",[890,903,904],{},"You can also connect custom query APIs, static file APIs, and real-time events to the same service.",[906,907],"hr",{},[909,910,912],"h2",{"id":911},"before-you-begin","Before you begin",[914,915,916,920],"ul",{},[917,918,919],"li",{},"Required permission: A user with database permission",[917,921,922,923,931],{},"Prerequisite: Create a ",[924,925,927,928,930],"a",{"href":926},"./create-database","schema file (",[894,929,896],{},")"," first.",[909,933,935],{"id":934},"open-api-build","Open API Build",[890,937,938,939,941],{},"Select the ",[894,940,900],{}," tab at the top of the schema screen to review the automatically generated APIs for each table.",[890,943,944],{},[945,946],"img",{"alt":900,"src":947},"./_screenshots/schema-api-build.png",[949,950,952],"h3",{"id":951},"automatically-generated-apis","Automatically generated APIs",[890,954,955],{},"Five APIs are generated for each table by default. You can also add custom APIs when needed.",[957,958,959,975],"table",{},[960,961,962],"thead",{},[963,964,965,969,972],"tr",{},[966,967,968],"th",{},"Method",[966,970,971],{},"Endpoint",[966,973,974],{},"Description",[976,977,978,990,1000,1011,1022],"tbody",{},[963,979,980,984,987],{},[981,982,983],"td",{},"GET",[981,985,986],{},".../list",[981,988,989],{},"Retrieve a list",[963,991,992,994,997],{},[981,993,983],{},[981,995,996],{},".../view/:id",[981,998,999],{},"Retrieve one record",[963,1001,1002,1005,1008],{},[981,1003,1004],{},"POST",[981,1006,1007],{},".../create",[981,1009,1010],{},"Create a record",[963,1012,1013,1016,1019],{},[981,1014,1015],{},"PUT",[981,1017,1018],{},".../update/:id",[981,1020,1021],{},"Update a record",[963,1023,1024,1027,1030],{},[981,1025,1026],{},"DELETE",[981,1028,1029],{},".../delete/:id",[981,1031,1032],{},"Delete a record",[890,1034,1035,1036,1039,1040,1043],{},"Use ",[894,1037,1038],{},"Add new API"," to define an API with the required query and response shape. Use ",[894,1041,1042],{},"Add static file API"," to serve JSON, XML, HTML, image, and binary files from the workspace with the appropriate file type.",[890,1045,1046],{},"Feature endpoints control permissions for service-wide capabilities such as real-time sockets, file and image uploads, and AI connections.",[909,1048,1050],{"id":1049},"building-apis-beyond-crud-with-a-custom-endpoint","Building APIs beyond CRUD with a custom endpoint",[890,1052,1053,1054,1057,1058,1057,1061,1057,1064,1057,1067,1070,1071,1073],{},"When the 5 auto-generated APIs (",[894,1055,1056],{},"list","/",[894,1059,1060],{},"view",[894,1062,1063],{},"create",[894,1065,1066],{},"update",[894,1068,1069],{},"delete",") aren't enough, clicking ",[894,1072,1038],{}," lets you define behavior in much finer detail.",[890,1075,1076],{},[945,1077],{"alt":1078,"src":1079},"The basic settings screen for a custom endpoint created via Add new API — API type, action kind, target scope, and path","./_screenshots/webspace-customapi-basic.png",[949,1081,1083],{"id":1082},"action-kinds","Action kinds",[890,1085,1086,1087,1090],{},"Beyond the 5 basic CRUD actions, the ",[894,1088,1089],{},"Action kind"," dropdown also offers:",[957,1092,1093,1102],{},[960,1094,1095],{},[963,1096,1097,1099],{},[966,1098,1089],{},[966,1100,1101],{},"Meaning",[976,1103,1104,1112,1120,1128],{},[963,1105,1106,1109],{},[981,1107,1108],{},"Run action",[981,1110,1111],{},"For imperative, command-style endpoints that don't fit CRUD",[963,1113,1114,1117],{},[981,1115,1116],{},"Stats",[981,1118,1119],{},"Returns statistical results like counts, sums, or aggregates",[963,1121,1122,1125],{},[981,1123,1124],{},"Bulk",[981,1126,1127],{},"Processes multiple records in one call",[963,1129,1130,1132],{},[981,1131,749],{},[981,1133,1134],{},"Downloads query results as a file",[890,1136,1137,1140,1141,1144,1145,1148,1149,1152,1153,1156],{},[894,1138,1139],{},"Target scope"," is one of ",[894,1142,1143],{},"Collection"," (the whole table or multiple records, usually a path without ",[894,1146,1147],{},":id","), ",[894,1150,1151],{},"Single item"," (one specific record), or ",[894,1154,1155],{},"Command"," (a custom, command-style endpoint that doesn't fit CRUD).",[949,1158,1160],{"id":1159},"permissions-use-the-same-3-tiers-as-the-rest-api","Permissions use the same 3 tiers as the REST API",[890,1162,1163],{},"Custom endpoint permissions work the same way as the auto-generated APIs. The screen itself explains each option clearly.",[890,1165,1166],{},[945,1167],{"alt":1168,"src":1169},"The custom endpoint's permission picker panel: Member only / Member + extra conditions (level, team, admin, owner) / Anyone, each with an explanation","./_screenshots/webspace-customapi-permission.png",[890,1171,1172,1173,1176],{},"Choosing ",[894,1174,1175],{},"Member + extra conditions"," lets you combine level, team, admin status, and owner (self) conditions — the same way you'd restrict \"level 2 or higher\" or \"sales team only\" on an auto-generated REST endpoint, you can apply it to a custom endpoint too.",[1178,1179,1180],"note",{},[890,1181,1182,1183,1187],{},"These conditions (level/team/admin/owner) decide ",[1184,1185,1186],"em",{},"who can call"," this endpoint. There's no \"up to 3 times a day\" style rate-limit condition here — if you need one, you have to build it yourself with SQL or the function pipeline below.",[949,1189,1191],{"id":1190},"writing-raw-sql","Writing raw SQL",[890,1193,1194,1195,1198,1199,1202],{},"On the ",[894,1196,1197],{},"Function pipeline"," tab, turning on ",[894,1200,1201],{},"Custom query control"," opens an editor where you write the base SQL query this endpoint runs.",[890,1204,1205],{},[945,1206],{"alt":1207,"src":1208},"The SQL editor with Custom query control turned on, pre-filled with SELECT * FROM leave_balances WHERE 1=1;","./_screenshots/webspace-customapi-sql.png",[890,1210,1211,1212,1215],{},"The REST API list's ",[894,1213,1214],{},"SQL"," column also shows a badge marking that this endpoint runs a query you wrote directly. Conditions the auto-generated APIs can't express — like \"reject if this member has already created 3 or more rows today\" — can only be built with this SQL editor.",[949,1217,1219],{"id":1218},"controlling-flow-with-the-function-pipeline","Controlling flow with the function pipeline",[890,1221,1222,1223,1225],{},"Without writing SQL, you can also add pre-built functions to the ",[894,1224,1197],{}," in sequence to change how a request is processed. Functions fall into three stages: input processing, DB processing, and output processing.",[890,1227,1228],{},[945,1229],{"alt":1230,"src":1231},"The 11 functions available in the function pipeline, grouped into Input processing (validation, session injection, default values, input transform), DB processing (filter condition, pagination, sorting), and Output processing (hide field, rename field, add aggregate, webhook)","./_screenshots/webspace-customapi-pipeline.png",[957,1233,1234,1246],{},[960,1235,1236],{},[963,1237,1238,1241,1244],{},[966,1239,1240],{},"Category",[966,1242,1243],{},"Function",[966,1245,974],{},[976,1247,1248,1259,1272,1282,1292,1303,1313,1323,1334,1344,1354],{},[963,1249,1250,1253,1256],{},[981,1251,1252],{},"Input processing",[981,1254,1255],{},"Input validation",[981,1257,1258],{},"Validates required fields/format, returns 400 on failure",[963,1260,1261,1263,1266],{},[981,1262,1252],{},[981,1264,1265],{},"Session injection",[981,1267,1268,1269,930],{},"Auto-fills a field with a session value (e.g. ",[894,1270,1271],{},"user_id",[963,1273,1274,1276,1279],{},[981,1275,1252],{},[981,1277,1278],{},"Default values",[981,1280,1281],{},"Fills empty fields with a default value",[963,1283,1284,1286,1289],{},[981,1285,1252],{},[981,1287,1288],{},"Input transform",[981,1290,1291],{},"Transforms request field names or values",[963,1293,1294,1297,1300],{},[981,1295,1296],{},"DB processing",[981,1298,1299],{},"Filter condition",[981,1301,1302],{},"Adds a WHERE condition",[963,1304,1305,1307,1310],{},[981,1306,1296],{},[981,1308,1309],{},"Pagination",[981,1311,1312],{},"Handles limit/offset automatically",[963,1314,1315,1317,1320],{},[981,1316,1296],{},[981,1318,1319],{},"Sorting",[981,1321,1322],{},"Sets the ORDER BY clause",[963,1324,1325,1328,1331],{},[981,1326,1327],{},"Output processing",[981,1329,1330],{},"Hide field",[981,1332,1333],{},"Removes a column from the response",[963,1335,1336,1338,1341],{},[981,1337,1327],{},[981,1339,1340],{},"Rename field",[981,1342,1343],{},"Renames a key in the response JSON",[963,1345,1346,1348,1351],{},[981,1347,1327],{},[981,1349,1350],{},"Add aggregate",[981,1352,1353],{},"Adds an aggregate value like COUNT/SUM to the response",[963,1355,1356,1358,1361],{},[981,1357,1327],{},[981,1359,1360],{},"Webhook",[981,1362,1363],{},"Sends the event to an external URL",[1365,1366,1367],"warning",{},[890,1368,1369,1370,1372,1373,1376],{},"The ",[894,1371,1299],{}," function only builds a simple comparison (",[894,1374,1375],{},"WHERE column = value",") from three fields: column, operator, and value. It can't express a condition that needs aggregation, like \"the number of rows this member created today.\" We confirmed this directly — the value field is a plain input that only accepts a single fixed value. If you need that kind of condition, write it as a subquery in the SQL editor above instead.",[949,1378,1380],{"id":1379},"configure-permissions","Configure permissions",[890,1382,1383],{},"Configure access separately for each API. A member here is an existing workspace member account. You do not need to create another sign-in or authentication system because workspace members, levels, and teams are connected directly to API permissions.",[957,1385,1386,1395],{},[960,1387,1388],{},[963,1389,1390,1393],{},[966,1391,1392],{},"Permission",[966,1394,974],{},[976,1396,1397,1405,1413],{},[963,1398,1399,1402],{},[981,1400,1401],{},"Member",[981,1403,1404],{},"Any signed-in member can call the API",[963,1406,1407,1410],{},[981,1408,1409],{},"Member + additional conditions",[981,1411,1412],{},"The member must also satisfy conditions such as level, team, or administrator status",[963,1414,1415,1418],{},[981,1416,1417],{},"Anyone (except write operations)",[981,1419,1420],{},"Can be called without signing in, but create, update, and delete requests are not allowed",[909,1422,1424],{"id":1423},"deploy","Deploy",[890,1426,1427],{},"Enter the deployment information as follows.",[1429,1430,1431,1438,1444],"ol",{},[917,1432,1433,1437],{},[1434,1435,1436],"strong",{},"Database name",": Enter the logical DB name to use on the deployment server in English.",[917,1439,1440,1443],{},[1434,1441,1442],{},"Storage engine",": Select SQLite3, PostgreSQL, MySQL, or MariaDB. For an external DB, also enter the host, port, DB name, user, and password. MySQL and MariaDB use an InnoDB-based configuration.",[917,1445,1446,1449],{},[1434,1447,1448],{},"Security and deployment",":",[957,1451,1452,1461],{},[960,1453,1454],{},[963,1455,1456,1459],{},[966,1457,1458],{},"Item",[966,1460,974],{},[976,1462,1463,1479],{},[963,1464,1465,1468],{},[981,1466,1467],{},"Client deployment path",[981,1469,1470,1471,1474,1475,1478],{},"Select where the sample frontend output (",[894,1472,1473],{},"index.html",", ",[894,1476,1477],{},"test.html",", README, and other files) will be created",[963,1480,1481,1484],{},[981,1482,1483],{},"Allowed IP addresses",[981,1485,1486],{},"Specify an allowlist of IP addresses that may access the APIs",[890,1488,1489,1490,1492,1493,1497],{},"After reviewing all fields, select ",[894,1491,1424],{}," to prepare the database and APIs. If you selected a client deployment path, WebSpace also creates a sample interface for testing the APIs. Continue with ",[924,1494,1496],{"href":1495},"./frontend-example","Use the frontend example"," to modify the interface.",[909,1499,1501],{"id":1500},"api-request-examples","API request examples",[890,1503,1504,1505,1508],{},"The following examples use the ",[894,1506,1507],{},"user_profile"," table.",[1510,1511,1516],"pre",{"className":1512,"code":1514,"language":1515},[1513],"language-text","GET  /api/web/{dbName}/user_profile/list\nGET  /api/web/{dbName}/user_profile/view/{id}\nPOST /api/web/{dbName}/user_profile/create\nPUT  /api/web/{dbName}/user_profile/update/{id}\nDELETE /api/web/{dbName}/user_profile/delete/{id}\n","text",[894,1517,1514],{"__ignoreMap":1518},"",[890,1520,1521,1522,1524],{},"Create (",[894,1523,1004],{},") request example:",[1510,1526,1529],{"className":1527,"code":1528,"language":1515},[1513],"POST /api/web/{dbName}/user_profile/create\nContent-Type: application/json\n\n{\n  \"email\": \"user@example.com\",\n  \"is_active\": true\n}\n",[894,1530,1528],{"__ignoreMap":1518},[909,1532,1534],{"id":1533},"deployment-and-overwriting","Deployment and overwriting",[890,1536,1537],{},"Overwriting a schema whose database already contains data follows the server deployment policy. Your organization can prohibit it or restrict it to administrators and designated deployment operators. Before changing the structure, review affected columns and APIs and confirm backup and recovery procedures.",[909,1539,1541],{"id":1540},"good-to-know","Good to know",[914,1543,1544,1551,1554,1557,1560],{},[917,1545,1546,1547,1550],{},"APIs use SetFN sign-in sessions for authentication. Unauthenticated requests are rejected unless the API permission is set to ",[894,1548,1549],{},"Anyone",".",[917,1552,1553],{},"Changing the schema structure also updates its API endpoints. Check compatibility with existing integrations.",[917,1555,1556],{},"SQLite3 data is stored in the server's WebSpace storage. External-engine data is stored in the database configured by the administrator.",[917,1558,1559],{},"Use list filters, sorting, and page sizes only within the query ranges allowed by the server.",[917,1561,1562],{},"For calls from an external site, also check the administrator's allowed origins and CSP settings.",[909,1564,1566],{"id":1565},"related-documents","Related documents",[914,1568,1569,1576,1582,1586,1591],{},[917,1570,1571],{},[924,1572,1573,1574,930],{"href":926},"Create a schema file (",[894,1575,896],{},[917,1577,1578],{},[924,1579,1581],{"href":1580},"./examples/realtime-gomoku","Example: Build a real-time Gomoku game",[917,1583,1584],{},[924,1585,1496],{"href":1495},[917,1587,1588],{},[924,1589,589],{"href":1590},"./performance",[917,1592,1593],{},[924,1594,1596],{"href":1595},"./admin/overview","WebSpace administration",{"title":1518,"searchDepth":1598,"depth":1599,"links":1600},2,3,[1601,1602,1605,1612,1613,1614,1615,1616],{"id":911,"depth":1598,"text":912},{"id":934,"depth":1598,"text":935,"children":1603},[1604],{"id":951,"depth":1599,"text":952},{"id":1049,"depth":1598,"text":1050,"children":1606},[1607,1608,1609,1610,1611],{"id":1082,"depth":1599,"text":1083},{"id":1159,"depth":1599,"text":1160},{"id":1190,"depth":1599,"text":1191},{"id":1218,"depth":1599,"text":1219},{"id":1379,"depth":1599,"text":1380},{"id":1423,"depth":1598,"text":1424},{"id":1500,"depth":1598,"text":1501},{"id":1533,"depth":1598,"text":1534},{"id":1540,"depth":1598,"text":1541},{"id":1565,"depth":1598,"text":1566},null,"Learn how to deploy a schema file (.sfn) as a database and APIs, then verify its permissions and features.","md",{"slug":1621},"/webspace/api-overview/",true,{"title":1624,"description":1625,"ogType":1626,"twitterCard":1627,"keywords":1628},"Build APIs and deploy a database | WebSpace Docs","Connect a schema file to SQLite3, PostgreSQL, MySQL, or MariaDB and deploy it as WebSpace APIs.","article","summary_large_image",[1629,1630,1214,1631,1632,1633,1423],"build API and deploy database","API","README","DB","open API Build","A2jId0gKrVMRVpfIRKccJ8F9fiUOlfCudKNNxyXmMs0",[1636,1637],{"title":560,"path":561,"stem":562,"children":-1},{"title":568,"path":569,"stem":570,"children":-1},{"title":564,"filename":1639,"content":1640},"api-overview","# Build APIs and deploy a database\n\nAfter creating a schema file (`.sfn`), turn the design into a working service. `API Build` prepares create, read, update, and delete APIs for every table and shows who can use each address.\n\nYou can also connect custom query APIs, static file APIs, and real-time events to the same service.\n\n---\n\n## Before you begin\n\n- Required permission: A user with database permission\n- Prerequisite: Create a [schema file (`.sfn`)](./20.create-database.md) first.\n\n## Open API Build\n\nSelect the `API Build` tab at the top of the schema screen to review the automatically generated APIs for each table.\n\n![API Build](./_screenshots/schema-api-build.png)\n\n### Automatically generated APIs\n\nFive APIs are generated for each table by default. You can also add custom APIs when needed.\n\n| Method | Endpoint | Description |\n| --- | --- | --- |\n| GET | .../list | Retrieve a list |\n| GET | .../view/:id | Retrieve one record |\n| POST | .../create | Create a record |\n| PUT | .../update/:id | Update a record |\n| DELETE | .../delete/:id | Delete a record |\n\nUse `Add new API` to define an API with the required query and response shape. Use `Add static file API` to serve JSON, XML, HTML, image, and binary files from the workspace with the appropriate file type.\n\nFeature endpoints control permissions for service-wide capabilities such as real-time sockets, file and image uploads, and AI connections.\n\n## Building APIs beyond CRUD with a custom endpoint\n\nWhen the 5 auto-generated APIs (`list`/`view`/`create`/`update`/`delete`) aren't enough, clicking `Add new API` lets you define behavior in much finer detail.\n\n![The basic settings screen for a custom endpoint created via Add new API — API type, action kind, target scope, and path](./_screenshots/webspace-customapi-basic.png)\n\n### Action kinds\n\nBeyond the 5 basic CRUD actions, the `Action kind` dropdown also offers:\n\n| Action kind | Meaning |\n| --- | --- |\n| Run action | For imperative, command-style endpoints that don't fit CRUD |\n| Stats | Returns statistical results like counts, sums, or aggregates |\n| Bulk | Processes multiple records in one call |\n| Export | Downloads query results as a file |\n\n`Target scope` is one of `Collection` (the whole table or multiple records, usually a path without `:id`), `Single item` (one specific record), or `Command` (a custom, command-style endpoint that doesn't fit CRUD).\n\n### Permissions use the same 3 tiers as the REST API\n\nCustom endpoint permissions work the same way as the auto-generated APIs. The screen itself explains each option clearly.\n\n![The custom endpoint's permission picker panel: Member only / Member + extra conditions (level, team, admin, owner) / Anyone, each with an explanation](./_screenshots/webspace-customapi-permission.png)\n\nChoosing `Member + extra conditions` lets you combine level, team, admin status, and owner (self) conditions — the same way you'd restrict \"level 2 or higher\" or \"sales team only\" on an auto-generated REST endpoint, you can apply it to a custom endpoint too.\n\n::note\nThese conditions (level/team/admin/owner) decide *who can call* this endpoint. There's no \"up to 3 times a day\" style rate-limit condition here — if you need one, you have to build it yourself with SQL or the function pipeline below.\n::\n\n### Writing raw SQL\n\nOn the `Function pipeline` tab, turning on `Custom query control` opens an editor where you write the base SQL query this endpoint runs.\n\n![The SQL editor with Custom query control turned on, pre-filled with SELECT * FROM leave_balances WHERE 1=1;](./_screenshots/webspace-customapi-sql.png)\n\nThe REST API list's `SQL` column also shows a badge marking that this endpoint runs a query you wrote directly. Conditions the auto-generated APIs can't express — like \"reject if this member has already created 3 or more rows today\" — can only be built with this SQL editor.\n\n### Controlling flow with the function pipeline\n\nWithout writing SQL, you can also add pre-built functions to the `Function pipeline` in sequence to change how a request is processed. Functions fall into three stages: input processing, DB processing, and output processing.\n\n![The 11 functions available in the function pipeline, grouped into Input processing (validation, session injection, default values, input transform), DB processing (filter condition, pagination, sorting), and Output processing (hide field, rename field, add aggregate, webhook)](./_screenshots/webspace-customapi-pipeline.png)\n\n| Category | Function | Description |\n| --- | --- | --- |\n| Input processing | Input validation | Validates required fields/format, returns 400 on failure |\n| Input processing | Session injection | Auto-fills a field with a session value (e.g. `user_id`) |\n| Input processing | Default values | Fills empty fields with a default value |\n| Input processing | Input transform | Transforms request field names or values |\n| DB processing | Filter condition | Adds a WHERE condition |\n| DB processing | Pagination | Handles limit/offset automatically |\n| DB processing | Sorting | Sets the ORDER BY clause |\n| Output processing | Hide field | Removes a column from the response |\n| Output processing | Rename field | Renames a key in the response JSON |\n| Output processing | Add aggregate | Adds an aggregate value like COUNT/SUM to the response |\n| Output processing | Webhook | Sends the event to an external URL |\n\n::warning\nThe `Filter condition` function only builds a simple comparison (`WHERE column = value`) from three fields: column, operator, and value. It can't express a condition that needs aggregation, like \"the number of rows this member created today.\" We confirmed this directly — the value field is a plain input that only accepts a single fixed value. If you need that kind of condition, write it as a subquery in the SQL editor above instead.\n::\n\n### Configure permissions\n\nConfigure access separately for each API. A member here is an existing workspace member account. You do not need to create another sign-in or authentication system because workspace members, levels, and teams are connected directly to API permissions.\n\n| Permission | Description |\n| --- | --- |\n| Member | Any signed-in member can call the API |\n| Member + additional conditions | The member must also satisfy conditions such as level, team, or administrator status |\n| Anyone (except write operations) | Can be called without signing in, but create, update, and delete requests are not allowed |\n\n## Deploy\n\nEnter the deployment information as follows.\n\n1. **Database name**: Enter the logical DB name to use on the deployment server in English.\n2. **Storage engine**: Select SQLite3, PostgreSQL, MySQL, or MariaDB. For an external DB, also enter the host, port, DB name, user, and password. MySQL and MariaDB use an InnoDB-based configuration.\n3. **Security and deployment**:\n\n| Item | Description |\n| --- | --- |\n| Client deployment path | Select where the sample frontend output (`index.html`, `test.html`, README, and other files) will be created |\n| Allowed IP addresses | Specify an allowlist of IP addresses that may access the APIs |\n\nAfter reviewing all fields, select `Deploy` to prepare the database and APIs. If you selected a client deployment path, WebSpace also creates a sample interface for testing the APIs. Continue with [Use the frontend example](./26.frontend-example.md) to modify the interface.\n\n## API request examples\n\nThe following examples use the `user_profile` table.\n\n```\nGET  /api/web/{dbName}/user_profile/list\nGET  /api/web/{dbName}/user_profile/view/{id}\nPOST /api/web/{dbName}/user_profile/create\nPUT  /api/web/{dbName}/user_profile/update/{id}\nDELETE /api/web/{dbName}/user_profile/delete/{id}\n```\n\nCreate (`POST`) request example:\n\n```\nPOST /api/web/{dbName}/user_profile/create\nContent-Type: application/json\n\n{\n  \"email\": \"user@example.com\",\n  \"is_active\": true\n}\n```\n\n## Deployment and overwriting\n\nOverwriting a schema whose database already contains data follows the server deployment policy. Your organization can prohibit it or restrict it to administrators and designated deployment operators. Before changing the structure, review affected columns and APIs and confirm backup and recovery procedures.\n\n## Good to know\n\n- APIs use SetFN sign-in sessions for authentication. Unauthenticated requests are rejected unless the API permission is set to `Anyone`.\n- Changing the schema structure also updates its API endpoints. Check compatibility with existing integrations.\n- SQLite3 data is stored in the server's WebSpace storage. External-engine data is stored in the database configured by the administrator.\n- Use list filters, sorting, and page sizes only within the query ranges allowed by the server.\n- For calls from an external site, also check the administrator's allowed origins and CSP settings.\n\n## Related documents\n\n- [Create a schema file (`.sfn`)](./20.create-database.md)\n- [Example: Build a real-time Gomoku game](./60.examples/20.realtime-gomoku.md)\n- [Use the frontend example](./26.frontend-example.md)\n- [Performance and scaling](./48.performance.md)\n- [WebSpace administration](./50.admin/00.overview.md)\n",1789664756009]