Use this file to discover all available pages before exploring further.
A2UI communicates through a small set of typed JSON messages sent as JSON Lines (JSONL), where each newline-delimited object is exactly one message. Agents stream these messages to clients over any supported transport. The v0.9.1 protocol adds a top-level "version" field to every message and flattens the component object format; v0.8 messages use a nested wrapper style and end with a beginRendering signal.
v0.9.1 (Current)
v1.0 (Candidate)
v0.8 (Legacy)
All v0.9.1 messages include "version": "v0.9.1" as their first field. The four core message types are:
Message
Purpose
createSurface
Initialize a surface and declare its catalog
updateComponents
Add or replace components in flat adjacency-list format
updateDataModel
Write a value to a JSON Pointer path in the data model
deleteSurface
Tear down a surface and free all associated state
v1.0 includes all four v0.9.1 messages plus actionResponse, which lets the agent reply directly to a user-triggered action event without starting a new conversation turn.
v0.8 omits the version field. Rendering is triggered by a dedicated beginRendering message sent after component and data messages have been buffered:
Message
Purpose
surfaceUpdate
Add or update components using the nested wrapper format
dataModelUpdate
Write data using a typed key/value adjacency list
beginRendering
Signal the client to start rendering the buffered surface
URI of the catalog JSON Schema that defines the components the agent will use. The client must have this catalog available at render time — no runtime download occurs.
In v0.9.1 the root component is identified by convention: one component in the subsequent updateComponents message must carry "id": "root". There is no separate root field in createSurface.
Send beginRenderingafter all surfaceUpdate and dataModelUpdate messages for the initial render. The client buffers those earlier messages and only processes them once beginRendering arrives.
Updates the per-surface data model that components bind to via JSON Pointer paths. Any component whose bound path is affected automatically re-renders.
An adjacency-list of typed key-value pairs. Each entry must have key and exactly one of valueString, valueNumber, valueBoolean, or valueMap. This LLM-friendly format avoids ambiguous type inference.
The ID of the surface to remove. The client should tear down the rendered UI and release all state for this surface.
Send deleteSurface when closing modals, navigating away from a view, or completing a task. The identical inner structure works in both v0.8 and v0.9.1 — the only difference is the top-level version field.
The following sequence builds a complete booking surface from scratch, then tears it down after confirmation. Each line is sent as soon as it is generated — the client renders progressively.
Components can be batched across multiple updateComponents messages. The flat adjacency-list format means the client can render each batch immediately without waiting for the full tree.
Component Reference
All available component types, properties, and version differences.
Data Binding
How JSON Pointer paths connect components to application state.
Catalogs
Catalog negotiation, schema structure, and versioning guidelines.
Transports
Delivery mechanisms: A2A, AG-UI, WebSockets, and SSE.