Content Payload
A content leaf or recursively composed group. A group contains blocks and optional composition; it cannot mix blocks with leaf payload fields. Groups may nest up to 32 levels.
Metadata
Field index
| Field | Type | Req. | Description |
|---|---|---|---|
| id | string | — | Optional stable identifier for this payload, unique among slide and payload ids in the document. Use when another system needs to address the payload across edits — patch-style agent edits, comments, review state, or generation provenance. Identity survives reordering where array indexes do not. |
| extensions | object | — | Custom data passthrough for agent workflows at payload scope; ignored by the engine but preserved across read/write round-trips. |
| region | string | — | Pin a root block (slides.N.blocks.I) to a region of the slide's template layout by name (OPF 0.19). The block goes to that region when the region exists, accepts the block's kind and has room; otherwise the pin is ignored with a warning (opf/region-unknown, opf/region-kind or opf/region-full) and the block is placed by its kind. Blocks without a pin are bound by reading order, role and kind. A pin on a nested block, or on a slide without a template layout, has no effect. |
| type | enum | — | Optional content kind. When omitted, engines infer the kind from the fields present.
|
| text | string | array<ref:TextRun> | — | Text payload. Use a string for plain text or TextRun[] for inline rich text. TextRun items may be plain strings or formatted run objects. |
| items | array<ref:ListItem> | — | Structured list payload (type 'list'). Each item is either a plain string, a TextRun[] rich text sequence, or a ListItem object with optional description. List nesting uses item.level rather than nested content payloads. Use items when entries share a shape or any entry needs a description; use bullets for plain talking points. Both draw the same marker, nesting and numbering. A block or region holds items or bullets, never both, and items cannot sit beside text. |
| bullets | array<ref:BulletItem> | — | Prose bullet payload: short talking points, each standing alone. Presence of this field infers type 'text', so it may sit beside text in one payload. Entries have no description; use items for entries with supporting detail. |
| numbering | ref:NumberingSpec | — | Number the payload's items or bullets instead of bulleting them. A style name (arabic, roman-upper, roman-lower, alpha-upper, alpha-lower) or a Numbering object applies to every list level; an array gives one entry per level (index = level, the last entry repeats for deeper levels). Counting follows PowerPoint: consecutive entries of one level count up from its start, and an entry of a shallower level restarts the deeper levels. Absent = bullets. Valid only with items or bullets. Native PowerPoint export writes a:buAutoNum with the matching scheme and startAt; the preview draws the same numbers at the same marker geometry.
|
| columns | const | integer | — | Lay the payload's items or bullets out in columns (OPF 0.19). 'auto' tries 1, 2 then 3 equal columns at the starting text size and uses the first count at which the list fits, as long as a column stays at least a quarter of the slide wide; when none fits, the largest allowed count shrinks towards minFontSize. 1, 2 or 3 fixes the count. Column breaks fall between items (a nested item stays with its parent) and keep the columns as even as possible; numbering continues and reading order runs column by column. A lone list in a layout region with listColumns: 'auto' behaves as 'auto'.
|
| image | ref:Asset | — | Source for an image item. |
| fit | enum | — | Image payloads only. How the picture fills its frame: 'cover' fills it and crops what overflows around focus; 'contain' shows the whole picture, in a frame of its own proportions placed at the region's anchor (top by default); 'stretch' scales it to the frame exactly. Default: the effective design.imageFit, else 'cover' in a layout and 'contain' on a slide with no layout.
|
| focus | ref:ImageFocus | — | Image payloads only. Point of the picture to keep in view when 'cover' crops it. Ignored by the other fits. |
| aspectRatio | number | — | Image payloads only. Width-to-height ratio of the frame: the frame becomes the largest centered box with this ratio inside the block's region, for example 2.39 for a cinematic letterbox or 0.5 for a phone-shaped frame. shape 'circle' always uses 1. |
| shape | enum | — | Image payloads only. Mask applied to the frame, exported as the picture's native preset geometry (rect, roundRect, ellipse, hexagon). 'circle' makes the frame square. Default 'rectangle'.
|
| cornerRadius | number | — | Image payloads only. Corner radius for shape 'rounded' as a fraction of the frame's shorter side. Default 0.16667, PowerPoint's roundRect default. |
| border | ref:ImageBorder | — | Image payloads only. Line along the frame's shape. |
| opacity | number | — | Image payloads only. Picture opacity from 0 to 1, exported as a native alphaModFix. The border and overlay keep their own opacity. Default 1. |
| recolor | ref:ImageRecolor | — | Image payloads only. Grayscale or duotone treatment of the picture's pixels.
|
| overlay | ref:Overlay | — | Image payloads only. Scrim over the picture in the frame's shape, or a band along one edge of a rectangle frame. |
| placement | ref:ImagePlacement | — | Image payloads only, and only on a top-level block (slides.N.blocks.I), at most one per edge. Bleeds the image to one slide edge; the headings and the other blocks compose in the rest of the slide. |
| video | ref:Asset | — | Source for a video item. Engines do not play video: the preview draws a placeholder (a play badge with the asset's title or source as its caption), and PPTX export draws the same placeholder as native shapes linked to an http(s) source, with no embedded media. Native playback is out of scope (docs/programs/release-readiness). |
| chart | ref:Chart | — | Chart payload. Presence of this field infers type 'chart'. |
| table | ref:Table | — | Table payload. Presence of this field infers type 'table'. |
| code | string | ref:Code | — | Code payload. A string is shorthand for { "source": value }; object form carries optional syntax language and filename metadata. |
| metric | string | number | ref:Metric | — | Metric payload. A string or number is shorthand for { "value": value }; object form carries optional label, description, unit, delta, trend, and sentiment metadata. Numeric values remain numbers; renderers format them for display. |
| quote | string | ref:Quote | — | Quote payload. A string is shorthand for { "text": value }; object form carries optional attribution, role, photo and source metadata. |
| timeline | ref:Timeline | — | Timeline payload ordered by narrative or chronology. |
| caption | ref:Caption | — | Caption for an image, chart, table or video payload, composed inside the block's region (below the media by default). Invalid on other payload kinds and on groups. |
| blocks | array<ref:ContentPayload> | — | Ordered children of a group. Each child is a leaf or another group. |
| composition | ref:Composition | — | Arrangement within this group. Only minFontSize and overflow inherit from the parent; strict overflow cannot be weakened. |
id
typestringrequirednodefault—
Optional stable identifier for this payload, unique among slide and payload ids in the document. Use when another system needs to address the payload across edits — patch-style agent edits, comments, review state, or generation provenance. Identity survives reordering where array indexes do not.
{
"id": "kpi-adoption"
}extensions
typeobjectrequirednodefault—
Custom data passthrough for agent workflows at payload scope; ignored by the engine but preserved across read/write round-trips.
region
typestringrequirednodefault—pattern^[a-z][a-z0-9-]*$
Pin a root block (slides.N.blocks.I) to a region of the slide's template layout by name (OPF 0.19). The block goes to that region when the region exists, accepts the block's kind and has room; otherwise the pin is ignored with a warning (opf/region-unknown, opf/region-kind or opf/region-full) and the block is placed by its kind. Blocks without a pin are bound by reading order, role and kind. A pin on a nested block, or on a slide without a template layout, has no effect.
{
"region": "notes"
}type
typeenumrequirednodefault—
Optional content kind. When omitted, engines infer the kind from the fields present.
type· Allowed values"text""list""image""chart""table""video""code""metric""quote""timeline""group"
{
"type": "text"
}text
typestring | array<ref:TextRun>requirednodefault—
Text payload. Use a string for plain text or TextRun[] for inline rich text. TextRun items may be plain strings or formatted run objects.
{
"text": "Hello, world"
}items
typearray<ref:ListItem>requirednodefault—
Structured list payload (type 'list'). Each item is either a plain string, a TextRun[] rich text sequence, or a ListItem object with optional description. List nesting uses item.level rather than nested content payloads. Use items when entries share a shape or any entry needs a description; use bullets for plain talking points. Both draw the same marker, nesting and numbering. A block or region holds items or bullets, never both, and items cannot sit beside text.
{
"items": [
"Sub-second agent latency",
[
"Drop-in compatible with ",
{
"text": "OpenAI tool-calling",
"bold": true
}
],
{
"text": "SOC 2 Type II",
"description": "Security review ready for enterprise procurement."
}
]
}bullets
typearray<ref:BulletItem>requirednodefault—
Prose bullet payload: short talking points, each standing alone. Presence of this field infers type 'text', so it may sit beside text in one payload. Entries have no description; use items for entries with supporting detail.
{
"bullets": [
"Sub-second agent latency",
"Drop-in compatible with OpenAI tool-calling",
"SOC 2 Type II"
]
}numbering
typeref:NumberingSpecrequirednodefault—
Number the payload's items or bullets instead of bulleting them. A style name (arabic, roman-upper, roman-lower, alpha-upper, alpha-lower) or a Numbering object applies to every list level; an array gives one entry per level (index = level, the last entry repeats for deeper levels). Counting follows PowerPoint: consecutive entries of one level count up from its start, and an entry of a shallower level restarts the deeper levels. Absent = bullets. Valid only with items or bullets. Native PowerPoint export writes a:buAutoNum with the matching scheme and startAt; the preview draws the same numbers at the same marker geometry.
numbering· Named choices (see schema for other values and constraints)"arabic""roman-upper""roman-lower""alpha-upper""alpha-lower"numbering (oneOf 2).style· Allowed values"arabic""roman-upper""roman-lower""alpha-upper""alpha-lower"numbering (oneOf 2).suffix· Allowed values"period""paren""paren-both"numbering (oneOf 3)[]· Named choices (see schema for other values and constraints)"arabic""roman-upper""roman-lower""alpha-upper""alpha-lower"
{
"numbering": "arabic"
}columns
typeconst | integerrequirednodefault—
Lay the payload's items or bullets out in columns (OPF 0.19). 'auto' tries 1, 2 then 3 equal columns at the starting text size and uses the first count at which the list fits, as long as a column stays at least a quarter of the slide wide; when none fits, the largest allowed count shrinks towards minFontSize. 1, 2 or 3 fixes the count. Column breaks fall between items (a nested item stays with its parent) and keep the columns as even as possible; numbering continues and reading order runs column by column. A lone list in a layout region with listColumns: 'auto' behaves as 'auto'.
columns· Named choices (see schema for other values and constraints)"auto"
{
"columns": "auto"
}image
typeref:Assetrequirednodefault—
Source for an image item.
{
"image": "https://cdn.acme.com/images/diagram.png"
}fit
typeenumrequirednodefault—
Image payloads only. How the picture fills its frame: 'cover' fills it and crops what overflows around focus; 'contain' shows the whole picture, in a frame of its own proportions placed at the region's anchor (top by default); 'stretch' scales it to the frame exactly. Default: the effective design.imageFit, else 'cover' in a layout and 'contain' on a slide with no layout.
fit· Allowed values"cover""contain""stretch"
{
"fit": "cover"
}focus
typeref:ImageFocusrequirednodefault—
Image payloads only. Point of the picture to keep in view when 'cover' crops it. Ignored by the other fits.
aspectRatio
typenumberrequirednodefault—
Image payloads only. Width-to-height ratio of the frame: the frame becomes the largest centered box with this ratio inside the block's region, for example 2.39 for a cinematic letterbox or 0.5 for a phone-shaped frame. shape 'circle' always uses 1.
shape
typeenumrequirednodefault—
Image payloads only. Mask applied to the frame, exported as the picture's native preset geometry (rect, roundRect, ellipse, hexagon). 'circle' makes the frame square. Default 'rectangle'.
shape· Allowed values"rectangle""rounded""circle""hexagon"
{
"shape": "rectangle"
}cornerRadius
typenumberrequirednodefault—
Image payloads only. Corner radius for shape 'rounded' as a fraction of the frame's shorter side. Default 0.16667, PowerPoint's roundRect default.
border
typeref:ImageBorderrequirednodefault—
Image payloads only. Line along the frame's shape.
border.color· Named choices (see schema for other values and constraints)"accent1""accent2""accent3""accent4""accent5""accent6""dark1""dark2""light1""light2""hyperlink""followedHyperlink""primary""secondary""accent""background""surface""surfaceAlt""text""textSecondary"
opacity
typenumberrequirednodefault—
Image payloads only. Picture opacity from 0 to 1, exported as a native alphaModFix. The border and overlay keep their own opacity. Default 1.
recolor
typeref:ImageRecolorrequirednodefault—
Image payloads only. Grayscale or duotone treatment of the picture's pixels.
recolor· Named choices (see schema for other values and constraints)"grayscale"recolor (oneOf 2).dark· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"recolor (oneOf 2).light· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"
overlay
typeref:Overlayrequirednodefault—
Image payloads only. Scrim over the picture in the frame's shape, or a band along one edge of a rectangle frame.
overlay.color· Named choices (see schema for other values and constraints)"accent1""accent2""accent3""accent4""accent5""accent6""dark1""dark2""light1""light2""hyperlink""followedHyperlink""primary""secondary""accent""background""surface""surfaceAlt""text""textSecondary"overlay.edge· Allowed values"top""bottom""left""right"
placement
typeref:ImagePlacementrequirednodefault—
Image payloads only, and only on a top-level block (slides.N.blocks.I), at most one per edge. Bleeds the image to one slide edge; the headings and the other blocks compose in the rest of the slide.
placement.edge· Allowed values"left""right""top""bottom"
video
typeref:Assetrequirednodefault—
Source for a video item. Engines do not play video: the preview draws a placeholder (a play badge with the asset's title or source as its caption), and PPTX export draws the same placeholder as native shapes linked to an http(s) source, with no embedded media. Native playback is out of scope (docs/programs/release-readiness).
{
"video": "asset:demo-video"
}chart
typeref:Chartrequirednodefault—
Chart payload. Presence of this field infers type 'chart'.
chart.type· Allowed values"100pct-stacked-area", "100pct-stacked-bar", "100pct-stacked-column", "area", "bar", "box-and-whisker", "column", "combo", "doughnut", "filled-radar", "funnel", "histogram", "line", "line-with-markers", "pareto", "pie", "radar", "radar-with-markers", "scatter", "stacked-area", "stacked-bar", "stacked-column", "stacked-line", "stacked-line-with-markers", "treemap", "waterfall", "world"chart.legend· Allowed values"none", "top", "bottom", "left", "right"chart.dataLabels (oneOf 2).content[]· Allowed values"value", "percent", "category"chart.dataLabels (oneOf 2).position· Allowed values"auto", "center", "inside-end", "inside-base", "outside-end", "above", "below", "left", "right"chart.colors[]· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"
table
typeref:Tablerequirednodefault—
Table payload. Presence of this field infers type 'table'.
table.columns[] (oneOf 3).style.fill· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"table.columns[] (oneOf 3).style.color· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"table.columns[] (oneOf 3).style.align· Allowed values"left", "center", "right"table.columns[] (oneOf 3).style.verticalAlign· Allowed values"top", "middle", "bottom"table.columns[] (oneOf 3).style.borders.top.color· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"table.columns[] (oneOf 3).style.borders.top.dash· Allowed values"solid", "dash", "dot"
code
typestring | ref:Coderequirednodefault—
Code payload. A string is shorthand for { "source": value }; object form carries optional syntax language and filename metadata.
{
"code": "def greet(name: str) -> str:\n return f\"Hello, {name}!\""
}metric
typestring | number | ref:Metricrequirednodefault—
Metric payload. A string or number is shorthand for { "value": value }; object form carries optional label, description, unit, delta, trend, and sentiment metadata. Numeric values remain numbers; renderers format them for display.
metric (oneOf 3).trend· Allowed values"up""down""flat"metric (oneOf 3).sentiment· Allowed values"positive""negative""neutral"
{
"metric": "98%"
}quote
typestring | ref:Quoterequirednodefault—
Quote payload. A string is shorthand for { "text": value }; object form carries optional attribution, role, photo and source metadata.
{
"quote": "This changed how our team handles reviews."
}timeline
typeref:Timelinerequirednodefault—
Timeline payload ordered by narrative or chronology.
timeline (oneOf 1)[].status· Allowed values"done""current""planned"
{
"timeline": [
{
"when": "2026-01",
"what": "Pilot",
"description": "Launch with the first operations team."
},
{
"when": "2026-04",
"what": "Rollout",
"description": "Expand to all regions."
}
]
}caption
typeref:Captionrequirednodefault—
Caption for an image, chart, table or video payload, composed inside the block's region (below the media by default). Invalid on other payload kinds and on groups.
caption (oneOf 3).position· Allowed values"below""above"caption (oneOf 3).align· Allowed values"left""center""right"
blocks
typearray<ref:ContentPayload>requirednodefault—
Ordered children of a group. Each child is a leaf or another group.
blocks[].type· Allowed values"text", "list", "image", "chart", "table", "video", "code", "metric", "quote", "timeline", "group"blocks[].numbering· Named choices (see schema for other values and constraints)"arabic", "roman-upper", "roman-lower", "alpha-upper", "alpha-lower"blocks[].numbering (oneOf 2).style· Allowed values"arabic", "roman-upper", "roman-lower", "alpha-upper", "alpha-lower"blocks[].numbering (oneOf 2).suffix· Allowed values"period", "paren", "paren-both"blocks[].numbering (oneOf 3)[]· Named choices (see schema for other values and constraints)"arabic", "roman-upper", "roman-lower", "alpha-upper", "alpha-lower"blocks[].columns· Named choices (see schema for other values and constraints)"auto"blocks[].fit· Allowed values"cover", "contain", "stretch"blocks[].shape· Allowed values"rectangle", "rounded", "circle", "hexagon"blocks[].border.color· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].recolor· Named choices (see schema for other values and constraints)"grayscale"blocks[].recolor (oneOf 2).dark· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].recolor (oneOf 2).light· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].overlay.color· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].overlay.edge· Allowed values"top", "bottom", "left", "right"blocks[].placement.edge· Allowed values"left", "right", "top", "bottom"blocks[].chart.type· Allowed values"100pct-stacked-area", "100pct-stacked-bar", "100pct-stacked-column", "area", "bar", "box-and-whisker", "column", "combo", "doughnut", "filled-radar", "funnel", "histogram", "line", "line-with-markers", "pareto", "pie", "radar", "radar-with-markers", "scatter", "stacked-area", "stacked-bar", "stacked-column", "stacked-line", "stacked-line-with-markers", "treemap", "waterfall", "world"blocks[].chart.legend· Allowed values"none", "top", "bottom", "left", "right"blocks[].chart.dataLabels (oneOf 2).content[]· Allowed values"value", "percent", "category"blocks[].chart.dataLabels (oneOf 2).position· Allowed values"auto", "center", "inside-end", "inside-base", "outside-end", "above", "below", "left", "right"blocks[].chart.colors[]· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].table.columns[] (oneOf 3).style.fill· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].table.columns[] (oneOf 3).style.color· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].table.columns[] (oneOf 3).style.align· Allowed values"left", "center", "right"blocks[].table.columns[] (oneOf 3).style.verticalAlign· Allowed values"top", "middle", "bottom"blocks[].table.columns[] (oneOf 3).style.borders.top.color· Named choices (see schema for other values and constraints)"accent1", "accent2", "accent3", "accent4", "accent5", "accent6", "dark1", "dark2", "light1", "light2", "hyperlink", "followedHyperlink", "primary", "secondary", "accent", "background", "surface", "surfaceAlt", "text", "textSecondary"blocks[].table.columns[] (oneOf 3).style.borders.top.dash· Allowed values"solid", "dash", "dot"blocks[].metric (oneOf 3).trend· Allowed values"up", "down", "flat"blocks[].metric (oneOf 3).sentiment· Allowed values"positive", "negative", "neutral"blocks[].timeline (oneOf 1)[].status· Allowed values"done", "current", "planned"blocks[].caption (oneOf 3).position· Allowed values"below", "above"blocks[].caption (oneOf 3).align· Allowed values"left", "center", "right"blocks[].composition.mode· Allowed values"auto", "grid", "row", "column"blocks[].composition.overflow· Allowed values"warn", "error"
composition
typeref:Compositionrequirednodefault—
Arrangement within this group. Only minFontSize and overflow inherit from the parent; strict overflow cannot be weakened.
composition.mode· Allowed values"auto""grid""row""column"composition.overflow· Allowed values"warn""error"
allOf 1 · object
Exact constraints for allOf 1
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "list"
}
}
},
"then": {
"required": [
"items"
]
}
}allOf 2 · object
Exact constraints for allOf 2
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "image"
}
}
},
"then": {
"required": [
"image"
]
}
}allOf 3 · object
Exact constraints for allOf 3
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "chart"
}
}
},
"then": {
"required": [
"chart"
]
}
}allOf 4 · object
Exact constraints for allOf 4
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "table"
}
}
},
"then": {
"required": [
"table"
]
}
}allOf 5 · object
Exact constraints for allOf 5
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "video"
}
}
},
"then": {
"required": [
"video"
]
}
}allOf 6 · object
Exact constraints for allOf 6
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "code"
}
}
},
"then": {
"required": [
"code"
]
}
}allOf 7 · object
Exact constraints for allOf 7
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "metric"
}
}
},
"then": {
"required": [
"metric"
]
}
}allOf 8 · object
Exact constraints for allOf 8
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "quote"
}
}
},
"then": {
"required": [
"quote"
]
}
}allOf 9 · object
Exact constraints for allOf 9
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "timeline"
}
}
},
"then": {
"required": [
"timeline"
]
}
}allOf 10 · object
Exact constraints for allOf 10
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "group"
}
}
},
"then": {
"required": [
"blocks"
]
}
}allOf 11 · object
Exact constraints for allOf 11
{
"if": {
"required": [
"composition"
]
},
"then": {
"required": [
"blocks"
]
}
}allOf 12 · object
Exact constraints for allOf 12
{
"if": {
"required": [
"blocks"
]
},
"then": {
"properties": {
"type": {
"const": "group"
}
},
"not": {
"anyOf": [
{
"required": [
"text"
]
},
{
"required": [
"items"
]
},
{
"required": [
"bullets"
]
},
{
"required": [
"image"
]
},
{
"required": [
"video"
]
},
{
"required": [
"chart"
]
},
{
"required": [
"table"
]
},
{
"required": [
"code"
]
},
{
"required": [
"metric"
]
},
{
"required": [
"quote"
]
},
{
"required": [
"timeline"
]
}
]
}
}
}allOf 13 · object
Exact constraints for allOf 13
{
"if": {
"required": [
"columns"
]
},
"then": {
"anyOf": [
{
"required": [
"items"
]
},
{
"required": [
"bullets"
]
}
]
}
}Complete definition constraints
{
"type": "object",
"description": "A content leaf or recursively composed group. A group contains blocks and optional composition; it cannot mix blocks with leaf payload fields. Groups may nest up to 32 levels.",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"description": "Optional stable identifier for this payload, unique among slide and payload ids in the document. Use when another system needs to address the payload across edits — patch-style agent edits, comments, review state, or generation provenance. Identity survives reordering where array indexes do not.",
"examples": [
"kpi-adoption",
"churn-quote"
]
},
"extensions": {
"type": "object",
"description": "Custom data passthrough for agent workflows at payload scope; ignored by the engine but preserved across read/write round-trips."
},
"region": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]*$",
"description": "Pin a root block (slides.N.blocks.I) to a region of the slide's template layout by name (OPF 0.19). The block goes to that region when the region exists, accepts the block's kind and has room; otherwise the pin is ignored with a warning (opf/region-unknown, opf/region-kind or opf/region-full) and the block is placed by its kind. Blocks without a pin are bound by reading order, role and kind. A pin on a nested block, or on a slide without a template layout, has no effect.",
"examples": [
"notes",
"metrics"
]
},
"type": {
"type": "string",
"enum": [
"text",
"list",
"image",
"chart",
"table",
"video",
"code",
"metric",
"quote",
"timeline",
"group"
],
"description": "Optional content kind. When omitted, engines infer the kind from the fields present."
},
"text": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"$ref": "#/$defs/TextRun"
}
}
],
"description": "Text payload. Use a string for plain text or TextRun[] for inline rich text. TextRun items may be plain strings or formatted run objects.",
"examples": [
"Hello, world",
[
"Revenue grew ",
{
"text": "42%",
"bold": true,
"color": "#16A34A"
},
" year over year."
]
]
},
"items": {
"type": "array",
"items": {
"$ref": "#/$defs/ListItem"
},
"description": "Structured list payload (type 'list'). Each item is either a plain string, a TextRun[] rich text sequence, or a ListItem object with optional `description`. List nesting uses item.level rather than nested content payloads. Use `items` when entries share a shape or any entry needs a `description`; use `bullets` for plain talking points. Both draw the same marker, nesting and numbering. A block or region holds `items` or `bullets`, never both, and `items` cannot sit beside `text`.",
"examples": [
[
"Sub-second agent latency",
[
"Drop-in compatible with ",
{
"text": "OpenAI tool-calling",
"bold": true
}
],
{
"text": "SOC 2 Type II",
"description": "Security review ready for enterprise procurement."
}
]
]
},
"bullets": {
"type": "array",
"items": {
"$ref": "#/$defs/BulletItem"
},
"description": "Prose bullet payload: short talking points, each standing alone. Presence of this field infers type 'text', so it may sit beside `text` in one payload. Entries have no `description`; use `items` for entries with supporting detail.",
"examples": [
[
"Sub-second agent latency",
"Drop-in compatible with OpenAI tool-calling",
"SOC 2 Type II"
]
]
},
"numbering": {
"$ref": "#/$defs/NumberingSpec",
"description": "Number the payload's `items` or `bullets` instead of bulleting them. A style name (arabic, roman-upper, roman-lower, alpha-upper, alpha-lower) or a Numbering object applies to every list level; an array gives one entry per level (index = level, the last entry repeats for deeper levels). Counting follows PowerPoint: consecutive entries of one level count up from its start, and an entry of a shallower level restarts the deeper levels. Absent = bullets. Valid only with `items` or `bullets`. Native PowerPoint export writes a:buAutoNum with the matching scheme and startAt; the preview draws the same numbers at the same marker geometry.",
"examples": [
"arabic",
"roman-lower",
{
"style": "alpha-upper",
"start": 3,
"suffix": "paren"
},
[
"arabic",
"alpha-lower",
{
"style": "roman-lower",
"suffix": "paren-both"
}
]
]
},
"columns": {
"oneOf": [
{
"const": "auto"
},
{
"type": "integer",
"minimum": 1,
"maximum": 3
}
],
"description": "Lay the payload's `items` or `bullets` out in columns (OPF 0.19). 'auto' tries 1, 2 then 3 equal columns at the starting text size and uses the first count at which the list fits, as long as a column stays at least a quarter of the slide wide; when none fits, the largest allowed count shrinks towards minFontSize. 1, 2 or 3 fixes the count. Column breaks fall between items (a nested item stays with its parent) and keep the columns as even as possible; numbering continues and reading order runs column by column. A lone list in a layout region with listColumns: 'auto' behaves as 'auto'.",
"examples": [
"auto",
2
]
},
"image": {
"$ref": "#/$defs/Asset",
"description": "Source for an image item.",
"examples": [
"https://cdn.acme.com/images/diagram.png",
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9V3iWggAAAAASUVORK5CYII=",
"./images/diagram.png",
"asset:img-diagram"
]
},
"fit": {
"type": "string",
"enum": [
"cover",
"contain",
"stretch"
],
"description": "Image payloads only. How the picture fills its frame: 'cover' fills it and crops what overflows around focus; 'contain' shows the whole picture, in a frame of its own proportions placed at the region's anchor (top by default); 'stretch' scales it to the frame exactly. Default: the effective design.imageFit, else 'cover' in a layout and 'contain' on a slide with no layout."
},
"focus": {
"$ref": "#/$defs/ImageFocus",
"description": "Image payloads only. Point of the picture to keep in view when 'cover' crops it. Ignored by the other fits."
},
"aspectRatio": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 10,
"description": "Image payloads only. Width-to-height ratio of the frame: the frame becomes the largest centered box with this ratio inside the block's region, for example 2.39 for a cinematic letterbox or 0.5 for a phone-shaped frame. shape 'circle' always uses 1."
},
"shape": {
"type": "string",
"enum": [
"rectangle",
"rounded",
"circle",
"hexagon"
],
"description": "Image payloads only. Mask applied to the frame, exported as the picture's native preset geometry (rect, roundRect, ellipse, hexagon). 'circle' makes the frame square. Default 'rectangle'."
},
"cornerRadius": {
"type": "number",
"minimum": 0,
"maximum": 0.5,
"description": "Image payloads only. Corner radius for shape 'rounded' as a fraction of the frame's shorter side. Default 0.16667, PowerPoint's roundRect default."
},
"border": {
"$ref": "#/$defs/ImageBorder",
"description": "Image payloads only. Line along the frame's shape."
},
"opacity": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Image payloads only. Picture opacity from 0 to 1, exported as a native alphaModFix. The border and overlay keep their own opacity. Default 1."
},
"recolor": {
"$ref": "#/$defs/ImageRecolor",
"description": "Image payloads only. Grayscale or duotone treatment of the picture's pixels."
},
"overlay": {
"$ref": "#/$defs/Overlay",
"description": "Image payloads only. Scrim over the picture in the frame's shape, or a band along one edge of a rectangle frame."
},
"placement": {
"$ref": "#/$defs/ImagePlacement",
"description": "Image payloads only, and only on a top-level block (slides.N.blocks.I), at most one per edge. Bleeds the image to one slide edge; the headings and the other blocks compose in the rest of the slide."
},
"video": {
"$ref": "#/$defs/Asset",
"description": "Source for a video item. Engines do not play video: the preview draws a placeholder (a play badge with the asset's title or source as its caption), and PPTX export draws the same placeholder as native shapes linked to an http(s) source, with no embedded media. Native playback is out of scope (docs/programs/release-readiness).",
"examples": [
"asset:demo-video",
"./media/demo.mp4"
]
},
"chart": {
"$ref": "#/$defs/Chart",
"description": "Chart payload. Presence of this field infers type 'chart'."
},
"table": {
"$ref": "#/$defs/Table",
"description": "Table payload. Presence of this field infers type 'table'."
},
"code": {
"oneOf": [
{
"type": "string"
},
{
"$ref": "#/$defs/Code"
}
],
"description": "Code payload. A string is shorthand for { \"source\": value }; object form carries optional syntax language and filename metadata.",
"examples": [
"def greet(name: str) -> str:\n return f\"Hello, {name}!\"",
{
"source": "export function greet(name: string) {\n return `Hello, ${name}`;\n}",
"language": "ts",
"filename": "greet.ts"
}
]
},
"metric": {
"oneOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"$ref": "#/$defs/Metric"
}
],
"description": "Metric payload. A string or number is shorthand for { \"value\": value }; object form carries optional label, description, unit, delta, trend, and sentiment metadata. Numeric values remain numbers; renderers format them for display.",
"examples": [
"98%",
42,
{
"value": "$12.4M",
"label": "Revenue",
"description": "Recognized revenue for the quarter.",
"delta": "+12%",
"trend": "up"
}
]
},
"quote": {
"oneOf": [
{
"type": "string"
},
{
"$ref": "#/$defs/Quote"
}
],
"description": "Quote payload. A string is shorthand for { \"text\": value }; object form carries optional attribution, role, photo and source metadata.",
"examples": [
"This changed how our team handles reviews.",
{
"text": "This changed how our team handles reviews.",
"attribution": "VP Operations, Acme Corp",
"source": "Customer interview, March 2026"
}
]
},
"timeline": {
"$ref": "#/$defs/Timeline",
"description": "Timeline payload ordered by narrative or chronology.",
"examples": [
[
{
"when": "2026-01",
"what": "Pilot",
"description": "Launch with the first operations team."
},
{
"when": "2026-04",
"what": "Rollout",
"description": "Expand to all regions."
}
],
{
"name": "Rollout Plan",
"description": "Major milestones for the regional rollout.",
"events": [
{
"when": "Q1",
"what": "Pilot"
},
{
"when": "Q2",
"what": "Rollout"
}
]
}
]
},
"caption": {
"$ref": "#/$defs/Caption",
"description": "Caption for an image, chart, table or video payload, composed inside the block's region (below the media by default). Invalid on other payload kinds and on groups."
},
"blocks": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/ContentPayload"
},
"description": "Ordered children of a group. Each child is a leaf or another group."
},
"composition": {
"$ref": "#/$defs/Composition",
"description": "Arrangement within this group. Only minFontSize and overflow inherit from the parent; strict overflow cannot be weakened."
}
},
"allOf": [
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "list"
}
}
},
"then": {
"required": [
"items"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "image"
}
}
},
"then": {
"required": [
"image"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "chart"
}
}
},
"then": {
"required": [
"chart"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "table"
}
}
},
"then": {
"required": [
"table"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "video"
}
}
},
"then": {
"required": [
"video"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "code"
}
}
},
"then": {
"required": [
"code"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "metric"
}
}
},
"then": {
"required": [
"metric"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "quote"
}
}
},
"then": {
"required": [
"quote"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "timeline"
}
}
},
"then": {
"required": [
"timeline"
]
}
},
{
"if": {
"required": [
"type"
],
"properties": {
"type": {
"const": "group"
}
}
},
"then": {
"required": [
"blocks"
]
}
},
{
"if": {
"required": [
"composition"
]
},
"then": {
"required": [
"blocks"
]
}
},
{
"if": {
"required": [
"blocks"
]
},
"then": {
"properties": {
"type": {
"const": "group"
}
},
"not": {
"anyOf": [
{
"required": [
"text"
]
},
{
"required": [
"items"
]
},
{
"required": [
"bullets"
]
},
{
"required": [
"image"
]
},
{
"required": [
"video"
]
},
{
"required": [
"chart"
]
},
{
"required": [
"table"
]
},
{
"required": [
"code"
]
},
{
"required": [
"metric"
]
},
{
"required": [
"quote"
]
},
{
"required": [
"timeline"
]
}
]
}
}
},
{
"if": {
"required": [
"columns"
]
},
"then": {
"anyOf": [
{
"required": [
"items"
]
},
{
"required": [
"bullets"
]
}
]
}
}
]
}