The Plugin Integration API now persists a per-installation product catalog, removing the need for plugins to keep their own mapping between shop products and Qamera assets. New endpoints POST /plugin/images and POST /plugin/packshots register source product photos and generation-ready packshots; GET /plugin/products, GET /plugin/products/{id_or_ref}, and GET /plugin/packshots expose the catalog back to the merchant; DELETE /plugin/products/{id_or_ref} soft-deletes a product while DELETE /plugin/packshots/{id_or_ref} hard-removes a packshot.
Registration is idempotent by external_ref, so re-running the same import on the shop side is safe. Identical content uploaded twice on a single installation is rejected by SHA-256 deduplication. Packshot jobs may opt in to automatic catalog write-back by setting auto_register_packshot: true in the job settings — the resulting packshot is then immediately available as a subjects[].packshot_asset_id in subsequent /jobs requests without a follow-up call. All write endpoints are gated by the new plugin.catalog:write scope; reads continue to use the existing plugin.catalog:read scope. Full schemas and examples are in the OpenAPI contract.