> For the complete documentation index, see [llms.txt](https://docs.ninox.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ninox.com/ninox-api/api-reference/api-endpoints/pages-and-components.md).

# Pages & Components

## Create a page or component

> Creates a page or component in a module. Page, Container, Tabs, Accordion, Text, Button, FieldComponent, DynamicHTMLComponent, CustomWidget, MetricCardComponent, ChartComponent, TableComponent, KanbanComponent, GanttComponent, CalendarComponent and MapComponent can be created through the public API today. Every kind except Page must nest under an existing component via parentId.

```json
{"openapi":"3.0.0","info":{"title":"Ninox Public API","version":"1.0.0"},"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"API Key","description":"Enter your Workspace API key. \n\n API keys can be generated and managed within the **Workspace Integration** settings in the Ninox app.","in":"header","name":"Authorization","type":"http"}},"schemas":{"CreateComponentBody":{"type":"object","properties":{"afterHide":{"description":"Container directly under Tabs: script run when this tab stops being shown, 400 anywhere else. Needs schema:write plus records:write","type":"string"},"aggregation":{"type":"string","enum":["avg","count","max","median","min","sum"]},"annualRecurring":{"type":"boolean"},"arrangement":{"type":"string","enum":["grid","ltr","row","ttb"]},"background":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"beforeShow":{"description":"Container directly under Tabs: script run when this tab is shown, 400 anywhere else. Needs schema:write plus records:write","type":"string"},"border":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"style":{"type":"string","enum":["dashed","dotted","double","none","solid"]},"width":{"type":"string"}},"required":["style","width"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"calendarType":{"type":"string"},"cardBorder":{"type":"string"},"cardFont":{"type":"string"},"cardPadding":{"type":"number"},"cardRadius":{"type":"number"},"chartConfig":{"type":"object","properties":{"chartType":{"type":"string","enum":["bar","line","pie","funnel","ranking","board"]},"dataSets":{"type":"array","items":{"type":"object","properties":{"aggregation":{"type":"string","enum":["average","count","max","median","min","none","sum"]},"color":{"description":"Series color (hex string)","type":"string"},"fieldName":{"description":"Field name this series reads from","type":"string"},"labels":{"description":"Series labels (localized)","type":"object","additionalProperties":{"type":"string"}}}}},"donut":{"type":"boolean"},"labelPosition":{"type":"string","enum":["bottom","center","inside","outside","top"]},"legend":{"type":"object","properties":{"show":{"type":"boolean"}}},"limit":{"description":"ranking only: how many categories it shows","type":"integer","minimum":1,"maximum":20},"orientation":{"type":"string","enum":["horizontal","vertical"]},"showDataTable":{"type":"boolean"},"showLabels":{"type":"boolean"},"showPoints":{"type":"boolean"},"showTitle":{"type":"boolean"},"smooth":{"type":"boolean"},"stacked":{"type":"boolean"},"style":{"type":"string","enum":["default","half_donut","pad_angle","rounded_corner"]},"tooltips":{"type":"object","properties":{"show":{"type":"boolean"}}},"xAxis":{"type":"object","properties":{"fieldName":{"description":"X-axis field name, null removes it","type":["string","null"]},"groupBy":{"type":"string","enum":["daily","monthly","none","quarterly","weekly","yearly"]},"show":{"type":"boolean"}}},"yAxis":{"type":"object","properties":{"show":{"type":"boolean"}}}}},"color":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"colorFieldName":{"type":"string"},"constraints":{"description":"FieldComponent: script limiting which records a reference can link to, needs schema:manage-permissions","type":"string"},"content":{"anyOf":[{"type":"object","additionalProperties":{"type":"string","minLength":1,"maxLength":100}},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"customStyle":{"type":"object","additionalProperties":{}},"dataPoint":{"type":"string","enum":["conditional","normal"]},"defaultValue":{"description":"InputComponent: initial value, or { $nx: <script> } which needs schema:write plus records:write","anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"display":{"type":"object","properties":{"color":{"type":"string"},"format":{"type":"string","enum":["compact","currency","number","percentage"]},"icon":{"type":"string"},"trend":{"type":"object","properties":{"customPeriodEnd":{"type":"string"},"customPeriodStart":{"type":"string"},"format":{"type":"string","enum":["absolute","percentage"]},"isShown":{"type":"boolean"},"period":{"type":"string","enum":["custom","last_month","last_week","last_year","previous_period","yesterday"]},"positiveDirection":{"type":"string","enum":["down","up"]}},"required":["format","isShown"]}}},"displayAs":{"description":"FieldComponent: how a yes/no field is shown","type":"string","enum":["checkbox","dropdown","switch","tabs"]},"expression":{"description":"DynamicHTMLComponent: script returning the HTML to render. Needs schema:write plus records:write","type":"string"},"fieldIdDataPoint":{"type":"string","enum":["conditional","normal"]},"fieldIdValue":{"description":"MetricCardComponent: script computing the value. Needs schema:write plus records:write","type":"string"},"fieldName":{"type":"string"},"filter":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"id":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}},"required":["id"]}},"flex":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"ganttConfig":{"type":"object","properties":{"baselineEndFieldName":{"description":"Planned end field, rendered as a ghost bar","type":["string","null"]},"baselineStartFieldName":{"description":"Planned start field, rendered as a ghost bar","type":["string","null"]},"dependencyDirection":{"type":"string","enum":["predecessor","successor"]},"dependencyFieldName":{"description":"A reference field pointing back at this table","type":["string","null"]},"disableDragAndDrop":{"type":"boolean"},"endFieldName":{"type":["string","null"]},"hideTitleColumn":{"type":"boolean"},"hideWeekends":{"type":"boolean"},"milestoneFieldName":{"type":["string","null"]},"progressFieldName":{"type":["string","null"]},"showCriticalPath":{"type":"boolean"},"showWeekends":{"type":"boolean"},"startFieldName":{"type":["string","null"]},"timeScale":{"type":"string","enum":["day","month","quarter","week"]},"titleColumnFieldName":{"type":["string","null"]},"titleColumnWidth":{"type":"number"}}},"gap":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"globalFilterBinding":{"type":"array","items":{"type":"string"}},"gridPreset":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"groupByFieldName":{"type":"string"},"height":{"type":"number"},"icon":{"description":"Page icon","type":"object","properties":{"color":{"type":"string"},"filling":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","minLength":1}}},"iconLeft":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"filling":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","minLength":1}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"iconRight":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"filling":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","minLength":1}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"imagePosition":{"type":"object","properties":{"position":{"type":"string"},"size":{"type":"string"}}},"isCompact":{"type":"boolean"},"isHidden":{"description":"Page: hide from navigation","type":"boolean"},"isMarkdownEnabled":{"type":"boolean"},"isSpreadsheetMode":{"type":"boolean"},"labelPosition":{"type":"string","enum":["hidden","inside","left","top"]},"labels":{"description":"Component labels (localized)","type":"object","additionalProperties":{"type":"string","minLength":1,"maxLength":100}},"mapTypeId":{"type":"string"},"margin":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-z0-9_]+$","description":"Component name"},"onChange":{"description":"Tabs/FieldComponent: script run when the value changes. Needs schema:write plus records:write","type":"string"},"onClick":{"description":"Button: script run on click. Needs schema:write plus records:write","type":"string"},"overflow":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"padding":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"parentId":{"description":"Parent component id, required unless type is 'Page' (a Page's parent may also be its table's object id)","type":"string","minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$"},"placeholder":{"anyOf":[{"type":"object","additionalProperties":{"type":"string","minLength":1,"maxLength":100}},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"quickStyle":{"anyOf":[{"type":"string","enum":["body-md","body-sm","custom","title-lg","title-md","title-sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"radius":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"remember":{"description":"InputComponent: how long the value is kept, defaults to memory","type":"string","enum":["localStorage","memory","url"]},"shadow":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"shadowDom":{"type":"boolean"},"showAs":{"type":"string"},"showBulkActions":{"type":"boolean"},"showCalendarType":{"type":"boolean"},"showCreateButton":{"type":"boolean"},"showCreateRow":{"type":"boolean"},"showDataAs":{"description":"FieldComponent: script formatting a linked record. Needs schema:write plus records:write","type":"string"},"showEmptyLane":{"type":"boolean"},"showLinkExistingRecord":{"type":"boolean"},"showMetadata":{"type":"boolean"},"showOutlines":{"description":"Page: show layout outlines in the editor","type":"boolean"},"showSearchField":{"type":"boolean"},"showTimeScaleSelector":{"type":"boolean"},"showTitle":{"type":"boolean"},"size":{"anyOf":[{"type":"string","enum":["lg","md","sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"tableName":{"description":"Table this component reads from","type":"string"},"textAlign":{"type":"string","enum":["text-center","text-left","text-right"]},"titleFieldName":{"type":"string"},"tooltip":{"type":"string"},"type":{"type":"string","enum":["Accordion","Button","CalendarComponent","ChartComponent","Container","CustomWidget","DynamicHTMLComponent","FieldComponent","GanttComponent","InputComponent","KanbanComponent","MapComponent","MetricCardComponent","Page","TableComponent","Tabs","Text"],"description":"Component type"},"value":{"description":"Script used instead of table/filter/… when dataPoint is conditional. Needs schema:write plus records:write","type":"string"},"valueSpec":{"oneOf":[{"type":"object","properties":{"refTableName":{"type":"string","minLength":1},"type":{"type":"string","enum":["reference"]}},"required":["refTableName","type"],"additionalProperties":false},{"type":"object","properties":{"emailBody":{"type":"string"},"emailSubject":{"type":"string"},"maxLength":{"type":"number"},"minLength":{"type":"number"},"type":{"type":"string","enum":["string"]},"variant":{"type":"string","enum":["email","location","multiline-text","phone","text","url"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"max":{"type":"number"},"min":{"type":"number"},"numberFormat":{"type":"object","additionalProperties":{}},"type":{"type":"string","enum":["number"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string"},"icon":{"type":"object","properties":{"color":{"type":"string"},"filling":{"type":"number","enum":[0,1]},"icon":{"type":"string"}},"required":["icon"],"additionalProperties":false},"id":{"type":"string"},"order":{"type":"number"},"textColor":{"type":"string"},"label":{"type":"string"},"labels":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id"],"additionalProperties":false}},"type":{"type":"string","enum":["choice","multi"]}},"required":["options","type"],"additionalProperties":false},{"type":"object","properties":{"optionColor":{"type":"string"},"optionIcon":{"type":"string"},"optionName":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["dchoice","dmulti"]}},"required":["options","type"],"additionalProperties":false},{"type":"object","properties":{"timeintervalFormat":{"type":"string"},"type":{"type":"string","enum":["timeinterval"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"timeFormat":{"type":"string"},"type":{"type":"string","enum":["time"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["file"]},"variant":{"type":"string","enum":["signature"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["appointment","boolean","color","date","html","icon","timestamp","user"]}},"required":["type"],"additionalProperties":false}],"description":"InputComponent: the type of the value, shaped like a field type, e.g. { type: \"choice\", options: [...] }"},"valueType":{"description":"InputComponent: legacy value type, valueSpec wins where both are given","type":"string","enum":["any","appointment","boolean","color","date","html","icon","number","string","time","timeinterval","timestamp"]},"variant":{"anyOf":[{"type":"string","enum":["","email","location","multiline-text","phone","slider","switch","text","url","bordered","default","faded","flat","ghost","light","shadow","solid","splitted","underlined"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"view":{"type":"object","properties":{"columns":{"description":"View columns","type":"array","items":{"type":"object","properties":{"agg":{"description":"Aggregation function applied to the column","type":"string"},"conditionalStyling":{"description":"Legacy per-column conditional styling rules","type":"array","items":{"type":"object","properties":{"background":{"description":"Background color (hex string)","type":"string"},"cell":{"description":"Target cell","type":"string"},"color":{"description":"Icon color (hex string)","type":"string"},"icon":{"description":"Icon name","type":"string"},"operand":{"type":"string","description":"Comparator"},"value":{"type":"string","description":"Value compared against"}},"required":["operand","value"]}},"field":{"type":"string","description":"Field name, or a script expression for a calculated column"},"hidden":{"description":"Column retained but hidden from the grid","type":"boolean"},"id":{"description":"Stable identity of a calculated column; send it back unchanged when updating the view","type":"string"},"labels":{"description":"Column labels (localized)","type":"object","additionalProperties":{"type":"string"}},"order":{"type":"number","description":"Column display order"},"role":{"description":"Column role (e.g. title, date, image, location, color)","type":"string"},"width":{"description":"Column width","type":"number"}},"required":["field","order"]}},"conditionalFormatting":{"description":"Conditional formatting rules","type":"array","items":{"type":"object","properties":{"backgroundColor":{"description":"Background color (hex string)","type":"string"},"bold":{"description":"Bold text","type":"boolean"},"comparator":{"type":"string","enum":["contains","does_not_contain","ends_with","gt","gte","is","is_empty","is_not","is_not_empty","logic","lt","lte","starts_with"],"description":"Comparator"},"expression":{"description":"Script expression, used only when comparator is 'logic'","type":"string"},"fieldName":{"type":"string","description":"Target field name"},"highlightColor":{"description":"Highlight color (hex string)","type":"string"},"icon":{"description":"Icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"id":{"type":"string","description":"Stable rule id"},"italic":{"description":"Italic text","type":"boolean"},"order":{"type":"number","description":"Rule evaluation order"},"strikethrough":{"description":"Strikethrough text","type":"boolean"},"target":{"type":"string","enum":["cell","row"],"description":"Whether the rule styles a single cell or the whole row"},"textColor":{"description":"Text color (hex string)","type":"string"},"value":{"description":"Value compared against"}},"required":["comparator","fieldName","id","order","target"]}},"filter":{"description":"Stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"groupBy":{"description":"Grouping configuration","type":"array","items":{"type":"object","properties":{"direction":{"description":"Group order direction, defaults to ascending","type":"string","enum":["asc","desc"]},"fieldName":{"type":"string","description":"Field name"}},"required":["fieldName"]}},"sort":{"description":"Sort configuration","type":"object","properties":{"direction":{"type":"string","enum":["asc","desc"],"description":"Sort direction"},"fieldName":{"type":"string","description":"Field name"}},"required":["direction","fieldName"]}}},"visible":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"visibleRoles":{"description":"Page: roles allowed to view this page","type":"array","items":{"type":"string"}},"widgetName":{"description":"CustomWidget: folder name under the module widgets directory. A CustomWidget needs schema:write plus records:write","type":"string"},"widgetProps":{"description":"CustomWidget: property values, a PATCH replaces the whole object. A $nx value needs schema:write plus records:write","type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]}},"width":{"type":"array","items":{"type":"number"}}},"required":["name","type"],"additionalProperties":false},"ComponentResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"afterHide":{"description":"Container directly under Tabs: script run when this tab stops being shown","type":"string"},"aggregation":{"description":"MetricCard: aggregation function","type":"string","enum":["avg","count","max","median","min","sum"]},"annualRecurring":{"description":"Calendar: render every record on the same day/month every year","type":"boolean"},"arrangement":{"description":"Page/Container: layout direction","type":"string","enum":["grid","ltr","row","ttb"]},"background":{"description":"Container/Page/Text: background","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"beforeShow":{"description":"Container directly under Tabs: script run when this tab is shown","type":"string"},"border":{"description":"Container: border","anyOf":[{"type":"object","properties":{"color":{"type":"string"},"style":{"type":"string","enum":["dashed","dotted","double","none","solid"]},"width":{"type":"string"}},"required":["style","width"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"calendarType":{"description":"Calendar: display type","type":"string"},"cardBorder":{"description":"Kanban: card border CSS shorthand, Normal mode only","type":"string"},"cardFont":{"description":"Kanban: card font style tokens, Normal mode only","type":"string"},"cardPadding":{"description":"Kanban: card padding in px, Normal mode only","type":"number"},"cardRadius":{"description":"Kanban: card corner radius in px, Normal mode only","type":"number"},"chartConfig":{"description":"Chart: chart type, axes and data series","type":"object","properties":{"chartType":{"type":"string","enum":["bar","line","pie","funnel","ranking","board"]},"dataSets":{"type":"array","items":{"type":"object","properties":{"aggregation":{"type":"string","enum":["average","count","max","median","min","none","sum"]},"color":{"description":"Series color (hex string)","type":"string"},"fieldName":{"description":"Field name this series reads from","type":"string"},"labels":{"description":"Series labels (localized)","type":"object","additionalProperties":{"type":"string"}}}}},"donut":{"type":"boolean"},"labelPosition":{"type":"string","enum":["bottom","center","inside","outside","top"]},"legend":{"type":"object","properties":{"show":{"type":"boolean"}}},"limit":{"description":"ranking only: how many categories it shows","type":"integer","minimum":1,"maximum":20},"orientation":{"type":"string","enum":["horizontal","vertical"]},"showDataTable":{"type":"boolean"},"showLabels":{"type":"boolean"},"showPoints":{"type":"boolean"},"showTitle":{"type":"boolean"},"smooth":{"type":"boolean"},"stacked":{"type":"boolean"},"style":{"type":"string","enum":["default","half_donut","pad_angle","rounded_corner"]},"tooltips":{"type":"object","properties":{"show":{"type":"boolean"}}},"xAxis":{"type":"object","properties":{"fieldName":{"description":"X-axis field name, null removes it","type":["string","null"]},"groupBy":{"type":"string","enum":["daily","monthly","none","quarterly","weekly","yearly"]},"show":{"type":"boolean"}}},"yAxis":{"type":"object","properties":{"show":{"type":"boolean"}}}},"required":["chartType","dataSets","xAxis"]},"color":{"description":"Text: text color (hex string). Button: theme color name","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"colorFieldName":{"description":"Map: marker color field name","type":"string"},"constraints":{"description":"FieldComponent: script limiting which records a reference can link to, needs schema:manage-permissions","type":"string"},"content":{"description":"Text: content, localized or a script expression","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"customStyle":{"description":"Text: full custom style config, opaque, used only when quickStyle is \"custom\"","type":"object","additionalProperties":{}},"dataPoint":{"description":"'conditional' replaces table/filter/… with the `value` script","type":"string","enum":["conditional","normal"]},"defaultValue":{"description":"InputComponent: initial value, or { $nx: <script> }","anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"disabled":{"description":"Button/FieldComponent: disable the control, a boolean or a script","anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"display":{"description":"MetricCard: display formatting and trend configuration","type":"object","properties":{"color":{"type":"string"},"format":{"type":"string","enum":["compact","currency","number","percentage"]},"icon":{"type":"string"},"trend":{"type":"object","properties":{"customPeriodEnd":{"description":"ISO date (YYYY-MM-DD), for period \"custom\"","type":"string"},"customPeriodStart":{"description":"ISO date (YYYY-MM-DD), for period \"custom\"","type":"string"},"format":{"type":"string","enum":["absolute","percentage"]},"isShown":{"type":"boolean"},"period":{"type":"string","enum":["custom","last_month","last_week","last_year","previous_period","yesterday"]},"positiveDirection":{"type":"string","enum":["down","up"]}},"required":["format","isShown"]}},"required":["color","format","trend"]},"displayAs":{"description":"FieldComponent: how a yes/no field is shown","type":"string"},"expression":{"description":"DynamicHTMLComponent: script returning the HTML to render","type":"string"},"fieldIdDataPoint":{"description":"MetricCard: 'conditional' replaces table/filter/fieldName/aggregation with fieldIdValue","type":"string","enum":["conditional","normal"]},"fieldIdValue":{"description":"MetricCard: whole-dataset script producing the final number when fieldIdDataPoint is conditional","type":"string"},"fieldName":{"description":"MetricCard/Calendar/Map: primary bound field name","type":"string"},"filter":{"description":"MetricCard/Chart: stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"flex":{"description":"Container: flex sizing","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"ganttConfig":{"description":"Gantt: which fields the bars/milestones/dependencies read from","type":"object","properties":{"baselineEndFieldName":{"description":"Planned end field, rendered as a ghost bar","type":["string","null"]},"baselineStartFieldName":{"description":"Planned start field, rendered as a ghost bar","type":["string","null"]},"dependencyDirection":{"type":"string","enum":["predecessor","successor"]},"dependencyFieldName":{"description":"A reference field pointing back at this table","type":["string","null"]},"disableDragAndDrop":{"type":"boolean"},"endFieldName":{"type":["string","null"]},"hideTitleColumn":{"type":"boolean"},"hideWeekends":{"type":"boolean"},"milestoneFieldName":{"type":["string","null"]},"progressFieldName":{"type":["string","null"]},"showCriticalPath":{"type":"boolean"},"showWeekends":{"type":"boolean"},"startFieldName":{"type":["string","null"]},"timeScale":{"type":"string","enum":["day","month","quarter","week"]},"titleColumnFieldName":{"type":["string","null"]},"titleColumnWidth":{"type":"number"}}},"gap":{"description":"Page/Container: gap between children","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"globalFilterBinding":{"description":"MetricCard: field names this card reacts to for global page filters","type":"array","items":{"type":"string"}},"gridPreset":{"description":"Container: grid layout preset","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"groupByFieldName":{"description":"Kanban: lane grouping field name","type":"string"},"height":{"description":"Component height","type":"number"},"icon":{"description":"Page: icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"iconLeft":{"description":"Button/FieldComponent: icon before the label","anyOf":[{"type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"iconRight":{"description":"Button/FieldComponent: icon after the label","anyOf":[{"type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"id":{"type":"string","description":"Component id"},"imagePosition":{"description":"Kanban: card image crop/anchor, Normal mode only","type":"object","properties":{"position":{"type":"string"},"size":{"type":"string"}}},"isCompact":{"description":"Accordion: compact sections","type":"boolean"},"isHidden":{"description":"Page: hide from navigation","type":"boolean"},"isMarkdownEnabled":{"description":"FieldComponent: render a rich text field as markdown","type":"boolean"},"isSpreadsheetMode":{"description":"Table/FieldComponent: spreadsheet-style editing","type":"boolean"},"kind":{"type":"string","deprecated":true,"description":"Deprecated, use type. Same value, kept so existing integrations keep working"},"labelPosition":{"description":"FieldComponent: top, left, inside or hidden","type":"string"},"labels":{"description":"Component labels (localized)","type":"object","additionalProperties":{"type":"string"}},"mapTypeId":{"description":"Map: base layer type","type":"string"},"margin":{"description":"Container: margin","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"name":{"description":"Component name","type":"string"},"onChange":{"description":"Tabs/FieldComponent: script run when the value changes","type":"string"},"onClick":{"description":"Button: script run on click","type":"string"},"order":{"description":"Component display order","type":"number"},"overflow":{"description":"Container: overflow behavior","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"padding":{"description":"Page/Container: padding","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"parentId":{"description":"Parent component id (forms the component tree)","type":"string"},"placeholder":{"description":"FieldComponent: placeholder, localized, plain or a script","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"quickStyle":{"description":"Text: style preset","anyOf":[{"type":"string","enum":["body-md","body-sm","custom","title-lg","title-md","title-sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"radius":{"description":"Container/Text: corner radius","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"remember":{"description":"InputComponent: how long the value is kept","type":"string","enum":["localStorage","memory","url"]},"shadow":{"description":"Container: shadow","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"shadowDom":{"description":"DynamicHTMLComponent: render inside a shadow DOM","type":"boolean"},"showAs":{"description":"FieldComponent: how the value is shown (e.g. popup, combobox)","type":"string"},"showBulkActions":{"description":"Table/FieldComponent: show bulk actions","type":"boolean"},"showCalendarType":{"description":"Calendar: show the calendar type switcher","type":"boolean"},"showCreateButton":{"description":"Table: show the create-record button","type":"boolean"},"showCreateRow":{"description":"Table: show the inline create row","type":"boolean"},"showDataAs":{"description":"FieldComponent: script formatting a linked record","type":"string"},"showEmptyLane":{"description":"Kanban: show lanes with no cards","type":"boolean"},"showLinkExistingRecord":{"description":"FieldComponent: offer linking an existing record","type":"boolean"},"showMetadata":{"description":"FieldComponent: show file metadata","type":"boolean"},"showOutlines":{"description":"Page: show layout outlines in the editor","type":"boolean"},"showSearchField":{"description":"Table/Kanban/Gantt/Calendar/Map: show the search field","type":"boolean"},"showTimeScaleSelector":{"description":"Gantt: let the viewer switch time scale","type":"boolean"},"showTitle":{"description":"Table: show the table title","type":"boolean"},"size":{"description":"Button: sm, md or lg","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"tableName":{"description":"Table this component reads from (Chart/Table/Kanban/Gantt/Calendar/Map/MetricCard)","type":"string"},"textAlign":{"description":"Text: alignment","type":"string","enum":["text-center","text-left","text-right"]},"titleFieldName":{"description":"Map: marker title field name","type":"string"},"tooltip":{"description":"FieldComponent: tooltip text","type":"string"},"type":{"type":"string","description":"Component type (e.g. Container, Button, Text, Page), the property the create and update routes and the module definition take"},"value":{"description":"Script used instead of table/filter/… when dataPoint is conditional","type":"string"},"valueSpec":{"description":"InputComponent: the type of the value, shaped like a field type, a reference has refTableName","type":"object","properties":{"type":{"type":"string"}},"required":["type"],"additionalProperties":{}},"valueType":{"description":"InputComponent: legacy value type, valueSpec wins where both are set","type":"string"},"variant":{"description":"Button/Accordion/Tabs: visual variant, InputComponent: text, email, phone, url, ...","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"view":{"description":"Table/MetricCard/Kanban/Gantt/Calendar/Map: columns/filter/groupBy/sort configuration","type":"object","properties":{"columns":{"description":"View columns","type":"array","items":{"type":"object","properties":{"agg":{"description":"Aggregation function applied to the column","type":"string"},"conditionalStyling":{"description":"Legacy per-column conditional styling rules","type":"array","items":{"type":"object","properties":{"background":{"description":"Background color (hex string)","type":"string"},"cell":{"description":"Target cell","type":"string"},"color":{"description":"Icon color (hex string)","type":"string"},"icon":{"description":"Icon name","type":"string"},"operand":{"type":"string","description":"Comparator"},"value":{"type":"string","description":"Value compared against"}},"required":["operand","value"]}},"field":{"type":"string","description":"Field name, or a script expression for a calculated column"},"hidden":{"description":"Column retained but hidden from the grid","type":"boolean"},"id":{"description":"Stable identity of a calculated column; send it back unchanged when updating the view","type":"string"},"labels":{"description":"Column labels (localized)","type":"object","additionalProperties":{"type":"string"}},"order":{"type":"number","description":"Column display order"},"role":{"description":"Column role (e.g. title, date, image, location, color)","type":"string"},"width":{"description":"Column width","type":"number"}},"required":["field","order"]}},"conditionalFormatting":{"description":"Conditional formatting rules","type":"array","items":{"type":"object","properties":{"backgroundColor":{"description":"Background color (hex string)","type":"string"},"bold":{"description":"Bold text","type":"boolean"},"comparator":{"type":"string","enum":["contains","does_not_contain","ends_with","gt","gte","is","is_empty","is_not","is_not_empty","logic","lt","lte","starts_with"],"description":"Comparator"},"expression":{"description":"Script expression, used only when comparator is 'logic'","type":"string"},"fieldName":{"type":"string","description":"Target field name"},"highlightColor":{"description":"Highlight color (hex string)","type":"string"},"icon":{"description":"Icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"id":{"type":"string","description":"Stable rule id"},"italic":{"description":"Italic text","type":"boolean"},"order":{"type":"number","description":"Rule evaluation order"},"strikethrough":{"description":"Strikethrough text","type":"boolean"},"target":{"type":"string","enum":["cell","row"],"description":"Whether the rule styles a single cell or the whole row"},"textColor":{"description":"Text color (hex string)","type":"string"},"value":{"description":"Value compared against"}},"required":["comparator","fieldName","id","order","target"]}},"filter":{"description":"Stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"groupBy":{"description":"Grouping configuration","type":"array","items":{"type":"object","properties":{"direction":{"description":"Group order direction, defaults to ascending","type":"string","enum":["asc","desc"]},"fieldName":{"type":"string","description":"Field name"}},"required":["fieldName"]}},"sort":{"description":"Sort configuration","type":"object","properties":{"direction":{"type":"string","enum":["asc","desc"],"description":"Sort direction"},"fieldName":{"type":"string","description":"Field name"}},"required":["direction","fieldName"]}}},"visible":{"description":"Conditional visibility logic: a boolean, or a script expression (as { $nx: <script> }) evaluated at render time","anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"visibleRoles":{"description":"Page: roles allowed to view this page","type":"array","items":{"type":"string"}},"widgetName":{"description":"CustomWidget: folder name under the workspace widgets directory","type":"string"},"widgetProps":{"description":"CustomWidget: property values, each static or a script expression (as { $nx: <script> })","type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]}},"width":{"description":"Component width: number = legacy px, string = percentage e.g. \"50%\"","type":["number","string"]}},"description":"Component details"}},"required":["data"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Error message"}}}},"required":["error"]}}},"paths":{"/api/v1/workspace/{workspaceId}/modules/{moduleName}/components":{"post":{"operationId":"ComponentsV1Controller_createComponent","summary":"Create a page or component","description":"Creates a page or component in a module. Page, Container, Tabs, Accordion, Text, Button, FieldComponent, DynamicHTMLComponent, CustomWidget, MetricCardComponent, ChartComponent, TableComponent, KanbanComponent, GanttComponent, CalendarComponent and MapComponent can be created through the public API today. Every kind except Page must nest under an existing component via parentId.","parameters":[{"name":"moduleName","required":true,"in":"path","description":"Module name","schema":{"minLength":1,"maxLength":100,"pattern":"^[a-z0-9_]+$","type":"string"}},{"name":"workspaceId","required":true,"in":"path","description":"Workspace ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateComponentBody"}}}},"responses":{"201":{"description":"Component created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentResponse"}}}},"400":{"description":"Bad request (e.g., unsupported type, or missing parentId)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Workspace, module or parent component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Pages & Components"]}}}}
```

## Get a specific page or component

> Retrieves a specific page or component by id

```json
{"openapi":"3.0.0","info":{"title":"Ninox Public API","version":"1.0.0"},"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"API Key","description":"Enter your Workspace API key. \n\n API keys can be generated and managed within the **Workspace Integration** settings in the Ninox app.","in":"header","name":"Authorization","type":"http"}},"schemas":{"ComponentResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"afterHide":{"description":"Container directly under Tabs: script run when this tab stops being shown","type":"string"},"aggregation":{"description":"MetricCard: aggregation function","type":"string","enum":["avg","count","max","median","min","sum"]},"annualRecurring":{"description":"Calendar: render every record on the same day/month every year","type":"boolean"},"arrangement":{"description":"Page/Container: layout direction","type":"string","enum":["grid","ltr","row","ttb"]},"background":{"description":"Container/Page/Text: background","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"beforeShow":{"description":"Container directly under Tabs: script run when this tab is shown","type":"string"},"border":{"description":"Container: border","anyOf":[{"type":"object","properties":{"color":{"type":"string"},"style":{"type":"string","enum":["dashed","dotted","double","none","solid"]},"width":{"type":"string"}},"required":["style","width"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"calendarType":{"description":"Calendar: display type","type":"string"},"cardBorder":{"description":"Kanban: card border CSS shorthand, Normal mode only","type":"string"},"cardFont":{"description":"Kanban: card font style tokens, Normal mode only","type":"string"},"cardPadding":{"description":"Kanban: card padding in px, Normal mode only","type":"number"},"cardRadius":{"description":"Kanban: card corner radius in px, Normal mode only","type":"number"},"chartConfig":{"description":"Chart: chart type, axes and data series","type":"object","properties":{"chartType":{"type":"string","enum":["bar","line","pie","funnel","ranking","board"]},"dataSets":{"type":"array","items":{"type":"object","properties":{"aggregation":{"type":"string","enum":["average","count","max","median","min","none","sum"]},"color":{"description":"Series color (hex string)","type":"string"},"fieldName":{"description":"Field name this series reads from","type":"string"},"labels":{"description":"Series labels (localized)","type":"object","additionalProperties":{"type":"string"}}}}},"donut":{"type":"boolean"},"labelPosition":{"type":"string","enum":["bottom","center","inside","outside","top"]},"legend":{"type":"object","properties":{"show":{"type":"boolean"}}},"limit":{"description":"ranking only: how many categories it shows","type":"integer","minimum":1,"maximum":20},"orientation":{"type":"string","enum":["horizontal","vertical"]},"showDataTable":{"type":"boolean"},"showLabels":{"type":"boolean"},"showPoints":{"type":"boolean"},"showTitle":{"type":"boolean"},"smooth":{"type":"boolean"},"stacked":{"type":"boolean"},"style":{"type":"string","enum":["default","half_donut","pad_angle","rounded_corner"]},"tooltips":{"type":"object","properties":{"show":{"type":"boolean"}}},"xAxis":{"type":"object","properties":{"fieldName":{"description":"X-axis field name, null removes it","type":["string","null"]},"groupBy":{"type":"string","enum":["daily","monthly","none","quarterly","weekly","yearly"]},"show":{"type":"boolean"}}},"yAxis":{"type":"object","properties":{"show":{"type":"boolean"}}}},"required":["chartType","dataSets","xAxis"]},"color":{"description":"Text: text color (hex string). Button: theme color name","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"colorFieldName":{"description":"Map: marker color field name","type":"string"},"constraints":{"description":"FieldComponent: script limiting which records a reference can link to, needs schema:manage-permissions","type":"string"},"content":{"description":"Text: content, localized or a script expression","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"customStyle":{"description":"Text: full custom style config, opaque, used only when quickStyle is \"custom\"","type":"object","additionalProperties":{}},"dataPoint":{"description":"'conditional' replaces table/filter/… with the `value` script","type":"string","enum":["conditional","normal"]},"defaultValue":{"description":"InputComponent: initial value, or { $nx: <script> }","anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"disabled":{"description":"Button/FieldComponent: disable the control, a boolean or a script","anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"display":{"description":"MetricCard: display formatting and trend configuration","type":"object","properties":{"color":{"type":"string"},"format":{"type":"string","enum":["compact","currency","number","percentage"]},"icon":{"type":"string"},"trend":{"type":"object","properties":{"customPeriodEnd":{"description":"ISO date (YYYY-MM-DD), for period \"custom\"","type":"string"},"customPeriodStart":{"description":"ISO date (YYYY-MM-DD), for period \"custom\"","type":"string"},"format":{"type":"string","enum":["absolute","percentage"]},"isShown":{"type":"boolean"},"period":{"type":"string","enum":["custom","last_month","last_week","last_year","previous_period","yesterday"]},"positiveDirection":{"type":"string","enum":["down","up"]}},"required":["format","isShown"]}},"required":["color","format","trend"]},"displayAs":{"description":"FieldComponent: how a yes/no field is shown","type":"string"},"expression":{"description":"DynamicHTMLComponent: script returning the HTML to render","type":"string"},"fieldIdDataPoint":{"description":"MetricCard: 'conditional' replaces table/filter/fieldName/aggregation with fieldIdValue","type":"string","enum":["conditional","normal"]},"fieldIdValue":{"description":"MetricCard: whole-dataset script producing the final number when fieldIdDataPoint is conditional","type":"string"},"fieldName":{"description":"MetricCard/Calendar/Map: primary bound field name","type":"string"},"filter":{"description":"MetricCard/Chart: stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"flex":{"description":"Container: flex sizing","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"ganttConfig":{"description":"Gantt: which fields the bars/milestones/dependencies read from","type":"object","properties":{"baselineEndFieldName":{"description":"Planned end field, rendered as a ghost bar","type":["string","null"]},"baselineStartFieldName":{"description":"Planned start field, rendered as a ghost bar","type":["string","null"]},"dependencyDirection":{"type":"string","enum":["predecessor","successor"]},"dependencyFieldName":{"description":"A reference field pointing back at this table","type":["string","null"]},"disableDragAndDrop":{"type":"boolean"},"endFieldName":{"type":["string","null"]},"hideTitleColumn":{"type":"boolean"},"hideWeekends":{"type":"boolean"},"milestoneFieldName":{"type":["string","null"]},"progressFieldName":{"type":["string","null"]},"showCriticalPath":{"type":"boolean"},"showWeekends":{"type":"boolean"},"startFieldName":{"type":["string","null"]},"timeScale":{"type":"string","enum":["day","month","quarter","week"]},"titleColumnFieldName":{"type":["string","null"]},"titleColumnWidth":{"type":"number"}}},"gap":{"description":"Page/Container: gap between children","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"globalFilterBinding":{"description":"MetricCard: field names this card reacts to for global page filters","type":"array","items":{"type":"string"}},"gridPreset":{"description":"Container: grid layout preset","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"groupByFieldName":{"description":"Kanban: lane grouping field name","type":"string"},"height":{"description":"Component height","type":"number"},"icon":{"description":"Page: icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"iconLeft":{"description":"Button/FieldComponent: icon before the label","anyOf":[{"type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"iconRight":{"description":"Button/FieldComponent: icon after the label","anyOf":[{"type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"id":{"type":"string","description":"Component id"},"imagePosition":{"description":"Kanban: card image crop/anchor, Normal mode only","type":"object","properties":{"position":{"type":"string"},"size":{"type":"string"}}},"isCompact":{"description":"Accordion: compact sections","type":"boolean"},"isHidden":{"description":"Page: hide from navigation","type":"boolean"},"isMarkdownEnabled":{"description":"FieldComponent: render a rich text field as markdown","type":"boolean"},"isSpreadsheetMode":{"description":"Table/FieldComponent: spreadsheet-style editing","type":"boolean"},"kind":{"type":"string","deprecated":true,"description":"Deprecated, use type. Same value, kept so existing integrations keep working"},"labelPosition":{"description":"FieldComponent: top, left, inside or hidden","type":"string"},"labels":{"description":"Component labels (localized)","type":"object","additionalProperties":{"type":"string"}},"mapTypeId":{"description":"Map: base layer type","type":"string"},"margin":{"description":"Container: margin","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"name":{"description":"Component name","type":"string"},"onChange":{"description":"Tabs/FieldComponent: script run when the value changes","type":"string"},"onClick":{"description":"Button: script run on click","type":"string"},"order":{"description":"Component display order","type":"number"},"overflow":{"description":"Container: overflow behavior","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"padding":{"description":"Page/Container: padding","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"parentId":{"description":"Parent component id (forms the component tree)","type":"string"},"placeholder":{"description":"FieldComponent: placeholder, localized, plain or a script","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"quickStyle":{"description":"Text: style preset","anyOf":[{"type":"string","enum":["body-md","body-sm","custom","title-lg","title-md","title-sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"radius":{"description":"Container/Text: corner radius","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"remember":{"description":"InputComponent: how long the value is kept","type":"string","enum":["localStorage","memory","url"]},"shadow":{"description":"Container: shadow","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"shadowDom":{"description":"DynamicHTMLComponent: render inside a shadow DOM","type":"boolean"},"showAs":{"description":"FieldComponent: how the value is shown (e.g. popup, combobox)","type":"string"},"showBulkActions":{"description":"Table/FieldComponent: show bulk actions","type":"boolean"},"showCalendarType":{"description":"Calendar: show the calendar type switcher","type":"boolean"},"showCreateButton":{"description":"Table: show the create-record button","type":"boolean"},"showCreateRow":{"description":"Table: show the inline create row","type":"boolean"},"showDataAs":{"description":"FieldComponent: script formatting a linked record","type":"string"},"showEmptyLane":{"description":"Kanban: show lanes with no cards","type":"boolean"},"showLinkExistingRecord":{"description":"FieldComponent: offer linking an existing record","type":"boolean"},"showMetadata":{"description":"FieldComponent: show file metadata","type":"boolean"},"showOutlines":{"description":"Page: show layout outlines in the editor","type":"boolean"},"showSearchField":{"description":"Table/Kanban/Gantt/Calendar/Map: show the search field","type":"boolean"},"showTimeScaleSelector":{"description":"Gantt: let the viewer switch time scale","type":"boolean"},"showTitle":{"description":"Table: show the table title","type":"boolean"},"size":{"description":"Button: sm, md or lg","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"tableName":{"description":"Table this component reads from (Chart/Table/Kanban/Gantt/Calendar/Map/MetricCard)","type":"string"},"textAlign":{"description":"Text: alignment","type":"string","enum":["text-center","text-left","text-right"]},"titleFieldName":{"description":"Map: marker title field name","type":"string"},"tooltip":{"description":"FieldComponent: tooltip text","type":"string"},"type":{"type":"string","description":"Component type (e.g. Container, Button, Text, Page), the property the create and update routes and the module definition take"},"value":{"description":"Script used instead of table/filter/… when dataPoint is conditional","type":"string"},"valueSpec":{"description":"InputComponent: the type of the value, shaped like a field type, a reference has refTableName","type":"object","properties":{"type":{"type":"string"}},"required":["type"],"additionalProperties":{}},"valueType":{"description":"InputComponent: legacy value type, valueSpec wins where both are set","type":"string"},"variant":{"description":"Button/Accordion/Tabs: visual variant, InputComponent: text, email, phone, url, ...","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"view":{"description":"Table/MetricCard/Kanban/Gantt/Calendar/Map: columns/filter/groupBy/sort configuration","type":"object","properties":{"columns":{"description":"View columns","type":"array","items":{"type":"object","properties":{"agg":{"description":"Aggregation function applied to the column","type":"string"},"conditionalStyling":{"description":"Legacy per-column conditional styling rules","type":"array","items":{"type":"object","properties":{"background":{"description":"Background color (hex string)","type":"string"},"cell":{"description":"Target cell","type":"string"},"color":{"description":"Icon color (hex string)","type":"string"},"icon":{"description":"Icon name","type":"string"},"operand":{"type":"string","description":"Comparator"},"value":{"type":"string","description":"Value compared against"}},"required":["operand","value"]}},"field":{"type":"string","description":"Field name, or a script expression for a calculated column"},"hidden":{"description":"Column retained but hidden from the grid","type":"boolean"},"id":{"description":"Stable identity of a calculated column; send it back unchanged when updating the view","type":"string"},"labels":{"description":"Column labels (localized)","type":"object","additionalProperties":{"type":"string"}},"order":{"type":"number","description":"Column display order"},"role":{"description":"Column role (e.g. title, date, image, location, color)","type":"string"},"width":{"description":"Column width","type":"number"}},"required":["field","order"]}},"conditionalFormatting":{"description":"Conditional formatting rules","type":"array","items":{"type":"object","properties":{"backgroundColor":{"description":"Background color (hex string)","type":"string"},"bold":{"description":"Bold text","type":"boolean"},"comparator":{"type":"string","enum":["contains","does_not_contain","ends_with","gt","gte","is","is_empty","is_not","is_not_empty","logic","lt","lte","starts_with"],"description":"Comparator"},"expression":{"description":"Script expression, used only when comparator is 'logic'","type":"string"},"fieldName":{"type":"string","description":"Target field name"},"highlightColor":{"description":"Highlight color (hex string)","type":"string"},"icon":{"description":"Icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"id":{"type":"string","description":"Stable rule id"},"italic":{"description":"Italic text","type":"boolean"},"order":{"type":"number","description":"Rule evaluation order"},"strikethrough":{"description":"Strikethrough text","type":"boolean"},"target":{"type":"string","enum":["cell","row"],"description":"Whether the rule styles a single cell or the whole row"},"textColor":{"description":"Text color (hex string)","type":"string"},"value":{"description":"Value compared against"}},"required":["comparator","fieldName","id","order","target"]}},"filter":{"description":"Stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"groupBy":{"description":"Grouping configuration","type":"array","items":{"type":"object","properties":{"direction":{"description":"Group order direction, defaults to ascending","type":"string","enum":["asc","desc"]},"fieldName":{"type":"string","description":"Field name"}},"required":["fieldName"]}},"sort":{"description":"Sort configuration","type":"object","properties":{"direction":{"type":"string","enum":["asc","desc"],"description":"Sort direction"},"fieldName":{"type":"string","description":"Field name"}},"required":["direction","fieldName"]}}},"visible":{"description":"Conditional visibility logic: a boolean, or a script expression (as { $nx: <script> }) evaluated at render time","anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"visibleRoles":{"description":"Page: roles allowed to view this page","type":"array","items":{"type":"string"}},"widgetName":{"description":"CustomWidget: folder name under the workspace widgets directory","type":"string"},"widgetProps":{"description":"CustomWidget: property values, each static or a script expression (as { $nx: <script> })","type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]}},"width":{"description":"Component width: number = legacy px, string = percentage e.g. \"50%\"","type":["number","string"]}},"description":"Component details"}},"required":["data"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Error message"}}}},"required":["error"]}}},"paths":{"/api/v1/workspace/{workspaceId}/components/{componentId}":{"get":{"operationId":"ComponentsV1Controller_getComponent","summary":"Get a specific page or component","description":"Retrieves a specific page or component by id","parameters":[{"name":"componentId","required":true,"in":"path","description":"Component ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}},{"name":"workspaceId","required":true,"in":"path","description":"Workspace ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}}],"responses":{"200":{"description":"Component details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Pages & Components"]}}}}
```

## Delete a page or component

> Deletes a page or component, and every component nested under it

```json
{"openapi":"3.0.0","info":{"title":"Ninox Public API","version":"1.0.0"},"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"API Key","description":"Enter your Workspace API key. \n\n API keys can be generated and managed within the **Workspace Integration** settings in the Ninox app.","in":"header","name":"Authorization","type":"http"}},"schemas":{"DeleteComponentResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","description":"Deleted component id"}}}},"required":["data"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Error message"}}}},"required":["error"]}}},"paths":{"/api/v1/workspace/{workspaceId}/components/{componentId}":{"delete":{"operationId":"ComponentsV1Controller_deleteComponent","summary":"Delete a page or component","description":"Deletes a page or component, and every component nested under it","parameters":[{"name":"componentId","required":true,"in":"path","description":"Component ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}},{"name":"workspaceId","required":true,"in":"path","description":"Workspace ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}}],"responses":{"200":{"description":"Component deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteComponentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Pages & Components"]}}}}
```

## Update a page or component

> Updates a page or component. Only the kinds listed on create can be written through the public API today; changing an existing component's type to anything else is refused, and so is a stored component whose type is already unsupported.

```json
{"openapi":"3.0.0","info":{"title":"Ninox Public API","version":"1.0.0"},"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"API Key","description":"Enter your Workspace API key. \n\n API keys can be generated and managed within the **Workspace Integration** settings in the Ninox app.","in":"header","name":"Authorization","type":"http"}},"schemas":{"UpdateComponentBody":{"type":"object","properties":{"afterHide":{"description":"Container directly under Tabs: script run when this tab stops being shown, null removes it, 400 anywhere else. Needs schema:write plus records:write","type":"array","items":{"type":"string"}},"aggregation":{"type":"string","enum":["avg","count","max","median","min","sum"]},"annualRecurring":{"type":"boolean"},"arrangement":{"type":"string","enum":["grid","ltr","row","ttb"]},"background":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"beforeShow":{"description":"Container directly under Tabs: script run when this tab is shown, null removes it, 400 anywhere else. Needs schema:write plus records:write","type":"array","items":{"type":"string"}},"border":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"style":{"type":"string","enum":["dashed","dotted","double","none","solid"]},"width":{"type":"string"}},"required":["style","width"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"calendarType":{"type":"string"},"cardBorder":{"type":"string"},"cardFont":{"type":"string"},"cardPadding":{"type":"number"},"cardRadius":{"type":"number"},"chartConfig":{"type":"object","properties":{"chartType":{"type":"string","enum":["bar","line","pie","funnel","ranking","board"]},"dataSets":{"type":"array","items":{"type":"object","properties":{"aggregation":{"type":"string","enum":["average","count","max","median","min","none","sum"]},"color":{"description":"Series color (hex string)","type":"string"},"fieldName":{"description":"Field name this series reads from","type":"string"},"labels":{"description":"Series labels (localized)","type":"object","additionalProperties":{"type":"string"}}}}},"donut":{"type":"boolean"},"labelPosition":{"type":"string","enum":["bottom","center","inside","outside","top"]},"legend":{"type":"object","properties":{"show":{"type":"boolean"}}},"limit":{"description":"ranking only: how many categories it shows","type":"integer","minimum":1,"maximum":20},"orientation":{"type":"string","enum":["horizontal","vertical"]},"showDataTable":{"type":"boolean"},"showLabels":{"type":"boolean"},"showPoints":{"type":"boolean"},"showTitle":{"type":"boolean"},"smooth":{"type":"boolean"},"stacked":{"type":"boolean"},"style":{"type":"string","enum":["default","half_donut","pad_angle","rounded_corner"]},"tooltips":{"type":"object","properties":{"show":{"type":"boolean"}}},"xAxis":{"type":"object","properties":{"fieldName":{"description":"X-axis field name, null removes it","type":["string","null"]},"groupBy":{"type":"string","enum":["daily","monthly","none","quarterly","weekly","yearly"]},"show":{"type":"boolean"}}},"yAxis":{"type":"object","properties":{"show":{"type":"boolean"}}}}},"color":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"colorFieldName":{"type":"string"},"constraints":{"description":"FieldComponent: reference guard, null removes it","type":"array","items":{"type":"string"}},"content":{"anyOf":[{"type":"object","additionalProperties":{"type":"string","minLength":1,"maxLength":100}},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"customStyle":{"type":"object","additionalProperties":{}},"dataPoint":{"type":"string","enum":["conditional","normal"]},"defaultValue":{"description":"InputComponent: initial value, or { $nx: <script> } which needs schema:write plus records:write","anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"disabled":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"display":{"type":"object","properties":{"color":{"type":"string"},"format":{"type":"string","enum":["compact","currency","number","percentage"]},"icon":{"type":"string"},"trend":{"type":"object","properties":{"customPeriodEnd":{"type":"string"},"customPeriodStart":{"type":"string"},"format":{"type":"string","enum":["absolute","percentage"]},"isShown":{"type":"boolean"},"period":{"type":"string","enum":["custom","last_month","last_week","last_year","previous_period","yesterday"]},"positiveDirection":{"type":"string","enum":["down","up"]}},"required":["format","isShown"]}}},"displayAs":{"description":"FieldComponent: how a yes/no field is shown","type":"string","enum":["checkbox","dropdown","switch","tabs"]},"expression":{"description":"DynamicHTMLComponent: HTML script, null removes it. Needs schema:write plus records:write","type":"array","items":{"type":"string"}},"fieldIdDataPoint":{"type":"string","enum":["conditional","normal"]},"fieldIdValue":{"description":"MetricCardComponent: script computing the value. Needs schema:write plus records:write","type":"string"},"fieldName":{"type":"string"},"filter":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"id":{"type":"string"},"operator":{"type":"string"},"value":{"type":"string"}},"required":["id"]}},"flex":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"ganttConfig":{"type":"object","properties":{"baselineEndFieldName":{"description":"Planned end field, rendered as a ghost bar","type":["string","null"]},"baselineStartFieldName":{"description":"Planned start field, rendered as a ghost bar","type":["string","null"]},"dependencyDirection":{"type":"string","enum":["predecessor","successor"]},"dependencyFieldName":{"description":"A reference field pointing back at this table","type":["string","null"]},"disableDragAndDrop":{"type":"boolean"},"endFieldName":{"type":["string","null"]},"hideTitleColumn":{"type":"boolean"},"hideWeekends":{"type":"boolean"},"milestoneFieldName":{"type":["string","null"]},"progressFieldName":{"type":["string","null"]},"showCriticalPath":{"type":"boolean"},"showWeekends":{"type":"boolean"},"startFieldName":{"type":["string","null"]},"timeScale":{"type":"string","enum":["day","month","quarter","week"]},"titleColumnFieldName":{"type":["string","null"]},"titleColumnWidth":{"type":"number"}}},"gap":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"globalFilterBinding":{"type":"array","items":{"type":"string"}},"gridPreset":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"groupByFieldName":{"type":"string"},"height":{"type":"number"},"icon":{"description":"Page icon","type":"object","properties":{"color":{"type":"string"},"filling":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","minLength":1}}},"iconLeft":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"filling":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","minLength":1}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"iconRight":{"anyOf":[{"type":"object","properties":{"color":{"type":"string"},"filling":{"anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","minLength":1}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"imagePosition":{"type":"object","properties":{"position":{"type":"string"},"size":{"type":"string"}}},"isCompact":{"type":"boolean"},"isHidden":{"description":"Page: hide from navigation","type":"boolean"},"isMarkdownEnabled":{"type":"boolean"},"isSpreadsheetMode":{"type":"boolean"},"labelPosition":{"type":"string","enum":["hidden","inside","left","top"]},"labels":{"description":"Component labels (localized)","type":"object","additionalProperties":{"type":"string","minLength":1,"maxLength":100}},"mapTypeId":{"type":"string"},"margin":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"name":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[a-z0-9_]+$","description":"Component name"},"onChange":{"description":"Tabs/FieldComponent: change script, null removes it. Needs schema:write plus records:write","type":"array","items":{"type":"string"}},"onClick":{"description":"Button: click script, null removes it. Needs schema:write plus records:write","type":"array","items":{"type":"string"}},"overflow":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"padding":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"parentId":{"description":"Parent component id, required unless type is 'Page' (a Page's parent may also be its table's object id)","type":"string","minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$"},"placeholder":{"anyOf":[{"type":"object","additionalProperties":{"type":"string","minLength":1,"maxLength":100}},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"quickStyle":{"anyOf":[{"type":"string","enum":["body-md","body-sm","custom","title-lg","title-md","title-sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"radius":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"remember":{"description":"InputComponent: how long the value is kept, defaults to memory","type":"string","enum":["localStorage","memory","url"]},"shadow":{"anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"shadowDom":{"type":"boolean"},"showAs":{"type":"string"},"showBulkActions":{"type":"boolean"},"showCalendarType":{"type":"boolean"},"showCreateButton":{"type":"boolean"},"showCreateRow":{"type":"boolean"},"showDataAs":{"description":"FieldComponent: display script, null removes it. Needs schema:write plus records:write","type":"array","items":{"type":"string"}},"showEmptyLane":{"type":"boolean"},"showLinkExistingRecord":{"type":"boolean"},"showMetadata":{"type":"boolean"},"showOutlines":{"description":"Page: show layout outlines in the editor","type":"boolean"},"showSearchField":{"type":"boolean"},"showTimeScaleSelector":{"type":"boolean"},"showTitle":{"type":"boolean"},"size":{"anyOf":[{"type":"string","enum":["lg","md","sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"tableName":{"description":"Table this component reads from","type":"string"},"textAlign":{"type":"string","enum":["text-center","text-left","text-right"]},"titleFieldName":{"type":"string"},"tooltip":{"type":"string"},"type":{"type":"string","enum":["Accordion","Button","CalendarComponent","ChartComponent","Container","CustomWidget","DynamicHTMLComponent","FieldComponent","GanttComponent","InputComponent","KanbanComponent","MapComponent","MetricCardComponent","Page","TableComponent","Tabs","Text"],"description":"Component type"},"value":{"description":"Script used instead of table/filter/… when dataPoint is conditional. Needs schema:write plus records:write","type":"string"},"valueSpec":{"oneOf":[{"type":"object","properties":{"refTableName":{"type":"string","minLength":1},"type":{"type":"string","enum":["reference"]}},"required":["refTableName","type"],"additionalProperties":false},{"type":"object","properties":{"emailBody":{"type":"string"},"emailSubject":{"type":"string"},"maxLength":{"type":"number"},"minLength":{"type":"number"},"type":{"type":"string","enum":["string"]},"variant":{"type":"string","enum":["email","location","multiline-text","phone","text","url"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"max":{"type":"number"},"min":{"type":"number"},"numberFormat":{"type":"object","additionalProperties":{}},"type":{"type":"string","enum":["number"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"options":{"type":"array","items":{"type":"object","properties":{"color":{"type":"string"},"icon":{"type":"object","properties":{"color":{"type":"string"},"filling":{"type":"number","enum":[0,1]},"icon":{"type":"string"}},"required":["icon"],"additionalProperties":false},"id":{"type":"string"},"order":{"type":"number"},"textColor":{"type":"string"},"label":{"type":"string"},"labels":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id"],"additionalProperties":false}},"type":{"type":"string","enum":["choice","multi"]}},"required":["options","type"],"additionalProperties":false},{"type":"object","properties":{"optionColor":{"type":"string"},"optionIcon":{"type":"string"},"optionName":{"type":"string"},"options":{"type":"string"},"type":{"type":"string","enum":["dchoice","dmulti"]}},"required":["options","type"],"additionalProperties":false},{"type":"object","properties":{"timeintervalFormat":{"type":"string"},"type":{"type":"string","enum":["timeinterval"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"timeFormat":{"type":"string"},"type":{"type":"string","enum":["time"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["file"]},"variant":{"type":"string","enum":["signature"]}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","enum":["appointment","boolean","color","date","html","icon","timestamp","user"]}},"required":["type"],"additionalProperties":false}],"description":"InputComponent: the type of the value, shaped like a field type, e.g. { type: \"choice\", options: [...] }"},"valueType":{"description":"InputComponent: legacy value type, valueSpec wins where both are given","type":"string","enum":["any","appointment","boolean","color","date","html","icon","number","string","time","timeinterval","timestamp"]},"variant":{"anyOf":[{"type":"string","enum":["","email","location","multiline-text","phone","slider","switch","text","url","bordered","default","faded","flat","ghost","light","shadow","solid","splitted","underlined"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"view":{"type":"object","properties":{"columns":{"description":"View columns","type":"array","items":{"type":"object","properties":{"agg":{"description":"Aggregation function applied to the column","type":"string"},"conditionalStyling":{"description":"Legacy per-column conditional styling rules","type":"array","items":{"type":"object","properties":{"background":{"description":"Background color (hex string)","type":"string"},"cell":{"description":"Target cell","type":"string"},"color":{"description":"Icon color (hex string)","type":"string"},"icon":{"description":"Icon name","type":"string"},"operand":{"type":"string","description":"Comparator"},"value":{"type":"string","description":"Value compared against"}},"required":["operand","value"]}},"field":{"type":"string","description":"Field name, or a script expression for a calculated column"},"hidden":{"description":"Column retained but hidden from the grid","type":"boolean"},"id":{"description":"Stable identity of a calculated column; send it back unchanged when updating the view","type":"string"},"labels":{"description":"Column labels (localized)","type":"object","additionalProperties":{"type":"string"}},"order":{"type":"number","description":"Column display order"},"role":{"description":"Column role (e.g. title, date, image, location, color)","type":"string"},"width":{"description":"Column width","type":"number"}},"required":["field","order"]}},"conditionalFormatting":{"description":"Conditional formatting rules","type":"array","items":{"type":"object","properties":{"backgroundColor":{"description":"Background color (hex string)","type":"string"},"bold":{"description":"Bold text","type":"boolean"},"comparator":{"type":"string","enum":["contains","does_not_contain","ends_with","gt","gte","is","is_empty","is_not","is_not_empty","logic","lt","lte","starts_with"],"description":"Comparator"},"expression":{"description":"Script expression, used only when comparator is 'logic'","type":"string"},"fieldName":{"type":"string","description":"Target field name"},"highlightColor":{"description":"Highlight color (hex string)","type":"string"},"icon":{"description":"Icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"id":{"type":"string","description":"Stable rule id"},"italic":{"description":"Italic text","type":"boolean"},"order":{"type":"number","description":"Rule evaluation order"},"strikethrough":{"description":"Strikethrough text","type":"boolean"},"target":{"type":"string","enum":["cell","row"],"description":"Whether the rule styles a single cell or the whole row"},"textColor":{"description":"Text color (hex string)","type":"string"},"value":{"description":"Value compared against"}},"required":["comparator","fieldName","id","order","target"]}},"filter":{"description":"Stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"groupBy":{"description":"Grouping configuration","type":"array","items":{"type":"object","properties":{"direction":{"description":"Group order direction, defaults to ascending","type":"string","enum":["asc","desc"]},"fieldName":{"type":"string","description":"Field name"}},"required":["fieldName"]}},"sort":{"description":"Sort configuration","type":"object","properties":{"direction":{"type":"string","enum":["asc","desc"],"description":"Sort direction"},"fieldName":{"type":"string","description":"Field name"}},"required":["direction","fieldName"]}}},"visible":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"visibleRoles":{"type":"array","items":{"type":"string"},"description":"Page: roles allowed to view this page, null removes the restriction","nullable":true},"widgetName":{"description":"CustomWidget: folder name under the module widgets directory. A CustomWidget needs schema:write plus records:write","type":"string"},"widgetProps":{"description":"CustomWidget: property values, a PATCH replaces the whole object. A $nx value needs schema:write plus records:write","type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]}},"width":{"type":"array","items":{"type":"number"}}},"additionalProperties":false},"ComponentResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"afterHide":{"description":"Container directly under Tabs: script run when this tab stops being shown","type":"string"},"aggregation":{"description":"MetricCard: aggregation function","type":"string","enum":["avg","count","max","median","min","sum"]},"annualRecurring":{"description":"Calendar: render every record on the same day/month every year","type":"boolean"},"arrangement":{"description":"Page/Container: layout direction","type":"string","enum":["grid","ltr","row","ttb"]},"background":{"description":"Container/Page/Text: background","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"beforeShow":{"description":"Container directly under Tabs: script run when this tab is shown","type":"string"},"border":{"description":"Container: border","anyOf":[{"type":"object","properties":{"color":{"type":"string"},"style":{"type":"string","enum":["dashed","dotted","double","none","solid"]},"width":{"type":"string"}},"required":["style","width"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"calendarType":{"description":"Calendar: display type","type":"string"},"cardBorder":{"description":"Kanban: card border CSS shorthand, Normal mode only","type":"string"},"cardFont":{"description":"Kanban: card font style tokens, Normal mode only","type":"string"},"cardPadding":{"description":"Kanban: card padding in px, Normal mode only","type":"number"},"cardRadius":{"description":"Kanban: card corner radius in px, Normal mode only","type":"number"},"chartConfig":{"description":"Chart: chart type, axes and data series","type":"object","properties":{"chartType":{"type":"string","enum":["bar","line","pie","funnel","ranking","board"]},"dataSets":{"type":"array","items":{"type":"object","properties":{"aggregation":{"type":"string","enum":["average","count","max","median","min","none","sum"]},"color":{"description":"Series color (hex string)","type":"string"},"fieldName":{"description":"Field name this series reads from","type":"string"},"labels":{"description":"Series labels (localized)","type":"object","additionalProperties":{"type":"string"}}}}},"donut":{"type":"boolean"},"labelPosition":{"type":"string","enum":["bottom","center","inside","outside","top"]},"legend":{"type":"object","properties":{"show":{"type":"boolean"}}},"limit":{"description":"ranking only: how many categories it shows","type":"integer","minimum":1,"maximum":20},"orientation":{"type":"string","enum":["horizontal","vertical"]},"showDataTable":{"type":"boolean"},"showLabels":{"type":"boolean"},"showPoints":{"type":"boolean"},"showTitle":{"type":"boolean"},"smooth":{"type":"boolean"},"stacked":{"type":"boolean"},"style":{"type":"string","enum":["default","half_donut","pad_angle","rounded_corner"]},"tooltips":{"type":"object","properties":{"show":{"type":"boolean"}}},"xAxis":{"type":"object","properties":{"fieldName":{"description":"X-axis field name, null removes it","type":["string","null"]},"groupBy":{"type":"string","enum":["daily","monthly","none","quarterly","weekly","yearly"]},"show":{"type":"boolean"}}},"yAxis":{"type":"object","properties":{"show":{"type":"boolean"}}}},"required":["chartType","dataSets","xAxis"]},"color":{"description":"Text: text color (hex string). Button: theme color name","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"colorFieldName":{"description":"Map: marker color field name","type":"string"},"constraints":{"description":"FieldComponent: script limiting which records a reference can link to, needs schema:manage-permissions","type":"string"},"content":{"description":"Text: content, localized or a script expression","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"customStyle":{"description":"Text: full custom style config, opaque, used only when quickStyle is \"custom\"","type":"object","additionalProperties":{}},"dataPoint":{"description":"'conditional' replaces table/filter/… with the `value` script","type":"string","enum":["conditional","normal"]},"defaultValue":{"description":"InputComponent: initial value, or { $nx: <script> }","anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"disabled":{"description":"Button/FieldComponent: disable the control, a boolean or a script","anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"display":{"description":"MetricCard: display formatting and trend configuration","type":"object","properties":{"color":{"type":"string"},"format":{"type":"string","enum":["compact","currency","number","percentage"]},"icon":{"type":"string"},"trend":{"type":"object","properties":{"customPeriodEnd":{"description":"ISO date (YYYY-MM-DD), for period \"custom\"","type":"string"},"customPeriodStart":{"description":"ISO date (YYYY-MM-DD), for period \"custom\"","type":"string"},"format":{"type":"string","enum":["absolute","percentage"]},"isShown":{"type":"boolean"},"period":{"type":"string","enum":["custom","last_month","last_week","last_year","previous_period","yesterday"]},"positiveDirection":{"type":"string","enum":["down","up"]}},"required":["format","isShown"]}},"required":["color","format","trend"]},"displayAs":{"description":"FieldComponent: how a yes/no field is shown","type":"string"},"expression":{"description":"DynamicHTMLComponent: script returning the HTML to render","type":"string"},"fieldIdDataPoint":{"description":"MetricCard: 'conditional' replaces table/filter/fieldName/aggregation with fieldIdValue","type":"string","enum":["conditional","normal"]},"fieldIdValue":{"description":"MetricCard: whole-dataset script producing the final number when fieldIdDataPoint is conditional","type":"string"},"fieldName":{"description":"MetricCard/Calendar/Map: primary bound field name","type":"string"},"filter":{"description":"MetricCard/Chart: stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"flex":{"description":"Container: flex sizing","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"ganttConfig":{"description":"Gantt: which fields the bars/milestones/dependencies read from","type":"object","properties":{"baselineEndFieldName":{"description":"Planned end field, rendered as a ghost bar","type":["string","null"]},"baselineStartFieldName":{"description":"Planned start field, rendered as a ghost bar","type":["string","null"]},"dependencyDirection":{"type":"string","enum":["predecessor","successor"]},"dependencyFieldName":{"description":"A reference field pointing back at this table","type":["string","null"]},"disableDragAndDrop":{"type":"boolean"},"endFieldName":{"type":["string","null"]},"hideTitleColumn":{"type":"boolean"},"hideWeekends":{"type":"boolean"},"milestoneFieldName":{"type":["string","null"]},"progressFieldName":{"type":["string","null"]},"showCriticalPath":{"type":"boolean"},"showWeekends":{"type":"boolean"},"startFieldName":{"type":["string","null"]},"timeScale":{"type":"string","enum":["day","month","quarter","week"]},"titleColumnFieldName":{"type":["string","null"]},"titleColumnWidth":{"type":"number"}}},"gap":{"description":"Page/Container: gap between children","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"globalFilterBinding":{"description":"MetricCard: field names this card reacts to for global page filters","type":"array","items":{"type":"string"}},"gridPreset":{"description":"Container: grid layout preset","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"groupByFieldName":{"description":"Kanban: lane grouping field name","type":"string"},"height":{"description":"Component height","type":"number"},"icon":{"description":"Page: icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"iconLeft":{"description":"Button/FieldComponent: icon before the label","anyOf":[{"type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"iconRight":{"description":"Button/FieldComponent: icon after the label","anyOf":[{"type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"id":{"type":"string","description":"Component id"},"imagePosition":{"description":"Kanban: card image crop/anchor, Normal mode only","type":"object","properties":{"position":{"type":"string"},"size":{"type":"string"}}},"isCompact":{"description":"Accordion: compact sections","type":"boolean"},"isHidden":{"description":"Page: hide from navigation","type":"boolean"},"isMarkdownEnabled":{"description":"FieldComponent: render a rich text field as markdown","type":"boolean"},"isSpreadsheetMode":{"description":"Table/FieldComponent: spreadsheet-style editing","type":"boolean"},"kind":{"type":"string","deprecated":true,"description":"Deprecated, use type. Same value, kept so existing integrations keep working"},"labelPosition":{"description":"FieldComponent: top, left, inside or hidden","type":"string"},"labels":{"description":"Component labels (localized)","type":"object","additionalProperties":{"type":"string"}},"mapTypeId":{"description":"Map: base layer type","type":"string"},"margin":{"description":"Container: margin","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"name":{"description":"Component name","type":"string"},"onChange":{"description":"Tabs/FieldComponent: script run when the value changes","type":"string"},"onClick":{"description":"Button: script run on click","type":"string"},"order":{"description":"Component display order","type":"number"},"overflow":{"description":"Container: overflow behavior","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"padding":{"description":"Page/Container: padding","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"parentId":{"description":"Parent component id (forms the component tree)","type":"string"},"placeholder":{"description":"FieldComponent: placeholder, localized, plain or a script","anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"quickStyle":{"description":"Text: style preset","anyOf":[{"type":"string","enum":["body-md","body-sm","custom","title-lg","title-md","title-sm"]},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"radius":{"description":"Container/Text: corner radius","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"remember":{"description":"InputComponent: how long the value is kept","type":"string","enum":["localStorage","memory","url"]},"shadow":{"description":"Container: shadow","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"shadowDom":{"description":"DynamicHTMLComponent: render inside a shadow DOM","type":"boolean"},"showAs":{"description":"FieldComponent: how the value is shown (e.g. popup, combobox)","type":"string"},"showBulkActions":{"description":"Table/FieldComponent: show bulk actions","type":"boolean"},"showCalendarType":{"description":"Calendar: show the calendar type switcher","type":"boolean"},"showCreateButton":{"description":"Table: show the create-record button","type":"boolean"},"showCreateRow":{"description":"Table: show the inline create row","type":"boolean"},"showDataAs":{"description":"FieldComponent: script formatting a linked record","type":"string"},"showEmptyLane":{"description":"Kanban: show lanes with no cards","type":"boolean"},"showLinkExistingRecord":{"description":"FieldComponent: offer linking an existing record","type":"boolean"},"showMetadata":{"description":"FieldComponent: show file metadata","type":"boolean"},"showOutlines":{"description":"Page: show layout outlines in the editor","type":"boolean"},"showSearchField":{"description":"Table/Kanban/Gantt/Calendar/Map: show the search field","type":"boolean"},"showTimeScaleSelector":{"description":"Gantt: let the viewer switch time scale","type":"boolean"},"showTitle":{"description":"Table: show the table title","type":"boolean"},"size":{"description":"Button: sm, md or lg","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"tableName":{"description":"Table this component reads from (Chart/Table/Kanban/Gantt/Calendar/Map/MetricCard)","type":"string"},"textAlign":{"description":"Text: alignment","type":"string","enum":["text-center","text-left","text-right"]},"titleFieldName":{"description":"Map: marker title field name","type":"string"},"tooltip":{"description":"FieldComponent: tooltip text","type":"string"},"type":{"type":"string","description":"Component type (e.g. Container, Button, Text, Page), the property the create and update routes and the module definition take"},"value":{"description":"Script used instead of table/filter/… when dataPoint is conditional","type":"string"},"valueSpec":{"description":"InputComponent: the type of the value, shaped like a field type, a reference has refTableName","type":"object","properties":{"type":{"type":"string"}},"required":["type"],"additionalProperties":{}},"valueType":{"description":"InputComponent: legacy value type, valueSpec wins where both are set","type":"string"},"variant":{"description":"Button/Accordion/Tabs: visual variant, InputComponent: text, email, phone, url, ...","anyOf":[{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"view":{"description":"Table/MetricCard/Kanban/Gantt/Calendar/Map: columns/filter/groupBy/sort configuration","type":"object","properties":{"columns":{"description":"View columns","type":"array","items":{"type":"object","properties":{"agg":{"description":"Aggregation function applied to the column","type":"string"},"conditionalStyling":{"description":"Legacy per-column conditional styling rules","type":"array","items":{"type":"object","properties":{"background":{"description":"Background color (hex string)","type":"string"},"cell":{"description":"Target cell","type":"string"},"color":{"description":"Icon color (hex string)","type":"string"},"icon":{"description":"Icon name","type":"string"},"operand":{"type":"string","description":"Comparator"},"value":{"type":"string","description":"Value compared against"}},"required":["operand","value"]}},"field":{"type":"string","description":"Field name, or a script expression for a calculated column"},"hidden":{"description":"Column retained but hidden from the grid","type":"boolean"},"id":{"description":"Stable identity of a calculated column; send it back unchanged when updating the view","type":"string"},"labels":{"description":"Column labels (localized)","type":"object","additionalProperties":{"type":"string"}},"order":{"type":"number","description":"Column display order"},"role":{"description":"Column role (e.g. title, date, image, location, color)","type":"string"},"width":{"description":"Column width","type":"number"}},"required":["field","order"]}},"conditionalFormatting":{"description":"Conditional formatting rules","type":"array","items":{"type":"object","properties":{"backgroundColor":{"description":"Background color (hex string)","type":"string"},"bold":{"description":"Bold text","type":"boolean"},"comparator":{"type":"string","enum":["contains","does_not_contain","ends_with","gt","gte","is","is_empty","is_not","is_not_empty","logic","lt","lte","starts_with"],"description":"Comparator"},"expression":{"description":"Script expression, used only when comparator is 'logic'","type":"string"},"fieldName":{"type":"string","description":"Target field name"},"highlightColor":{"description":"Highlight color (hex string)","type":"string"},"icon":{"description":"Icon","type":"object","properties":{"color":{"description":"Icon color (hex string)","type":"string"},"filling":{"description":"Icon filling","anyOf":[{"type":"number","enum":[0]},{"type":"number","enum":[1]}]},"icon":{"type":"string","description":"Icon name"}},"required":["icon"]},"id":{"type":"string","description":"Stable rule id"},"italic":{"description":"Italic text","type":"boolean"},"order":{"type":"number","description":"Rule evaluation order"},"strikethrough":{"description":"Strikethrough text","type":"boolean"},"target":{"type":"string","enum":["cell","row"],"description":"Whether the rule styles a single cell or the whole row"},"textColor":{"description":"Text color (hex string)","type":"string"},"value":{"description":"Value compared against"}},"required":["comparator","fieldName","id","order","target"]}},"filter":{"description":"Stored filter conditions","type":"array","items":{"type":"object","properties":{"field":{"description":"Field name","type":"string"},"id":{"type":"string","description":"Stable condition id"},"operator":{"description":"Filter operator","type":"string"},"value":{"description":"Value compared against","type":"string"}},"required":["id"]}},"groupBy":{"description":"Grouping configuration","type":"array","items":{"type":"object","properties":{"direction":{"description":"Group order direction, defaults to ascending","type":"string","enum":["asc","desc"]},"fieldName":{"type":"string","description":"Field name"}},"required":["fieldName"]}},"sort":{"description":"Sort configuration","type":"object","properties":{"direction":{"type":"string","enum":["asc","desc"],"description":"Sort direction"},"fieldName":{"type":"string","description":"Field name"}},"required":["direction","fieldName"]}}},"visible":{"description":"Conditional visibility logic: a boolean, or a script expression (as { $nx: <script> }) evaluated at render time","anyOf":[{"type":"boolean"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]},"visibleRoles":{"description":"Page: roles allowed to view this page","type":"array","items":{"type":"string"}},"widgetName":{"description":"CustomWidget: folder name under the workspace widgets directory","type":"string"},"widgetProps":{"description":"CustomWidget: property values, each static or a script expression (as { $nx: <script> })","type":"object","additionalProperties":{"anyOf":[{"type":"boolean"},{"type":"number"},{"type":"string"},{"type":"object","properties":{"$nx":{"type":"string","description":"Script expression. Writing one needs records:write as well as schema:write"}},"required":["$nx"]}]}},"width":{"description":"Component width: number = legacy px, string = percentage e.g. \"50%\"","type":["number","string"]}},"description":"Component details"}},"required":["data"]},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"message":{"type":"string","description":"Error message"}}}},"required":["error"]}}},"paths":{"/api/v1/workspace/{workspaceId}/components/{componentId}":{"patch":{"operationId":"ComponentsV1Controller_updateComponent","summary":"Update a page or component","description":"Updates a page or component. Only the kinds listed on create can be written through the public API today; changing an existing component's type to anything else is refused, and so is a stored component whose type is already unsupported.","parameters":[{"name":"componentId","required":true,"in":"path","description":"Component ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}},{"name":"workspaceId","required":true,"in":"path","description":"Workspace ID","schema":{"minLength":12,"maxLength":12,"pattern":"^[a-z0-9]+$","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateComponentBody"}}}},"responses":{"200":{"description":"Component updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentResponse"}}}},"400":{"description":"Bad request (e.g., unsupported type)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Component not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"tags":["Pages & Components"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ninox.com/ninox-api/api-reference/api-endpoints/pages-and-components.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
