Platform
Update

Merchant Center can write — product inserts, data sources and feed pushes

TL;DR

Merchant Center went from reporting to acting. Five writes shipped, along with the thing that makes them usable: Merchant API has no "products" write at all, so the data-source tools are part of the capability rather than extras. Advanced (multi-client) accounts also stopped being a dead end.

What shipped

  • `insert_product` and `delete_product` — with upsert semantics stated up front, so a nightly push is safe to re-run rather than something you hope is idempotent.
  • `create_datasource` and `fetch_datasource`, because Merchant API has no direct product write: you insert a product INPUT into a DATA SOURCE and Google computes the served product from it.
  • `delete_datasource`, which removes a feed and every offer it supplied.
  • `list_subaccounts` for advanced accounts, fetched live and named in the error rather than left for you to find.
  • A date-ranged Merchant read, so Shopping performance can be asked about a period rather than only as a snapshot.
A price submitted without a currency is refused rather than written as micros of nothing, and the read-back distinguishes "not processed yet" from "lost" — a feed fetch returning ACCEPTED is not the same as PROCESSED.

The fence is drawn on what a shopper sees

Shopping writes are not all the same risk, and the tiers deliberately do not follow the verb. A price or availability change is Auto-pilot only, because a mismatch between your feed and your landing page is a policy violation rather than merely a wrong number. A title or image fix is an ordinary approval-gated write.

That split exists because a fence people learn to switch off protects nothing. If every Shopping edit sat behind the strictest control, the control would be disabled within a week.

`delete_datasource` is the never-unattended member: it reads the source first and requires you to echo the source's own display name back, because the id is a long number and one digit is a different live feed.

Advanced accounts stop being a dead end

A multi-client Merchant Center account answers 403 to product and issue queries — "only subaccounts and standalone accounts" — while a plain account lookup on the same credentials succeeds. Read as a raw 403 it looks like a permissions problem, and the instinct it provokes is to re-authorize, which cannot possibly help.

It is now translated into a named, permanent refusal that says outright this is not a permissions problem, and lists the sub-accounts to call instead — fetched live rather than guessed.

Worth recording for anyone building against Merchant API directly: the sub-account listing uses a COLON verb, `accounts/{id}:listSubaccounts`. The RESTful-looking `accounts/{id}/subaccounts` is a 404.

Frequently asked questions

Can the agent update my Merchant Center product data?
Yes — insert and delete products, and create, fetch or delete data sources. Every write pauses for approval and records an audit row, and price or availability changes sit behind the strictest tier because a feed-to-landing-page mismatch is a policy violation.
Why does Merchant Center need data source tools to write a product?
Merchant API has no direct products write. You insert a product input into a data source and Google computes the served product from it, so the data source tools are part of the capability rather than optional extras.
Why does my advanced Merchant Center account return 403?
Multi-client parent accounts refuse product and issue queries — those belong to sub-accounts or standalone accounts. It is not a permissions problem and re-authorizing will not fix it; the sub-accounts to call instead are now named in the refusal.
Is it safe to re-run a nightly product push?
Yes. The writes use upsert semantics and that is stated on the tool rather than assumed, so re-running the same push updates rather than duplicating.
Try it on your own account

Start free — 2,500 credits a month, no credit card. Reads are free, and every write waits for your approval.

Related releases