Skip to main content

Bulk Delete Store Products

PUT 

/api/storefront/instances/:id/products/delete

Permanently delete the SELECTED MIRRORED STORE PRODUCTS from SKU.io, along with their mapping links. This does NOT delete anything on the store, and it does NOT delete the SKU.io catalog products they were mapped to.

Not yet available to API tokens

This endpoint currently requires session authentication; Personal Access Token scope support is in progress.

A deleted row comes back on the next catalogue import if the store still has the product.

Unlike archiving, this has no blockers — everything in the selection is deleted. Call PUT /deleteable first if you want to confirm the set.

Note the verb: this endpoint is a PUT, not a DELETE.

Selecting what to act on — the shared selection contract used by this endpoint, POST /bulk-map, POST /create-sku-products, PUT /archive, PUT /unarchive, POST /archiveable, PUT /delete and PUT /deleteable:

  • {"ids": [16, 17]} — an explicit list of store-product ids.
  • {"apply_to_all": true} — every product on the instance that the product list would show with no filters, i.e. every NON-ARCHIVED product.
  • {"apply_to_all": true, "filters": { ... }} — every product matching those filters, however many pages that spans. This is "select everything matching what I am looking at".

filters carries the SAME keys the product list accepts, but written as bare column names with no filter[...] wrapper — e.g. {"mapping_status": "unmapped", "status": "active", "search": "door", "search_columns": "sku,unified_title", "price.greater_than": 100, "filter_groups": "<base64 tree>"}. A nested {"filter": {...}} object, literal filter[col] keys, and a JSON string of the whole object are all accepted too. Display and paging keys (page, per_page, sort, included, total, table_specifications, query) are ignored — the selection is never limited to one page. search is deliberately NOT ignored.

Two rules worth knowing:

  • If filters does not mention archived, archived products are excluded, exactly as the list hides them by default. A sweep can therefore never reach a product the list was not showing.
  • A filters payload that cannot be parsed, or a filter_groups tree that cannot be parsed, is rejected with 422 rather than being treated as "no filters" — which would have acted on every row.

Body fields: ids (array of integers — required unless you send a select-all flag, and every id must belong to this connection or the call is rejected with 422), apply_to_all (boolean), mode (send "all" as an equivalent of apply_to_all: true with no filters), filters (object or JSON string).

Authentication: Bearer token (session or PAT).

Request​

Responses​

OK

Response Headers
    Content-Type