---
title: Data requests
description: "Named dataRequests on page and component root.props own list/get/create/update behavior. Buttons and InteractiveWrapper only trigger a named request. VariableInputBlock edits variables that requests read and write. List UIs repeat rows with VariableArrayTemplateBlock bound to an entry[]/array variable."
---

These are legacy blocks. Do not insert, copy, or invent them — they may still appear in existing documents, but their behavior is not guaranteed long-term and they will be fully removed: ButtonLink, LinkBar, LinkWrapper, ButtonWrapper, SingleAccordion, ObjectDisplayBlock, PageComponentBlock, HeaderNavShellBlock, ObjectBreadcrumbBlock, FormInput, FormSubmitButton, FormDeleteButton. Use get_design_schema / get_docs catalogs for allowed types. For lists/details/forms use ComponentBlock + named dataRequests (create_component_preset), VariableArrayTemplateBlock for repeating list rows (`arrayBinding` → `{{var:hits|items}}`, slot tokens `{{var:item.*}}`), VariableInputBlock, and ButtonBlock runRequest/runMutation. ButtonLink→ButtonBlock mapping (manual only): appearance filled→filled, text→text; move icon into a {{icon:…}} chip in text; set sizeByBreakpoint widthMode fitContent for non-stretch CTAs. Consent with a link: VariableInputBlock checkbox + adjacent RichTextBlock — do not build rich checkbox labels.

## Mental model

Queries decide what they do. A request carries op, objectTypeId, args (filters, searchQuery, fieldValues — often with {{var:id}} or {{bind:route.*}} tokens), optional select, and resultWrites that copy results into editor variables after a successful run. Button and InteractiveWrapper only set action to runRequest or runMutation plus requestName (optional loadingText/successText/errorText). Do not put search or submit logic on the button itself.

## Placement

Only content.root.props.dataRequests, content.root.props.inputSchema, and content.root.props.variables are read. Host pages map component inputs with ComponentBlock.props.inputMappings ({inputId, source}). Top-level content.dataRequests, root.dataRequests (sibling of props), kind/operation/mappings/variables at the wrong level, and guessed shapes are stored verbatim but ignored by detailed mode and runtime — get_design_warnings flags them.

## Schema

dataRequests[]: { name, op: list|get|create|update, objectTypeId, args?, select?, resultWrites? }. args: entryId, pathParam, filters, sortBy, sortDirection, limit, searchQuery, searchFieldKeys, fieldValues. resultWrites[]: { variableId, source? } where source defaults to results (supports results[].field). inputSchema[] (components): { id, name, type: string|number|boolean|image|richText|entry|entry[] }. Tokens: {{var:id}}, {{bind:route.*}}, {{bind:query.*}}. List rows: VariableArrayTemplateBlock.arrayBinding = {{var:hits}} (or {{var:items}}); slot uses {{var:item.<fieldKey>}}.

## Select options (VariableInputBlock)

Select options come from the editor variable, not from block props. Use type: "list" with options: [{ id, label }, …]. Alias type: "options" is accepted as list. Option entries may use value instead of id. Pair with VariableInputBlock control: "select" (or auto).

## Public create

Anonymous create/update uses field grants and built-in honeypot/rate limits. Prefer create_component_preset kind=form for starters. The public create path also rejects empty required object fields on the server even if client attributes are removed.

## Recipes

Contact form: variables per field + VariableInputBlock + dataRequest op create with args.fieldValues from {{var:*}} + Button runMutation.
Search / list: variables q (text) and hits (entry[]) + dataRequest op list with args.searchQuery {{var:q}} and resultWrites to hits + VariableInputBlock + Button runRequest + VariableArrayTemplateBlock with arrayBinding {{var:hits}} and slot content using {{var:item.<fieldKey>}} (entry fieldValues are flattened onto item). Wrap the template (or its slot) in FlexListBlock/GridBlock for gaps and columns.
Refresh: Button runRequest on the same list/get name.

## Introspection

get_page / get_component mode=detailed returns requests, requestsDetailed (args, select, resultWrites), inputSchema, and parseErrors. get_design_warnings reports unknown blocks/actions, misplaced keys, and unparseable rows.

## Presets and migrate

MCP create_component_preset {objectTypeId, kind: list|detail|form}. The list preset includes VariableArrayTemplateBlock bound to {{var:hits}} with a sample {{var:item.*}} heading. Optional migrate_object_displays converts leftover ObjectDisplayBlock nodes into ComponentBlock + named requests; list migrate emits VariableArrayTemplateBlock + page-safe blocks (not ObjectBoundField) — do not insert leftover display types.
