Preview first
preview reads the source store and returns exactly what would be created. It writes
nothing, so it is safe to call before showing a confirmation step.
ok: false with a human-readable error
rather than failing the whole call.
Import
status—0draft (default),1active,2archived. Imports default to draft so nothing reaches your storefront before you have reviewed the pricing.skip_existing— defaults totrue. A link whose source product this store already imported comes back as"skipped": truewith the existingproduct_idinstead of creating a duplicate. Set it tofalseto import a second copy deliberately.- Up to 20 URLs per call. One bad link never aborts the batch: the response is
207 Multi-Statuswhen some succeeded and some failed,200when all succeeded, and502when none did. - A storefront resync (
products.json→ CDN) is scheduled once per successful batch.
write_products. Preview needs it too — it performs outbound fetches on your
behalf.
From an agent (MCP)
Twodtc_* tools wrap the same endpoints, so an agent can do this without writing HTTP:
catalog:write — preview included, since it drives outbound fetches on the
store’s behalf. The store is bound to the agent key, so there is no store argument.
What gets copied
Money is copied verbatim in the source store’s currency — no conversion is applied.
Check pricing before publishing if the source store sells in another currency.
Inventory is not imported. Public storefronts expose whether a variant is in stock
but never the actual count, so imported variants start untracked rather than with an
invented number.
Accepted URL shapes
All of these resolve to the same product:When a link cannot be read
The importer reads the public storefront — no Shopify app, OAuth or Admin API token is involved. It tries/products/{handle}.json, then /products/{handle}.js, then the
product page’s embedded JSON, and reports which one worked in source.
Some stores block automated reads on every one of those routes. When that happens the
item comes back with:
This store blocks automated reads of its product data. Try again later, or add the product manually.There is no workaround from our side — the store is refusing the request. Add the product manually with
POST /products instead.