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.

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
| Figure | Source | Use it for |
|---|---|---|
| AI referrals to US retail sites up 693.4%, Nov-Dec 2025 vs prior year | Adobe Analytics, via KTVZ | Context that discovery is changing |
| AI-referred visitors converted 42% higher, March 2026 | Adobe Analytics, via KTVZ | Context only; not a promise for your store |
| Alt text and headline per clip | Your own schema | Machine-readable listing data |
Sources
Related posts
More in Use cases
- AI vinyl sleeve art at 12 inches: gpt-image-2.5 stops at 240 dpi
A 12-inch square sleeve face at 300 dpi is 3,600 pixels square, but gpt-image-2.5's largest square is 2880, or 240 dpi. Your options for the last 60 dpi.
- AI voice disclosure: OpenAI rule, cloning consent, Voxtral license
What the OpenAI, Microsoft and Mistral pages say about disclosing AI speech, cloning a voice and non-commercial weights, and a publish-time checklist.
- AI wall art canvas: gpt-image-2.5 pixels per inch, 8x10 to 24x36
The biggest 2:3 image gpt-image-2.5 can send is 2336x3504, which is 97 pixels per inch at 24x36. Here is the dpi for five canvas sizes and when to upscale.
- AI wine label design via API: artwork from the model, text from code
For a wine label, generate only the artwork with gpt-image-2.5, ask for a clear panel, and set the name, vintage and regulatory lines in code so they are exact.
Written by Sume