Merchant Center conversational attributes: draft them as JSON
Conversational attributes add richer context to product listings. Draft them per SKU as schema-bound JSON from a Sume Format run, then review before upload.

Conversational attributes are extra product details you submit to Google so shoppers' questions can be answered with richer context. Sume can draft candidate text for them: bind a JSON Schema to a Format run and read back typed, validated JSON per SKU. Sume does not upload to Merchant Center, so a person reviews and submits.
Google facts are from its September 2026 holiday shopping post, read 2026-09-30. Sume facts are from Structured output and the Format catalog. The Google post does not give the attribute names or field limits, so take those from Merchant Center's own help.
What does Google say about conversational attributes?
Google recommends submitting them to add richer context to product listings. It reports that in testing with one retailer, submitted attributes were incorporated 50% of the time in relevant product recommendations in AI Mode. That is Google's figure from a single test, not a guarantee.
How do I get typed JSON from a run?
Send output_schema on the run with a name, strict and a schema. The docs' own example passes "input": { "product_url": "https://example.com/p" } and a schema with additionalProperties: false. The run's text comes back projected into your object. A schema outside the supported subset returns 400 output_schema_invalid: nothing runs and nothing is charged.
const schema = {
name: "acme/conversational-attrs/v1",
strict: true,
schema: {
type: "object",
additionalProperties: false,
required: ["best_for", "not_for"],
properties: {
best_for: { type: "string" },
not_for: { type: "string" },
},
},
};
const res = await fetch("https://api.sume.com/v1/formats/sume/sume-recreate/runs", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.SUME_API_KEY,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
instruction: "Draft who this product is best for and not for, using only the page.",
input: { product_url: "https://example.com/p" },
output_schema: schema,
}),
});
console.log(res.status);Which Format should I call?
Choose one whose output_kind is text or that suits your input; read it first with GET /v1/formats/sume/{slug}. The sume-recreate slug above is a placeholder: confirm its io profile fits before relying on it, because a Format built for video may spend on generation you do not want. Set generation_spend_cap_usd on the run to bound it.
What should a human check before upload?
Every sentence against the product page and your return and shipping terms. Drop anything the page does not support, since the schema guarantees shape, not truth. Batch many SKUs with a bulk run style loop if the catalog is large.
| Step | Who |
|---|---|
| Draft attribute text | Sume Format run with output_schema |
| Verify claims | You |
| Submit to Merchant Center | You, in Google's tools |
Sources
Related posts
More in Developers
- Three Responses subagents, one Sume workspace queue
Responses multi_agent runs 3 subagents by default and they share your tools. Sume accepts extra jobs as queued until queue_full; give each create its own key.
- Music API 400 model_not_found: fix an unknown model id
An unknown model on POST /v1/music-router/generate fails with 400 model_not_found and a catalog_url. Use an id from GET /v1/music-router/models or omit model.
- Music API timeout at 30 seconds: poll or webhook instead
A song can outlast Sume's 30-second wait. The wait bounds the HTTP call, not the job, so submit async and poll the status URL, or use a webhook.
- Sume music job says sume/music-auto: which engine ran?
job.model echoes the id you requested; job.request.routed_model names the engine that ran, such as lyria-3.5. Read both fields on the job envelope.
Written by Sume