Bulk Operation
POST/api/shopify/:integrationInstance/products/bulk
Execute a bulk operation on Shopify products synchronously.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Authentication: Requires Bearer token.
Validation:
- action: required, in: map, unmap, create, remap, archive, unarchive, delete, refresh, revenue
- selection.type: required, in: selected, visible, filtered
- selection.ids: required_if type=selected, array of integers
- selection.filters: sometimes, array of filter key-value pairs
- options.match_by: sometimes, in: sku, barcode (for map/remap)
- options.create_if_no_match: sometimes, boolean (for map action)
- options.field_mappings: sometimes, array of {shopify_field, sku_field}
- options.financial_line_type_id: required for revenue, integer or null
Field mappings for the create action
options.field_mappings controls how Shopify values are copied onto the SKU products created by this operation, for this request only — it is never saved to the integration. Each entry pairs a Shopify source field with a SKU target field; call GET /api/shopify/mappings/available-fields for the valid values. Entries naming an unknown field are ignored. Omit options.field_mappings to use the mappings already saved on the integration.
Revenue line mapping (revenue action)
Maps every product in the selection to one revenue financial line type, so future orders book those items as revenue lines instead of product lines (for example shipping insurance, package protection or service fees). No SKU products are created. Pass options.financial_line_type_id (required for this action) with the id of a revenue-classified financial line type, or null to clear the revenue mapping. Products already on that type, or with no revenue mapping to clear, are counted as skipped. A non-revenue type returns 422. Orders already imported are not changed.
Product IDs that belong to a different integration instance are not acted on and are counted in skipped.
Request
Responses
- 200
- 401
- 403
- 404
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Validation failed — the body is a field → messages map (Laravel shape) or the platform envelope with a stable machine-readable code. Fix the payload and resubmit.
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.