AI shopping referrals up 693%: a Sume output schema for listing copy

Adobe data in KTVZ has AI referrals to US retail up 693.4% in Nov-Dec 2025. Bind a headline, hero image and alt-text schema so each video returns typed JSON.

6 min readSume
All posts

If shoppers arrive from AI assistants, what should a product video job return? Structured fields a listing page can read without a human: a headline, a hero asset and alt text. A KTVZ report on holiday shoppers and AI (published 2026-09-30, read 2026-10-04) says Adobe Analytics measured AI referrals to US retail sites up 693.4% in November and December 2025 against the prior year, and that AI-referred visitors converted 42% higher in March 2026.

Those are one article's figures from a vendor's analytics, and they describe traffic, not video. The practical reading is narrower: more of the discovery may be machine-read, so the text next to each clip should be real data, not a caption pasted by hand.

The schema

The Sume structured-output docs show this exact shape: headline, hero_image as a media object and alt_text. Bind it with output_schema on the run and the receipt's output comes back in that shape. The schema must stay inside the strict subset: a root object, additionalProperties: false everywhere, and every property listed in required. Media fields use { "$ref": "SumeMediaFile#" }.

Set primary_output_key to hero_image so primary_output_url points at the file your page embeds. You send either output_schema or response_format, never both.

Build and check the request body

The script below builds the run body and checks the strict-subset rules that are easiest to break: closed objects and a complete required list.

import json

schema = {
  "type": "object",
  "additionalProperties": False,
  "properties": {
    "headline": {"type": "string"},
    "hero_image": {"$ref": "SumeMediaFile#"},
    "alt_text": {"type": "string"},
  },
  "required": ["headline", "hero_image", "alt_text"],
}
assert schema["additionalProperties"] is False
assert set(schema["required"]) == set(schema["properties"])
body = {
  "instruction": "Holiday spot for the Aurora headphones.",
  "input": {"sku": "aurora-01"},
  "output_schema": schema,
  "primary_output_key": "hero_image",
}
print(json.dumps(body)[:120])

Review before you publish

A typed object is still model output. Read alt_text against the clip before it goes live, because alt text that does not describe the product helps no one, human or machine. Treat the first fifty rows as a sample: check them by hand, tighten the instruction, and only then run the rest.

Put guardrails in the schema where the subset allows. Enumerations (up to 1,000 values) can constrain a category field, and nullable unions let a field stay empty instead of invented. The subset rejects oneOf, allOf and nullable, so express optional values as a union with null.

Finally, remember the schema describes shape, not truth. Facts like price and stock should come from your own feed in input, and be checked there.

What the page can trust

The receipt tells you whether the run filled the object itself (filled_by: "agent") or a projection built it afterwards from the media and the closing text. A projection never sees your input, so do not expect a value you sent to reappear unless the run repeated it. Sume also checks media URLs in the output against what the run produced, and a mismatch fails the gate rather than shipping a made-up link.

A run whose projection does not match your schema can still complete as degraded: media is in artifacts[] and output is null. Branch on the webhook's outcome before you write to a listing.

Numbers to cite, and numbers not to

Figures and sources, KTVZ article read 2026-10-04
FigureSourceUse it for
AI referrals to US retail sites up 693.4%, Nov-Dec 2025 vs prior yearAdobe Analytics, via KTVZContext that discovery is changing
AI-referred visitors converted 42% higher, March 2026Adobe Analytics, via KTVZContext only; not a promise for your store
Alt text and headline per clipYour own schemaMachine-readable listing data

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume