{"openapi":"3.1.0","info":{"description":"Bagisto Admin API - Administrative operations for store management and configuration.","contact":[],"license":[],"version":"1.0.4"},"servers":[{"url":"/api/admin","description":"Admin API - Administrative endpoints"}],"paths":{"/catalog/attributes":{"get":{"tags":["Admin Catalog: Attributes"],"summary":"List attributes (datagrid parity)","description":"Paginated, filterable, sortable attribute list mirroring the admin Catalog \u2192 Attributes datagrid.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by attribute ID \u2014 single integer or comma-separated list (e.g. \"1\" or \"1,2\").","schema":{"type":"string","example":"1"}},{"name":"code","in":"query","description":"Partial attribute code match (SQL LIKE).","schema":{"type":"string","example":"color"}},{"name":"type","in":"query","description":"Exact attribute type filter.","schema":{"type":"string","enum":["text","textarea","price","boolean","select","multiselect","datetime","date","image","file","checkbox"],"example":"select"}},{"name":"admin_name","in":"query","description":"Partial admin name match (SQL LIKE).","schema":{"type":"string","example":"Color"}},{"name":"is_required","in":"query","description":"Filter by is_required (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"is_unique","in":"query","description":"Filter by is_unique (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":0}},{"name":"is_filterable","in":"query","description":"Filter by is_filterable (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"is_configurable","in":"query","description":"Filter by is_configurable (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":0}},{"name":"is_visible_on_front","in":"query","description":"Filter by is_visible_on_front (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"is_user_defined","in":"query","description":"Filter by is_user_defined (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"value_per_locale","in":"query","description":"Filter by value_per_locale (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":0}},{"name":"value_per_channel","in":"query","description":"Filter by value_per_channel (0 or 1).","schema":{"type":"integer","enum":[0,1],"example":0}},{"name":"locale","in":"query","description":"Locale code for translation resolution (e.g. \"en\").","schema":{"type":"string","example":"en"}},{"name":"sort","in":"query","description":"Column to sort by.","schema":{"type":"string","enum":["id","code","admin_name","type","position"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of attribute rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":1,"code":"sku","type":"text","adminName":"SKU","isRequired":1,"isUnique":1,"valuePerLocale":0,"valuePerChannel":0,"isFilterable":0,"isConfigurable":0,"isVisibleOnFront":0,"isUserDefined":0,"swatchType":null,"position":1,"locale":"en","createdAt":"2024-01-01T00:00:00+00:00","updatedAt":"2024-01-01T00:00:00+00:00","translations":null,"options":null,"validation":null,"defaultValue":null}],"meta":{"currentPage":1,"perPage":10,"lastPage":5,"total":47,"from":1,"to":10}}}}}},"operationId":"api_apiadmincatalogattributes_get_collection"},"post":{"tags":["Admin Catalog: Attributes"],"summary":"Create a new attribute","description":"Creates an attribute with optional translations and options (for select/multiselect/checkbox types). The `code` must be unique, pass the Code rule (letters/digits/underscore), and not be a reserved word (`type`, `attribute_family_id`).","requestBody":{"description":"The new AdminAttribute resource","content":{"application/json":{"schema":{"type":"object","required":["code","admin_name","type"],"properties":{"code":{"type":"string","example":"material"},"admin_name":{"type":"string","example":"Material"},"type":{"type":"string","example":"select","enum":["text","textarea","price","boolean","select","multiselect","checkbox","date","datetime","image","file"]},"swatch_type":{"type":"string","nullable":true,"example":"text"},"is_required":{"type":"boolean","example":false},"is_unique":{"type":"boolean","example":false},"is_filterable":{"type":"boolean","example":true},"is_configurable":{"type":"boolean","example":false},"is_visible_on_front":{"type":"boolean","example":true},"is_comparable":{"type":"boolean","example":false},"value_per_locale":{"type":"boolean","example":false},"value_per_channel":{"type":"boolean","example":false},"enable_wysiwyg":{"type":"boolean","example":false},"validation":{"type":"string","nullable":true,"example":null},"default_value":{"type":"string","nullable":true,"example":null},"position":{"type":"integer","example":10},"translations":{"type":"object","example":{"en":{"name":"Material"},"fr":{"name":"Mati\u00e8re"}}},"options":{"type":"array","items":{"type":"object"},"example":[{"admin_name":"Cotton","sort_order":1,"translations":{"en":{"label":"Cotton"},"fr":{"label":"Coton"}}}]}}}}},"required":true},"responses":{"201":{"description":"Attribute created successfully. Returns the full attribute detail.","content":{"application/json":{"example":{"id":50,"code":"material","type":"select","adminName":"Material","isRequired":0,"isUnique":0,"valuePerLocale":0,"valuePerChannel":0,"isFilterable":1,"isConfigurable":0,"isVisibleOnFront":1,"isUserDefined":1,"swatchType":"text","position":10,"locale":"en","createdAt":"2026-05-22T10:00:00+00:00","updatedAt":"2026-05-22T10:00:00+00:00","validation":null,"defaultValue":null,"isComparable":0,"enableWysiwyg":0,"regex":null,"translations":[{"locale":"en","name":"Material"},{"locale":"fr","name":"Mati\u00e8re"}],"options":[{"id":101,"adminName":"Cotton","sortOrder":1,"swatchValue":null,"swatchValueUrl":null,"translations":[{"locale":"en","label":"Cotton"},{"locale":"fr","label":"Coton"}]}]}}}},"422":{"description":"Validation failure.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"The code field is required."}}}},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogattributes_post"}},"/catalog/attributes/{id}":{"get":{"tags":["Admin Catalog: Attributes"],"summary":"Attribute detail with translations and options","description":"Returns one attribute with all locale translations and all options (each option also includes its own translations). For `select`, `multiselect`, and `checkbox` types, the `options` array is fully populated; for all other types it is `null`.","parameters":[{"name":"id","in":"path","description":"Attribute ID.","required":true,"schema":{"type":"integer","example":12}}],"responses":{"200":{"description":"Attribute detail with all translations and options.","content":{"application/json":{"example":{"id":12,"code":"color","type":"select","adminName":"Color","isRequired":0,"isUnique":0,"valuePerLocale":0,"valuePerChannel":0,"isFilterable":1,"isConfigurable":1,"isVisibleOnFront":1,"isUserDefined":1,"swatchType":"color","position":5,"locale":"en","createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00","validation":null,"defaultValue":null,"isComparable":0,"enableWysiwyg":0,"regex":null,"translations":[{"locale":"en","name":"Color"},{"locale":"fr","name":"Couleur"}],"options":[{"id":33,"adminName":"Red","sortOrder":1,"swatchValue":"#FF0000","swatchValueUrl":null,"translations":[{"locale":"en","label":"Red"},{"locale":"fr","label":"Rouge"}]},{"id":34,"adminName":"Blue","sortOrder":2,"swatchValue":"#0000FF","swatchValueUrl":null,"translations":[{"locale":"en","label":"Blue"},{"locale":"fr","label":"Bleu"}]}]}}}},"404":{"description":"Attribute not found.","content":{"application/json":{"example":{"type":"/errors/404","title":"An error occurred","status":404,"detail":"Attribute not found"}}}}},"operationId":"api_apiadmincatalogattributes_id_get"},"put":{"tags":["Admin Catalog: Attributes"],"summary":"Update an attribute","description":"Updates an attribute. The `code` field cannot be changed (returns 422 if a different code is supplied). Changing `type` is refused when product attribute values exist.","parameters":[{"name":"id","in":"path","description":"Attribute ID.","required":true,"schema":{"type":"integer","example":50}}],"requestBody":{"description":"The updated AdminAttribute resource","content":{"application/json":{"schema":{"type":"object","required":["code","admin_name","type"],"properties":{"code":{"type":"string","example":"material"},"admin_name":{"type":"string","example":"Material (updated)"},"type":{"type":"string","example":"select"},"is_filterable":{"type":"boolean","example":true},"translations":{"type":"object","example":{"en":{"name":"Material (updated)"},"fr":{"name":"Mati\u00e8re (mis \u00e0 jour)"}}},"options":{"type":"array","items":{"type":"object"},"description":"Full replacement list. Items with id are updated; without id are inserted; omitted ids are deleted."}}}}},"required":true},"responses":{"200":{"description":"Attribute updated. Returns the full attribute detail.","content":{"application/json":{"example":{"id":50,"code":"material","adminName":"Material (updated)","type":"select"}}}},"422":{"description":"Code change refused or type immutable.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"Attribute code cannot be changed."}}}},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincatalogattributes_id_put"},"delete":{"tags":["Admin Catalog: Attributes"],"summary":"Delete an attribute","description":"Deletes a user-defined attribute. Returns HTTP 403 for system attributes, HTTP 409 if the attribute is used in attribute families.","parameters":[{"name":"id","in":"path","description":"Attribute ID.","required":true,"schema":{"type":"integer","example":50}}],"responses":{"200":{"description":"Attribute deleted.","content":{"application/json":{"example":{"message":"Attribute deleted successfully."}}}},"403":{"description":"System attribute \u2014 cannot delete.","content":{"application/json":{"example":{"type":"/errors/403","status":403,"detail":"System attributes cannot be deleted."}}}},"409":{"description":"Attribute is part of one or more attribute families.","content":{"application/json":{"example":{"type":"/errors/409","status":409,"detail":"Attribute is part of one or more attribute families. Remove it from those families first."}}}},"404":{"description":"Not found"}},"operationId":"api_apiadmincatalogattributes_id_delete"}},"/catalog/families":{"get":{"tags":["Admin Catalog: Attribute Families"],"summary":"List attribute families (datagrid parity)","description":"Paginated, filterable, sortable attribute family list mirroring the admin Catalog \u2192 Families datagrid.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by family ID \u2014 single integer or comma-separated list.","schema":{"type":"string","example":"1"}},{"name":"code","in":"query","description":"Partial family code match (SQL LIKE).","schema":{"type":"string","example":"default"}},{"name":"name","in":"query","description":"Partial family name match (SQL LIKE).","schema":{"type":"string","example":"Default"}},{"name":"sort","in":"query","description":"Column to sort by.","schema":{"type":"string","enum":["id","code","name"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of attribute family rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":1,"code":"default","name":"Default"},{"id":3,"code":"apparel","name":"Apparel"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":2,"from":1,"to":2}}}}}},"operationId":"api_apiadmincatalogfamilies_get_collection"},"post":{"tags":["Admin Catalog: Attribute Families"],"summary":"Create a new attribute family","description":"Creates an attribute family with optional nested attribute groups and per-group custom_attributes. `code` must be unique and pass the Code rule.","requestBody":{"description":"The new AdminAttributeFamily resource","content":{"application/json":{"schema":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string","example":"electronics"},"name":{"type":"string","example":"Electronics"},"attribute_groups":{"type":"array","items":{"type":"object"},"example":[{"code":"general","name":"General","column":1,"position":1,"custom_attributes":[{"id":1},{"id":2}]}]}}}}},"required":true},"responses":{"201":{"description":"Family created. Returns the same shape as GET /catalog/families/{id}.","content":{"application/json":{"example":{"id":4,"code":"electronics","name":"Electronics","attributeGroups":[{"id":11,"code":"general","name":"General","column":1,"position":1,"attributes":[]}]}}}},"422":{"description":"Validation failure.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"The code field is required."}}}},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogfamilies_post"}},"/catalog/families/{id}":{"get":{"tags":["Admin Catalog: Attribute Families"],"summary":"Attribute family detail with attribute groups and attributes","description":"Returns one attribute family with all attribute groups and their associated attributes (including pivot position).","parameters":[{"name":"id","in":"path","description":"Attribute family ID.","required":true,"schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"Attribute family detail with groups and attributes.","content":{"application/json":{"example":{"id":1,"code":"default","name":"Default","attributeGroups":[{"id":1,"code":"general","name":"General","column":1,"position":1,"attributes":[{"id":1,"code":"sku","type":"text","isRequired":1,"column":1,"position":1},{"id":2,"code":"name","type":"text","isRequired":1,"column":1,"position":2}]}]}}}},"404":{"description":"Attribute family not found.","content":{"application/json":{"example":{"type":"/errors/404","title":"An error occurred","status":404,"detail":"Attribute family not found."}}}}},"operationId":"api_apiadmincatalogfamilies_id_get"},"put":{"tags":["Admin Catalog: Attribute Families"],"summary":"Update an attribute family","description":"Updates an attribute family. Inside `attribute_groups`, items keyed by numeric id update existing groups; items keyed by `group_*` create new groups; omitted existing ids are deleted.","parameters":[{"name":"id","in":"path","description":"Family ID.","required":true,"schema":{"type":"integer","example":4}}],"requestBody":{"description":"The updated AdminAttributeFamily resource","content":{"application/json":{"schema":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string","example":"electronics"},"name":{"type":"string","example":"Electronics (updated)"},"attribute_groups":{"type":"object","example":{"11":{"code":"general","name":"General","column":1,"position":1,"custom_attributes":[{"id":1,"position":1}]},"group_new_1":{"code":"pricing","name":"Pricing","column":2,"position":2,"custom_attributes":[{"id":11,"position":1}]}}}}}}},"required":true},"responses":{"200":{"description":"Family updated.","content":{"application/json":{"example":{"id":4,"code":"electronics","name":"Electronics (updated)"}}}},"422":{"description":"Validation failure.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"The code has already been taken."}}}},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincatalogfamilies_id_put"},"delete":{"tags":["Admin Catalog: Attribute Families"],"summary":"Delete an attribute family","description":"Refuses if this is the last family (HTTP 400) or if any product is using it (HTTP 400).","parameters":[{"name":"id","in":"path","description":"Family ID.","required":true,"schema":{"type":"integer","example":4}}],"responses":{"200":{"description":"Family deleted.","content":{"application/json":{"example":{"message":"Attribute family deleted successfully."}}}},"400":{"description":"Cannot delete \u2014 last family or products attached.","content":{"application/json":{"example":{"type":"/errors/400","status":400,"detail":"At least one attribute family is required."}}}},"404":{"description":"Family not found.","content":{"application/json":{"example":{"type":"/errors/404","status":404,"detail":"Attribute family not found."}}}}},"operationId":"api_apiadmincatalogfamilies_id_delete"}},"/catalog/attributes/mass-delete":{"post":{"tags":["Admin Catalog: Attributes"],"summary":"Mass delete attributes","description":"Deletes a batch of user-defined attributes. If any ID in the batch belongs to a system attribute (`is_user_defined = 0`), the entire batch is rejected with HTTP 422. Non-existent IDs are silently skipped.","requestBody":{"description":"The new AdminAttributeMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[24,31]}}}}},"required":true},"responses":{"200":{"description":"Attributes deleted.","content":{"application/json":{"example":{"deleted":[24,31],"message":"Attributes deleted successfully."}}}},"422":{"description":"Batch rejected \u2014 one or more IDs are system attributes.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"System attributes cannot be deleted."}}}},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogattributesmass-delete_post"}},"/catalog/attributes/{attributeId}/options":{"post":{"tags":["Admin Catalog: Attributes"],"summary":"Add an option to a select/multiselect/checkbox attribute","description":"Creates a new option for the given attribute. Only allowed when the attribute type is `select`, `multiselect`, or `checkbox`.","parameters":[{"name":"attributeId","in":"path","description":"Attribute ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The new AdminAttributeOption resource","content":{"application/json":{"schema":{"type":"object","required":["admin_name"],"properties":{"admin_name":{"type":"string","example":"Wool"},"sort_order":{"type":"integer","example":2},"swatch_value":{"type":"string","nullable":true,"example":null},"translations":{"type":"object","example":{"en":{"label":"Wool"},"fr":{"label":"Laine"}}}}}}},"required":true},"responses":{"201":{"description":"Option created. Returns the full attribute detail.","content":{"application/json":{"example":{"id":12,"code":"material","type":"select","options":[{"id":45,"adminName":"Wool","sortOrder":2}]}}}},"422":{"description":"Attribute type does not support options.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"This attribute type does not support options."}}}},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogattributes_attributeIdoptions_post"}},"/catalog/attributes/{attributeId}/options/{optionId}":{"put":{"tags":["Admin Catalog: Attributes"],"summary":"Update an attribute option","description":"Partially updates the given option. Only supplied fields are changed; translations merge per-locale.","parameters":[{"name":"attributeId","in":"path","description":"Attribute ID.","required":true,"schema":{"type":"integer","example":12}},{"name":"optionId","in":"path","description":"Option ID.","required":true,"schema":{"type":"integer","example":45}}],"requestBody":{"description":"The updated AdminAttributeOption resource","content":{"application/json":{"schema":{"type":"object","properties":{"admin_name":{"type":"string","example":"Merino Wool"},"sort_order":{"type":"integer","example":1},"swatch_value":{"type":"string","nullable":true,"example":null},"translations":{"type":"object","example":{"en":{"label":"Merino Wool"},"fr":{"label":"Laine M\u00e9rinos"}}}}}}},"required":true},"responses":{"200":{"description":"Option updated. Returns the full attribute detail.","content":{"application/json":{"example":{"id":12,"code":"material","type":"select"}}}},"404":{"description":"Attribute or option not found.","content":{"application/json":{"example":{"type":"/errors/404","status":404,"detail":"Attribute option not found."}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincatalogattributes_attributeIdoptions_optionId_put"},"delete":{"tags":["Admin Catalog: Attributes"],"summary":"Delete an attribute option","description":"Deletes the given option. Returns HTTP 409 if the option is referenced by any product attribute values.","parameters":[{"name":"attributeId","in":"path","description":"Attribute ID.","required":true,"schema":{"type":"integer","example":12}},{"name":"optionId","in":"path","description":"Option ID.","required":true,"schema":{"type":"integer","example":45}}],"responses":{"200":{"description":"Option deleted.","content":{"application/json":{"example":{"message":"Attribute option deleted successfully."}}}},"409":{"description":"Option is in use by products.","content":{"application/json":{"example":{"type":"/errors/409","status":409,"detail":"This option is used by 3 product(s) and cannot be deleted."}}}},"404":{"description":"Not found"}},"operationId":"api_apiadmincatalogattributes_attributeIdoptions_optionId_delete"}},"/bookings":{"get":{"tags":["Admin Sales: Bookings"],"summary":"List bookings (datagrid parity)","description":"Paginated bookings listing mirroring the admin Sales \u2192 Bookings datagrid. Every booking column plus the linked order / order-item summary is populated on each row. Returns a `{ data, meta }` envelope. Requires `sales.bookings.view` permission.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"id","in":"query","description":"Filter by booking id (integer or comma-list).","schema":{"type":"string"}},{"name":"order_id","in":"query","description":"Partial order increment_id.","schema":{"type":"string"}},{"name":"qty","in":"query","description":"Exact quantity.","schema":{"type":"integer"}},{"name":"product_id","in":"query","description":"Filter by product id.","schema":{"type":"integer"}},{"name":"from_from","in":"query","description":"Slot start >= (ISO date).","schema":{"type":"string","format":"date"}},{"name":"from_to","in":"query","description":"Slot start <= (ISO date).","schema":{"type":"string","format":"date"}},{"name":"to_from","in":"query","description":"Slot end >= (ISO date).","schema":{"type":"string","format":"date"}},{"name":"to_to","in":"query","description":"Slot end <= (ISO date).","schema":{"type":"string","format":"date"}},{"name":"created_at_from","in":"query","description":"Order created after.","schema":{"type":"string","format":"date"}},{"name":"created_at_to","in":"query","description":"Order created before.","schema":{"type":"string","format":"date"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","order_id","qty","from","to","created_at"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated bookings in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":1,"orderId":8,"orderIncrementId":"00000000008","orderItemId":42,"productId":99,"productSku":"BK-EVENT-01","productName":"Concert Ticket","bookingType":"event","qty":2,"from":1716220800,"to":1716224400,"fromFormatted":"20 May, 2026 12:00PM","toFormatted":"20 May, 2026 13:00PM","bookingProductEventTicketId":5,"order":{"id":8,"incrementId":"00000000008","status":"processing","customerName":"John Doe","customerEmail":"john.doe@example.com","grandTotal":240,"orderCurrencyCode":"USD"},"orderItem":{"id":42,"sku":"BK-EVENT-01","name":"Concert Ticket","qtyOrdered":2},"createdAt":"2026-05-20 10:00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminbookings_get_collection"}},"/bookings/{id}":{"get":{"tags":["Admin Sales: Bookings"],"summary":"Get a booking by id","description":"Returns a single booking with its booking-product sub-type, the booking window, and the linked order / order-item summary \u2014 no follow-up calls required. Requires `sales.bookings.view` permission.","parameters":[{"name":"id","in":"path","description":"Booking ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The booking.","content":{"application/json":{"example":{"id":1,"orderId":8,"orderIncrementId":"00000000008","orderItemId":42,"productId":99,"productSku":"BK-EVENT-01","productName":"Concert Ticket","bookingType":"event","qty":2,"from":1716220800,"to":1716224400,"fromFormatted":"20 May, 2026 12:00PM","toFormatted":"20 May, 2026 13:00PM","bookingProductEventTicketId":5,"order":{"id":8,"incrementId":"00000000008","status":"processing","customerName":"John Doe","customerEmail":"john.doe@example.com","grandTotal":240,"orderCurrencyCode":"USD"},"orderItem":{"id":42,"sku":"BK-EVENT-01","name":"Concert Ticket","qtyOrdered":2},"paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","shippingMethod":"flatrate_flatrate","shippingTitle":"Flat Rate - Flat Rate","billingAddress":{"id":16,"addressType":"order_billing","firstName":"John","lastName":"Doe","city":"Los Angeles","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"shippingAddress":{"id":15,"addressType":"order_shipping","firstName":"John","lastName":"Doe","city":"Los Angeles","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"invoices":[{"id":503,"incrementId":"503","state":"paid","baseGrandTotal":240,"formattedBaseGrandTotal":"$240.00","createdAt":"2026-05-20 12:01:00"}],"shipments":[],"refunds":[],"createdAt":"2026-05-20 10:00:00"}}}},"404":{"description":"Unknown booking id."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.bookings.view."}},"operationId":"api_apiadminbookings_id_get"}},"/bookings/export":{"get":{"tags":["Admin Sales: Bookings"],"summary":"Export bookings as csv, xls or xlsx","description":"Downloads the bookings datagrid as a csv, xls or xlsx file \u2014 the same data the admin Export button produces. Honours the same filters as the listing. Binary download, not JSON. Pick the file type with ?format=csv|xls|xlsx (default csv).","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}}],"responses":{"200":{"description":"Export file downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks the view permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadminbookingsexport_get"}},"/orders/{id}/cancel":{"post":{"tags":["Admin Sales: Orders"],"summary":"Cancel an order","description":"Cancels every cancellable item on the order and returns the updated `OrderDetail`. Gated by the same conditions as the admin UI (open status, qty_to_cancel, `sales.orders.cancel` permission).","parameters":[{"name":"id","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminCancelOrder resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"The updated order detail."},"404":{"description":"Order not found."},"422":{"description":"Order is closed / fraud / has nothing to cancel, or admin lacks `sales.orders.cancel`."},"201":{"description":"AdminCancelOrder resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"}},"operationId":"api_apiadminorders_idcancel_post"}},"/carts/{id}":{"get":{"tags":["Admin: Customer Order creation"],"summary":"Get a draft cart","description":"Returns the admin draft cart with items, totals, addresses, and selected shipping / payment.","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"AdminCart resource","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Not found"}},"operationId":"api_apiadmincarts_id_get"}},"/carts/{id}/items":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Add a product to the draft cart","description":"Adds the product to the cart using the shared `Cart::addProduct` flow \u2014 supports every product type. Body keys mirror the storefront add-to-cart payload (`productId`, `quantity`, plus type-specific `selectedConfigurableOption`, `superAttribute`, `bundleOptions`, `links`, `qty[]`, etc).","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminCart resource","content":{"application/json":{"schema":{"type":"object"},"example":{"productId":142,"quantity":1}}},"required":true},"responses":{"201":{"description":"AdminCart resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincarts_iditems_post"},"put":{"tags":["Admin: Customer Order creation"],"summary":"Update cart-item quantities","description":"Bulk-update line-item quantities. `qty` is a map of cart_item_id \u2192 new quantity.","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminCart resource","content":{"application/json":{"example":{"qty":{"12":3,"13":1}}}},"required":true},"responses":{"200":{"description":"AdminCart resource updated","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"},"404":{"description":"Not found"}},"operationId":"api_apiadmincarts_iditems_put"},"delete":{"tags":["Admin: Customer Order creation"],"summary":"Remove a single cart item","description":"Removes the cart item identified by `cartItemId` from the draft cart and recollects totals.","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"cartItemId":41}}},"required":true},"responses":{"200":{"description":"AdminCart resource deleted"},"404":{"description":"Not found"}},"operationId":"api_apiadmincarts_iditems_delete"}},"/carts/{id}/addresses":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Save billing & shipping addresses","description":"Saves the billing (and shipping unless `billing.useForShipping` is true) addresses for the draft cart and recollects totals.","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminCart resource","content":{"application/json":{"example":{"billing":{"firstName":"Jane","lastName":"Doe","email":"jane@example.com","address":["12 Main St"],"city":"Berlin","country":"DE","state":"BE","postcode":"10115","phone":"+4930123456","useForShipping":true}}}},"required":true},"responses":{"201":{"description":"AdminCart resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincarts_idaddresses_post"}},"/carts/{id}/coupon":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Apply a coupon code","description":"Applies a coupon code to the draft cart. Returns 404 if the coupon is unknown / inactive; 422 if the same coupon is already applied; 200 on success.","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminCart resource","content":{"application/json":{"example":{"code":"WELCOME10"}}},"required":true},"responses":{"201":{"description":"AdminCart resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincarts_idcoupon_post"},"delete":{"tags":["Admin: Customer Order creation"],"summary":"Remove the applied coupon","description":"Removes the currently applied coupon (if any) from the draft cart and recollects totals.","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"AdminCart resource deleted"},"404":{"description":"Not found"}},"operationId":"api_apiadmincarts_idcoupon_delete"}},"/carts/{id}/shipping-methods":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Select a shipping method for the draft cart","description":"Saves the selected shipping method on the cart and recollects totals. Requires both billing AND shipping addresses to already be saved (409 if missing).","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminCart resource","content":{"application/json":{"example":{"shippingMethod":"flatrate_flatrate"}}},"required":true},"responses":{"201":{"description":"AdminCart resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincarts_idshipping-methods_post"}},"/carts/{id}/payment-methods":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Select a payment method for the draft cart","description":"Saves the selected payment method on the cart and recollects totals. Requires a shipping method to already be selected (409 if missing).","parameters":[{"name":"id","in":"path","description":"Cart ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminCart resource","content":{"application/json":{"example":{"method":"cashondelivery"}}},"required":true},"responses":{"201":{"description":"AdminCart resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincarts_idpayment-methods_post"}},"/carts/{cartId}/payment-methods":{"get":{"tags":["Admin: Customer Order creation"],"summary":"List supported payment methods for the draft cart","description":"Returns `Payment::getSupportedPaymentMethods()`. A shipping method must already be selected on the cart (HTTP 409 otherwise).","parameters":[{"name":"cartId","in":"path","description":"Cart ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Supported payment methods.","content":{"application/json":{"example":{"data":[{"method":"cashondelivery","methodTitle":"Cash On Delivery","description":"","sort":1,"image":null},{"method":"moneytransfer","methodTitle":"Money Transfer","description":"","sort":2,"image":null}],"meta":{"currentPage":1,"perPage":2,"lastPage":1,"total":2,"from":1,"to":2}}}}}},"operationId":"api_apiadmincarts_cartIdpayment-methods_get_collection"}},"/carts/{cartId}/shipping-methods":{"get":{"tags":["Admin: Customer Order creation"],"summary":"List available shipping rates for the draft cart","description":"Calls `Shipping::collectRates()` against the cart and returns the available rates. Requires both billing AND shipping addresses to already be saved \u2014 returns HTTP 409 otherwise.","parameters":[{"name":"cartId","in":"path","description":"Cart ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Available shipping rates.","content":{"application/json":{"example":{"data":[{"carrierCode":"flatrate","carrierTitle":"Flat Rate","method":"flatrate_flatrate","methodTitle":"Fixed","price":10,"formattedPrice":"$10.00","baseTotal":10,"formattedBaseTotal":"$10.00"}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincarts_cartIdshipping-methods_get_collection"}},"/catalog/products/{id}":{"get":{"tags":["Admin Catalog: Products"],"summary":"Catalog product detail (type-aware)","description":"Returns a single catalog product with all detail-level fields populated. `channels` lists every available channel, each flagged `assigned` for this product. `attributes` mirrors the admin edit screen field-for-field \u2014 every attribute the product's family defines (code, adminName, type, value, options, per-channel/locale flags), with empty fields present (value null). Type-specific blocks (superAttributes/variants, bundleOptions, linkedProducts, downloadableLinks/downloadableSamples) are populated only for the matching product type; all others are null.","parameters":[{"name":"id","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":42}}],"responses":{"200":{"description":"Single catalog product with all detail fields inlined.","content":{"application/json":{"example":{"id":42,"sku":"SP-001","name":"Classic Watch","type":"simple","status":1,"price":"99.9900","formattedPrice":"$99.99","quantity":42,"baseImageUrl":"http://localhost:8000/storage/product/42/image.webp","imagesCount":3,"categoryId":5,"categoryName":"Accessories","channel":"default","locale":"en","attributeFamilyId":1,"attributeFamilyName":"Default","urlKey":"classic-watch","visibleIndividually":true,"shortDescription":"A premium timepiece.","description":"Full HTML description.","metaTitle":null,"metaDescription":null,"metaKeywords":null,"weight":0.5,"taxCategoryId":null,"manageStock":true,"inStock":true,"featured":false,"new":true,"createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00","translations":[{"locale":"en","name":"Classic Watch","description":"Full HTML description.","shortDescription":"A premium timepiece.","urlKey":"classic-watch","metaTitle":null,"metaDescription":null,"metaKeywords":null}],"images":[{"id":1,"path":"product/42/img1.webp","url":"http://localhost/storage/product/42/img1.webp","sortOrder":0}],"categories":[{"id":5,"name":"Accessories","slug":"accessories"}],"inventories":[{"sourceId":1,"sourceCode":"default","qty":42}],"customerGroupPrices":[],"superAttributes":null,"variants":null,"bundleOptions":null,"linkedProducts":null,"downloadableLinks":null,"downloadableSamples":null,"channels":[{"id":1,"code":"default","name":"Default Channel","assigned":true},{"id":2,"code":"mobile","name":"Mobile Channel","assigned":false}],"attributes":[{"id":1,"code":"sku","adminName":"SKU","type":"text","isRequired":true,"valuePerChannel":false,"valuePerLocale":false,"groupCode":"general","groupName":"General","value":"SP-001","options":null},{"id":23,"code":"color","adminName":"Color","type":"select","isRequired":false,"valuePerChannel":false,"valuePerLocale":false,"groupCode":"general","groupName":"General","value":null,"options":[{"id":1,"adminName":"Red","swatchValue":"#ff0000","sortOrder":1}]},{"id":25,"code":"meta_title","adminName":"Meta Title","type":"textarea","isRequired":false,"valuePerChannel":true,"valuePerLocale":true,"groupCode":"meta_description","groupName":"Meta Description","value":null,"options":null}]}}}},"404":{"description":"Product not found.","content":{"application/json":{"example":{"type":"/errors/404","title":"An error occurred","status":404,"detail":"Product not found"}}}}},"operationId":"api_apiadmincatalogproducts_id_get"},"put":{"tags":["Admin Catalog: Products"],"summary":"Update a catalog product (any type)","description":"Partial update (PATCH-style): send only the fields you want to change \u2014 every attribute on the product's family is editable by its code (sku, name, url_key, short_description, description, meta_title, color, size, brand, price, weight, status, \u2026). Translatable fields are written to the requested locale; pass `?locale=fr&channel=default` to target a specific locale/channel (defaults to the store default). Omitted fields keep their current value. Type-structure keys are accepted for the matching type: `variants` (configurable), `bundle_options` (bundle), `links` (grouped), `downloadable_links`/`downloadable_samples` (downloadable), `booking` (booking). `categories`/`channels`/`related_products`/`up_sells`/`cross_sells` replace the current set when sent (omit to keep). Sub-resources `images`/`videos`/`inventories`/`customer_group_prices` have dedicated endpoints and are ignored here (noted in `_warnings`). Returns the full product detail (same shape as GET /catalog/products/{id}).","parameters":[{"name":"id","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":42}}],"requestBody":{"description":"The updated AdminCatalogProduct resource","content":{"application/json":{"schema":{"type":"object","description":"Every field on the product edit form is editable by its attribute code. Send only what you change. Pick a product type from the Examples dropdown to see the full edit-form body for that type.","properties":{"sku":{"type":"string","example":"sp-001"},"name":{"type":"string","example":"Arctic Beanie"},"product_number":{"type":"string","example":"PN-1001"},"url_key":{"type":"string","example":"arctic-beanie"},"status":{"type":"integer","enum":[0,1],"example":1},"visible_individually":{"type":"integer","enum":[0,1],"example":1},"guest_checkout":{"type":"integer","enum":[0,1],"example":1},"new":{"type":"integer","enum":[0,1],"example":1},"featured":{"type":"integer","enum":[0,1],"example":1},"manage_stock":{"type":"integer","enum":[0,1],"example":1},"price":{"type":"string","example":"99.99"},"cost":{"type":"string","example":"40.00"},"special_price":{"type":"string","example":"79.99"},"special_price_from":{"type":"string","format":"date","example":"2026-08-01"},"special_price_to":{"type":"string","format":"date","example":"2026-08-31"},"GST":{"type":"string","example":"5.00"},"weight":{"type":"string","example":"0.5"},"length":{"type":"string","example":"10"},"width":{"type":"string","example":"5"},"height":{"type":"string","example":"3"},"tax_category_id":{"type":"integer","example":2},"color":{"type":"integer","description":"Attribute option id.","example":1},"size":{"type":"integer","description":"Attribute option id.","example":6},"brand":{"type":"integer","description":"Attribute option id.","example":10},"short_description":{"type":"string","example":"Warm knit beanie."},"description":{"type":"string","example":"Full HTML description."},"meta_title":{"type":"string","example":"Arctic Beanie"},"meta_keywords":{"type":"string","example":"beanie, winter"},"meta_description":{"type":"string","example":"Buy the Arctic Beanie."},"categories":{"type":"array","items":{"type":"integer"},"example":[1,8]},"channels":{"type":"array","items":{"type":"integer"},"example":[1]},"up_sells":{"type":"array","items":{"type":"integer"},"example":[2]},"cross_sells":{"type":"array","items":{"type":"integer"},"example":[3]},"related_products":{"type":"array","items":{"type":"integer"},"example":[2]},"customizable_options":{"type":"object","description":"Custom options (simple & virtual only). Keyed option_*; each option may carry a prices map keyed price_*."},"super_attributes":{"type":"object","description":"Configurable only. Map of attribute code to option-id list."},"variants":{"type":"object","description":"Configurable only. Per-variant fields keyed by variant product id."},"bundle_options":{"type":"object","description":"Bundle only. Option groups keyed option_*; products keyed product_*."},"links":{"type":"object","description":"Grouped only. Associated products keyed link_*."},"downloadable_links":{"type":"object","description":"Downloadable only. Links keyed link_*."},"downloadable_samples":{"type":"object","description":"Downloadable only. Samples keyed sample_*."},"booking":{"type":"object","description":"Booking only. type \u2208 default/appointment/event/rental/table."},"translations":{"type":"object","description":"Optional locale-keyed override. Top-level codes already write to the request locale (?locale=).","example":{"fr":{"name":"Bonnet Arctique"}}}}},"examples":{"simple":{"summary":"Simple \u2014 every edit-form field","value":{"sku":"sp-001","name":"Arctic Beanie","product_number":"PN-1001","url_key":"arctic-beanie","status":1,"visible_individually":1,"guest_checkout":1,"new":1,"featured":1,"manage_stock":1,"tax_category_id":2,"color":1,"size":6,"brand":10,"price":"99.99","cost":"40.00","special_price":"79.99","special_price_from":"2026-08-01","special_price_to":"2026-08-31","GST":"5.00","short_description":"Warm knit beanie.","description":"Full HTML description.","length":"10","width":"5","height":"3","weight":"0.5","meta_title":"Arctic Beanie","meta_keywords":"beanie, winter","meta_description":"Buy the Arctic Beanie.","categories":[1,8],"channels":[1],"up_sells":[2],"cross_sells":[3],"related_products":[2],"customizable_options":{"option_1":{"en":{"label":"Engraving text"},"type":"text","is_required":"1","max_characters":"30","sort_order":"1","price":"5.00"},"option_2":{"en":{"label":"Gift wrap"},"type":"checkbox","is_required":"0","sort_order":"2","prices":{"price_1":{"en":{"label":"Standard"},"price":"3.00","sort_order":"1"},"price_2":{"en":{"label":"Premium"},"price":"6.00","sort_order":"2"}}}}}},"virtual":{"summary":"Virtual \u2014 same fields as simple (no shipping needed; dimensions optional)","value":{"sku":"vr-001","name":"Online Gift Wrap","url_key":"online-gift-wrap","status":1,"visible_individually":1,"guest_checkout":1,"manage_stock":1,"tax_category_id":2,"price":"9.99","cost":"3.00","GST":"5.00","short_description":"Virtual add-on.","description":"No shipping required.","meta_title":"Gift Wrap","categories":[1],"channels":[1],"customizable_options":{"option_1":{"en":{"label":"Message"},"type":"textarea","is_required":"0","sort_order":"1","price":"0.00"}}}},"downloadable":{"summary":"Downloadable \u2014 common fields + links & samples","value":{"sku":"dl-001","name":"E-Book Bundle","url_key":"ebook-bundle","status":1,"visible_individually":1,"guest_checkout":1,"manage_stock":1,"tax_category_id":2,"price":"15.00","cost":"4.00","GST":"5.00","short_description":"Downloadable e-book.","description":"Instant download.","meta_title":"E-Book","categories":[1],"channels":[1],"up_sells":[2],"cross_sells":[3],"related_products":[2],"downloadable_links":{"link_1":{"en":{"title":"Chapter 1 PDF"},"price":"5.00","downloads":"3","sort_order":"1","type":"url","url":"https://example.com/ch1.pdf","sample_type":"url","sample_url":"https://example.com/sample.pdf"}},"downloadable_samples":{"sample_1":{"title":"Preview","sort_order":"1","type":"url","url":"https://example.com/preview.pdf"}}}},"grouped":{"summary":"Grouped \u2014 common fields + linked products (no own price)","value":{"sku":"gr-001","name":"Starter Pack","url_key":"starter-pack","status":1,"visible_individually":1,"guest_checkout":1,"tax_category_id":2,"GST":"5.00","weight":"0.5","short_description":"A bundle of essentials.","description":"Buy the set.","meta_title":"Starter Pack","categories":[1,8],"channels":[1],"up_sells":[2],"cross_sells":[3],"related_products":[2],"links":{"link_1":{"associated_product_id":1,"qty":"2","sort_order":"1"},"link_2":{"associated_product_id":2,"qty":"1","sort_order":"2"}}}},"bundle":{"summary":"Bundle \u2014 common fields + option groups (dynamic price, no special_price)","value":{"sku":"bn-001","name":"Build Your Kit","url_key":"build-your-kit","status":1,"visible_individually":1,"guest_checkout":1,"price":"0","tax_category_id":2,"GST":"5.00","weight":"0.5","short_description":"Pick your parts.","description":"Custom kit.","meta_title":"Build Your Kit","categories":[1,8],"channels":[1],"bundle_options":{"option_1":{"en":{"label":"Choose accessory"},"type":"radio","is_required":"1","sort_order":"1","products":{"product_1":{"product_id":1,"qty":"1","is_default":"1","sort_order":"1"},"product_2":{"product_id":2,"qty":"1","is_default":"0","sort_order":"2"}}}}}},"configurable":{"summary":"Configurable \u2014 common fields + per-variant fields (color/size set per variant)","value":{"sku":"cf-001","name":"Wool Beanie","url_key":"wool-beanie","status":1,"visible_individually":1,"guest_checkout":1,"tax_category_id":2,"GST":"5.00","short_description":"Choose colour & size.","description":"Configurable beanie.","meta_title":"Wool Beanie","categories":[1,8],"channels":[1],"variants":{"2872":{"sku":"BEANIE-RED-S","name":"Red / Small","price":"29.99","cost":"8.00","weight":"0.3","status":"1","color":1,"size":6},"2873":{"sku":"BEANIE-BLUE-S","name":"Blue / Small","price":"29.99","cost":"8.00","weight":"0.3","status":"1","color":2,"size":6}}}},"booking":{"summary":"Booking \u2014 common fields + booking block (type: default/appointment/event/rental/table)","value":{"sku":"bk-001","name":"Studio Session","url_key":"studio-session","status":1,"visible_individually":1,"guest_checkout":1,"tax_category_id":2,"GST":"5.00","price":"99.99","weight":"0.5","short_description":"Book a slot.","description":"Recurring weekly slots.","meta_title":"Studio Session","categories":[1],"channels":[1],"booking":{"type":"default","qty":"1","location":"Studio A","available_every_week":"1","booking_type":"many","duration":"60","break_time":"10","slots":[{"from":"09:00","to":"17:00"}]}}}}}},"required":true},"responses":{"200":{"description":"Product updated. Returns the full AdminCatalogProduct payload, plus _warnings (array of strings) if any sub-resource fields were stripped from the payload.","content":{"application/json":{"example":{"id":42,"sku":"sp-001","name":"Classic Watch","type":"simple","status":1,"price":"99.9900","formattedPrice":"$99.99","warnings":["Images must be managed via POST /api/admin/catalog/products/{id}/images."]}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.edit."},"404":{"description":"Product not found."},"422":{"description":"Validation failure (sku duplicate, url_key duplicate, invalid boolean field, special_price \u2265 price, invalid date range)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_id_put"},"delete":{"tags":["Admin Catalog: Products"],"summary":"Delete a catalog product","description":"Deletes a catalog product. For configurable products, all variants cascade. No \"refuse if in non-completed order\" guard (mirrors Bagisto admin behaviour). Fires catalog.product.delete.before / catalog.product.delete.after. Returns 204 on success.","parameters":[{"name":"id","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":42}}],"responses":{"204":{"description":"Product deleted."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.delete."},"404":{"description":"Product not found."}},"operationId":"api_apiadmincatalogproducts_id_delete"}},"/catalog/products":{"get":{"tags":["Admin Catalog: Products"],"summary":"List catalog products (datagrid parity)","description":"Paginated, filterable, sortable product list mirroring the admin Catalog \u2192 Products datagrid. Routes via Elasticsearch when the admin panel is configured to. Returns a `{ data, meta }` envelope.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"product_id","in":"query","description":"Filter by product ID \u2014 single integer or comma-separated list (e.g. \"1,2,3\").","schema":{"type":"string","example":"142"}},{"name":"sku","in":"query","description":"Partial SKU match (SQL LIKE).","schema":{"type":"string","example":"SP-001"}},{"name":"name","in":"query","description":"Partial product name match (SQL LIKE).","schema":{"type":"string","example":"Classic Watch"}},{"name":"type","in":"query","description":"Filter by product type.","schema":{"type":"string","enum":["simple","configurable","bundle","grouped","downloadable","virtual","booking"],"example":"simple"}},{"name":"status","in":"query","description":"Filter by status (0 = disabled, 1 = enabled).","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"attribute_family","in":"query","description":"Filter by attribute family ID.","schema":{"type":"integer","example":1}},{"name":"channel","in":"query","description":"Channel code for value resolution (e.g. \"default\").","schema":{"type":"string","example":"default"}},{"name":"locale","in":"query","description":"Locale code for value resolution (e.g. \"en\").","schema":{"type":"string","example":"en"}},{"name":"price_from","in":"query","description":"Minimum price filter (inclusive).","schema":{"type":"number","format":"float","example":10}},{"name":"price_to","in":"query","description":"Maximum price filter (inclusive).","schema":{"type":"number","format":"float","example":500}},{"name":"price","in":"query","description":"Price range shorthand \u2014 \"min,max\" (e.g. \"10,500\"). Overridden by price_from / price_to when both are present.","schema":{"type":"string","example":"10,500"}},{"name":"sort","in":"query","description":"Column to sort by.","schema":{"type":"string","enum":["name","sku","attribute_family","price","quantity","product_id","status","type","channel"],"example":"product_id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of catalog product rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":142,"sku":"SP-001","name":"Classic Watch","type":"simple","status":1,"price":"99.9900","formattedPrice":"$99.99","quantity":42,"baseImageUrl":"http://localhost:8000/cache/medium/product/142/image.webp","imagesCount":3,"categoryId":5,"categoryName":"Accessories","channel":"Default","locale":"en","attributeFamilyId":1,"attributeFamilyName":"Default","urlKey":"classic-watch","visibleIndividually":true,"shortDescription":"<p>A timeless classic watch.</p>","description":"<p>Full HTML product description.</p>","metaTitle":"Classic Watch","metaDescription":"Buy the Classic Watch","metaKeywords":"watch, classic","weight":0.25,"featured":false,"new":true,"createdAt":"2026-05-20 10:00:00","updatedAt":"2026-05-22 14:30:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":62,"total":616,"from":1,"to":10}}}}}},"operationId":"api_apiadmincatalogproducts_get_collection"},"post":{"tags":["Admin Catalog: Products"],"summary":"Create a catalog product (step 1 \u2014 all 7 types)","description":"Mirrors the Bagisto admin Create-Product wizard step 1: only sku + attribute_family_id + type are submitted (plus super_attributes when type=configurable). Name, description, price, inventories, etc. are added in the step-2 update endpoint (Phase 5.9). Accepts type \u2208 {simple, virtual, downloadable, grouped, bundle, configurable, booking}. For type=configurable, super_attributes is required and must be a non-empty map of attribute code (or id) \u2192 option_ids \u2014 the core repository generates the full Cartesian-product of variants. For booking, the 5 sub-types (default/appointment/event/rental/table) are configured during step-2 update. Returns the full AdminCatalogProduct detail payload \u2014 most fields will be null because only sku/type/family are populated yet. Fires catalog.product.create.before and catalog.product.create.after.","requestBody":{"description":"The new AdminCatalogProduct resource","content":{"application/json":{"schema":{"type":"object","required":["sku","attribute_family_id"],"properties":{"sku":{"type":"string","example":"sp-001"},"attribute_family_id":{"type":"integer","example":1},"type":{"type":"string","enum":["simple","virtual","downloadable","grouped","bundle","configurable","booking"],"example":"simple"},"super_attributes":{"type":"object","description":"Required when type=configurable. Map of attribute code (or id) to non-empty list of option_ids.","example":{"color":[1,2],"size":[6,7]}}}},"examples":{"simple":{"summary":"Simple product","value":{"sku":"sp-001","attribute_family_id":1,"type":"simple"}},"configurable":{"summary":"Configurable product (with super_attributes)","value":{"sku":"cf-001","attribute_family_id":1,"type":"configurable","super_attributes":{"color":[1,2],"size":[6,7]}}},"bundle":{"summary":"Bundle product","value":{"sku":"bn-001","attribute_family_id":1,"type":"bundle"}},"grouped":{"summary":"Grouped product","value":{"sku":"gp-001","attribute_family_id":1,"type":"grouped"}},"virtual":{"summary":"Virtual product","value":{"sku":"vr-001","attribute_family_id":1,"type":"virtual"}},"downloadable":{"summary":"Downloadable product","value":{"sku":"dl-001","attribute_family_id":1,"type":"downloadable"}},"booking":{"summary":"Booking product (sub-type set in step 2)","value":{"sku":"bk-001","attribute_family_id":1,"type":"booking"}}}}},"required":true},"responses":{"201":{"description":"Product created. Returns the full AdminCatalogProduct payload (most fields null at this point \u2014 step 2 update populates them).","content":{"application/json":{"example":{"id":43,"sku":"sp-001","type":"simple","attributeFamilyId":1,"attributeFamilyName":"Default","name":null,"status":null,"price":null}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.create."},"422":{"description":"Validation failed (missing sku / family / unsupported type / duplicate sku / invalid slug / unknown family / missing or invalid super_attributes for configurable)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_post"}},"/catalog/products/export":{"get":{"tags":["Admin Catalog: Products"],"summary":"Export products as csv, xls or xlsx","description":"Downloads the products datagrid as a csv, xls or xlsx file \u2014 the same data the admin Catalog \u2192 Products Export button produces. Honours the same filters as the listing and exports every matching row, not just the current page. Binary download, not JSON. Pick the file type with ?format=csv|xls|xlsx (default csv).","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}}],"responses":{"200":{"description":"Export file downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks the view permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadmincatalogproductsexport_get"}},"/catalog/products/{sourceId}/copy":{"post":{"tags":["Admin Catalog: Products"],"summary":"Copy a catalog product","description":"Duplicates an existing product across all attribute_values, images, inventories, categories and customer_group_prices. Refuses variants (parent_id != null) with HTTP 422. Mirrors Bagisto monolith ProductController::copy. Fires catalog.product.create.before and catalog.product.create.after.","parameters":[{"name":"sourceId","in":"path","description":"ID of the product to copy","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminCatalogProductCopy resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Product copied successfully.","content":{"application/json":{"example":{"id":43,"sourceId":12,"sku":"SKU-001-copy-1","type":"simple","name":"Test SKU-001 (Copy)","success":true,"message":"Product copied successfully."}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.create."},"404":{"description":"Source product not found."},"422":{"description":"Source product is a configurable variant (parent_id is set) \u2014 variants cannot be copied."},"500":{"description":"Underlying copy threw an exception."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_sourceIdcopy_post"}},"/catalog/products/{productId}/customer-group-prices":{"get":{"tags":["Admin Catalog: Products"],"summary":"List customer-group (tier) prices for a product","description":"Returns every customer-group price row attached to the product, wrapped in the standard admin `{ data, meta }` envelope.","parameters":[{"name":"productId","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"Customer-group prices listed.","content":{"application/json":{"example":{"data":[{"id":12,"qty":1,"valueType":"fixed","value":19.99,"customerGroupId":2,"customerGroupName":"Wholesale","productId":1}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincatalogproducts_productIdcustomer-group-prices_get_collection"},"post":{"tags":["Admin Catalog: Products"],"summary":"Add a customer-group price to a product","description":"Creates a new tier-price row. `customer_group_id: null` makes the price apply to every customer group. The combination `(qty, customer_group_id)` must be unique per product.","parameters":[{"name":"productId","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":1}}],"requestBody":{"description":"The new AdminCatalogProductCustomerGroupPrice resource","content":{"application/json":{"schema":{"type":"object","required":["qty","value_type","value"],"properties":{"qty":{"type":"integer","minimum":1,"example":10},"value_type":{"type":"string","enum":["fixed","discount"],"example":"discount"},"value":{"type":"number","example":15},"customer_group_id":{"type":"integer","nullable":true,"example":2}}}}},"required":true},"responses":{"201":{"description":"Tier-price row created.","content":{"application/json":{"example":{"id":12,"qty":10,"valueType":"discount","value":15,"customerGroupId":2,"productId":1}}}},"422":{"description":"Validation failed (e.g. duplicate qty/customer-group, unknown group, qty < 1)."},"404":{"description":"Product not found."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIdcustomer-group-prices_post"}},"/catalog/products/{productId}/customer-group-prices/{id}":{"put":{"tags":["Admin Catalog: Products"],"summary":"Update a customer-group price row","description":"Partially updates the given tier-price row. The new `(qty, customer_group_id)` combination must remain unique for the product.","parameters":[{"name":"productId","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":1}},{"name":"id","in":"path","description":"Customer-group-price row ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The updated AdminCatalogProductCustomerGroupPrice resource","content":{"application/json":{"schema":{"type":"object","properties":{"qty":{"type":"integer","minimum":1,"example":5},"value_type":{"type":"string","enum":["fixed","discount"],"example":"fixed"},"value":{"type":"number","example":17.5},"customer_group_id":{"type":"integer","nullable":true,"example":null}}}}},"required":true},"responses":{"200":{"description":"Tier-price row updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Product or row not found, or row does not belong to product."},"422":{"description":"Validation failed."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIdcustomer-group-prices_id_put"},"delete":{"tags":["Admin Catalog: Products"],"summary":"Delete a customer-group price row","description":"Delete a customer-group price row","parameters":[{"name":"productId","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":1}},{"name":"id","in":"path","description":"Customer-group-price row ID.","required":true,"schema":{"type":"integer","example":12}}],"responses":{"200":{"description":"Tier-price row deleted.","content":{"application/json":{"example":{"message":"Customer-group price deleted successfully."}}}},"404":{"description":"Row not found or does not belong to product."}},"operationId":"api_apiadmincatalogproducts_productIdcustomer-group-prices_id_delete"}},"/catalog/products/{productId}/downloadable-links/upload":{"post":{"tags":["Admin Catalog: Products"],"summary":"Upload a downloadable link file","description":"Uploads the binary file for a file-type downloadable link and returns its stored path. Send as multipart/form-data with `file`. The returned `path` is what you then set on the link via the product update (`downloadable_links[link_x][file] = path`, `type = file`). URL-type links do not need this \u2014 set their `url` directly on update.","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The new AdminCatalogProductDownloadableFile resource","content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}},"required":true},"responses":{"201":{"description":"File stored. Use `path` on the product update.","content":{"application/json":{"example":{"type":"link","path":"product_downloadable_links/12/abc123.zip","name":"user-manual.zip","url":"/storage/product_downloadable_links/12/abc123.zip"}}}},"422":{"description":"Missing or invalid file."},"404":{"description":"Product not found."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIddownloadable-linksupload_post"}},"/catalog/products/{productId}/downloadable-samples/upload":{"post":{"tags":["Admin Catalog: Products"],"summary":"Upload a downloadable sample file","description":"Uploads the binary file for a file-type downloadable sample and returns its stored path. Send as multipart/form-data with `file`. The returned `path` is what you then set on the sample via the product update (`downloadable_samples[sample_x][file] = path`, `type = file`).","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The new AdminCatalogProductDownloadableFile resource","content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"}}}}},"required":true},"responses":{"201":{"description":"File stored. Use `path` on the product update.","content":{"application/json":{"example":{"type":"sample","path":"product_downloadable_samples/12/def456.zip","name":"preview.zip","url":"/storage/product_downloadable_samples/12/def456.zip"}}}},"422":{"description":"Missing or invalid file."},"404":{"description":"Product not found."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIddownloadable-samplesupload_post"}},"/catalog/products/{productId}/downloadable/{attributeId}/download":{"get":{"tags":["Admin Catalog: Products"],"summary":"Download a stored downloadable file","description":"Streams the stored file for the given product attribute (a downloadable product's file/sample attribute) as a binary attachment. Send `Accept: application/octet-stream`. Binary download, not JSON.","parameters":[{"name":"productId","in":"path","description":"Product ID.","required":true,"schema":{"type":"integer","example":12}},{"name":"attributeId","in":"path","description":"Attribute ID whose stored file path should be streamed.","required":true,"schema":{"type":"integer","example":26}}],"responses":{"200":{"description":"File streamed (application/octet-stream attachment).","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"No stored file for the product / attribute."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products."}},"operationId":"api_apiadmincatalogproducts_productIddownloadable_attributeIddownload_get"}},"/catalog/products/{productId}/images":{"post":{"tags":["Admin Catalog: Products"],"summary":"Upload a product image","description":"Uploads a new image for the given product. Send as multipart/form-data with `image` containing the file (allowed mime types: bmp, jpeg, jpg, png, webp).","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The new AdminCatalogProductImage resource","content":{"multipart/form-data":{"schema":{"type":"object","required":["image"],"properties":{"image":{"type":"string","format":"binary"},"position":{"type":"integer","example":1}}}}},"required":true},"responses":{"201":{"description":"Image uploaded.","content":{"application/json":{"example":{"id":47,"productId":12,"path":"product/12/abc123.webp","position":1,"url":"/storage/product/12/abc123.webp"}}}},"422":{"description":"Validation failure (missing file, invalid mime, too large)."},"404":{"description":"Product not found."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIdimages_post"}},"/catalog/products/{productId}/images/reorder":{"put":{"tags":["Admin Catalog: Products"],"summary":"Reorder product images","description":"Updates the position of one or more existing images for the given product. Each image id must belong to the product; otherwise the call is rejected.","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The updated AdminCatalogProductImage resource","content":{"application/json":{"schema":{"type":"object","required":["order"],"properties":{"order":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"position":{"type":"integer"}}},"example":[{"id":47,"position":2},{"id":48,"position":1}]}}}}},"required":true},"responses":{"200":{"description":"Images reordered. Returns the updated list ordered by position.","content":{"application/json":{"example":{"success":true,"message":"Product images reordered successfully.","images":[{"id":48,"productId":12,"path":"product/12/xyz.webp","position":1,"url":"/storage/product/12/xyz.webp"},{"id":47,"productId":12,"path":"product/12/abc.webp","position":2,"url":"/storage/product/12/abc.webp"}]}}}},"422":{"description":"Image id does not belong to the product, or order payload invalid."},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincatalogproducts_productIdimagesreorder_put"}},"/catalog/products/{productId}/images/{id}":{"delete":{"tags":["Admin Catalog: Products"],"summary":"Delete a product image","description":"Deletes the DB row and removes the file from public storage.","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}},{"name":"id","in":"path","description":"Image ID.","required":true,"schema":{"type":"integer","example":47}}],"responses":{"200":{"description":"Image deleted.","content":{"application/json":{"example":{"success":true,"message":"Product image deleted successfully."}}}},"404":{"description":"Image (or its parent product) not found."}},"operationId":"api_apiadmincatalogproducts_productIdimages_id_delete"}},"/catalog/products/{productId}/inventories":{"get":{"tags":["Admin Catalog: Products"],"summary":"List per-source inventory rows for a product","description":"Returns one row per inventory_source that has a product_inventories entry for this product. The envelope meta carries totalQty \u2014 the sum across all sources.","parameters":[{"name":"productId","in":"path","description":"Product ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Inventory rows for the product.","content":{"application/json":{"example":{"data":[{"id":14,"sourceId":1,"sourceCode":"default","sourceName":"Default","qty":25}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1,"totalQty":25}}}}},"401":{"description":"Missing or invalid admin token."},"404":{"description":"Product not found."}},"operationId":"api_apiadmincatalogproducts_productIdinventories_get_collection"},"put":{"tags":["Admin Catalog: Products"],"summary":"Bulk-update a product's per-source inventory quantities","description":"Mirrors Bagisto monolith ProductController::updateInventories. Fires catalog.product.update.before / catalog.product.update.after. Returns the updated listing payload \u2014 same shape as GET.","parameters":[{"name":"productId","in":"path","description":"Product ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminCatalogProductInventory resource","content":{"application/json":{"schema":{"type":"object","required":["inventories"],"properties":{"inventories":{"type":"object","description":"Map of inventory_source_id \u2192 quantity. Use 0 to zero-out a source.","additionalProperties":{"type":"integer","minimum":0}}}},"example":{"inventories":{"1":25,"2":0}}}},"required":true},"responses":{"200":{"description":"Inventories saved. Returns the refreshed listing payload.","content":{"application/json":{"example":{"data":[{"id":14,"sourceId":1,"sourceCode":"default","sourceName":"Default","qty":25}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1,"totalQty":25}}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.edit."},"404":{"description":"Product not found."},"422":{"description":"Validation failed \u2014 missing inventories, unknown inventory_source_id, or negative quantity."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIdinventories_put"}},"/catalog/products/mass-delete":{"post":{"tags":["Admin Catalog: Products"],"summary":"Mass delete catalog products","description":"Deletes a batch of products. Non-existent IDs are silently skipped. If any single delete throws an exception, the endpoint returns 500 with the underlying message \u2014 matching the Bagisto monolith ProductController::massDestroy behaviour.","requestBody":{"description":"The new AdminCatalogProductMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"Products deleted.","content":{"application/json":{"example":{"deleted":[12,18],"message":"Products deleted successfully."}}}},"400":{"description":"Empty or malformed indices."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.delete."},"500":{"description":"Underlying delete threw an exception (mirrors monolith behaviour)."},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincatalogproductsmass-delete_post"}},"/catalog/products/mass-update-status":{"post":{"tags":["Admin Catalog: Products"],"summary":"Mass update catalog product status","description":"Sets the status of a batch of products to the given value (0 or 1). Mirrors Bagisto monolith ProductController::massUpdate \u2014 best-effort, fires catalog.product.update.{before,after} per ID.","requestBody":{"description":"The new AdminCatalogProductMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"Products updated.","content":{"application/json":{"example":{"updated":[12,18],"message":"Products status updated successfully."}}}},"400":{"description":"Empty or malformed indices, or value not 0/1."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks catalog.products.edit."},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincatalogproductsmass-update-status_post"}},"/catalog/products/{productId}/videos":{"post":{"tags":["Admin Catalog: Products"],"summary":"Upload a product video","description":"Uploads a new video for the given product. Send as multipart/form-data with `video` containing the file (mp4, webm, ogg). Optional `position`.","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}}],"requestBody":{"description":"The new AdminCatalogProductVideo resource","content":{"multipart/form-data":{"schema":{"type":"object","required":["video"],"properties":{"video":{"type":"string","format":"binary"},"position":{"type":"integer","example":1}}}}},"required":true},"responses":{"201":{"description":"Video uploaded.","content":{"application/json":{"example":{"id":8,"productId":12,"path":"product/12/xyz789.mp4","position":1,"url":"/storage/product/12/xyz789.mp4"}}}},"422":{"description":"Validation failure (missing file, invalid type, too large)."},"404":{"description":"Product not found."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogproducts_productIdvideos_post"}},"/catalog/products/{productId}/videos/{id}":{"delete":{"tags":["Admin Catalog: Products"],"summary":"Delete a product video","description":"Deletes the DB row and removes the file from public storage.","parameters":[{"name":"productId","in":"path","description":"Parent product ID.","required":true,"schema":{"type":"integer","example":12}},{"name":"id","in":"path","description":"Video ID.","required":true,"schema":{"type":"integer","example":8}}],"responses":{"200":{"description":"Video deleted.","content":{"application/json":{"example":{"success":true,"message":"Product video deleted successfully."}}}},"404":{"description":"Video (or its parent product) not found."}},"operationId":"api_apiadmincatalogproducts_productIdvideos_id_delete"}},"/catalog/categories":{"get":{"tags":["Admin Catalog: Categories"],"summary":"List categories (datagrid parity)","description":"Paginated, filterable, sortable category list mirroring the admin Catalog \u2192 Categories datagrid.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"category_id","in":"query","description":"Filter by category ID \u2014 single integer or comma-separated list (e.g. \"12\" or \"12,18\").","schema":{"type":"string","example":"12"}},{"name":"name","in":"query","description":"Partial category name match (SQL LIKE).","schema":{"type":"string","example":"Apparel"}},{"name":"position","in":"query","description":"Exact position filter.","schema":{"type":"integer","example":1}},{"name":"status","in":"query","description":"Filter by status (0 = disabled, 1 = enabled).","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"parent_id","in":"query","description":"Filter by parent category ID.","schema":{"type":"integer","example":1}},{"name":"locale","in":"query","description":"Locale code for translation resolution (e.g. \"en\").","schema":{"type":"string","example":"en"}},{"name":"sort","in":"query","description":"Column to sort by.","schema":{"type":"string","enum":["id","name","position","status"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of category rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":7,"position":1,"status":1,"parentId":1,"displayMode":"products_and_description","logoUrl":null,"bannerUrl":null,"name":"Apparel","slug":"apparel","description":"Men's and women's apparel","locale":"en","createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00","translations":null,"filterableAttributeIds":null}],"meta":{"currentPage":1,"perPage":10,"lastPage":5,"total":47,"from":1,"to":10}}}}}},"operationId":"api_apiadmincatalogcategories_get_collection"},"post":{"tags":["Admin Catalog: Categories"],"summary":"Create a new category","description":"Mirrors Bagisto admin Catalog \u2192 Categories \u2192 Create. Validates slug (unique), name, position, attributes. `description` required when `display_mode` is `description_only` or `products_and_description`. File-upload for `logo_path` / `banner_path` is NOT supported in v1.","requestBody":{"description":"The new AdminCategory resource","content":{"application/json":{"schema":{"type":"object","required":["slug","name","position","attributes"],"properties":{"slug":{"type":"string","example":"apparel"},"name":{"type":"string","example":"Apparel"},"description":{"type":"string","example":"Men's and women's apparel"},"position":{"type":"integer","example":1},"attributes":{"type":"array","items":{"type":"integer"},"example":[11,23]},"parent_id":{"type":"integer","nullable":true,"example":1},"display_mode":{"type":"string","enum":["products_and_description","products_only","description_only"],"example":"products_and_description"},"status":{"type":"integer","example":1},"locale":{"type":"string","example":"en"},"meta_title":{"type":"string","example":"Apparel"}}}}},"required":true},"responses":{"201":{"description":"Category created. Returns the same shape as GET /catalog/categories/{id}.","content":{"application/json":{"example":{"id":7,"position":1,"status":1,"parentId":1,"displayMode":"products_and_description","name":"Apparel","slug":"apparel","description":"Men's and women's apparel","locale":"en"}}}},"422":{"description":"Validation failure.","content":{"application/json":{"example":{"type":"/errors/422","status":422,"detail":"The slug field is required."}}}},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogcategories_post"}},"/catalog/categories/{id}":{"get":{"tags":["Admin Catalog: Categories"],"summary":"Category detail with all translations","description":"Returns one category with the full translations array and the list of filterable attribute IDs.","parameters":[{"name":"id","in":"path","description":"Category ID.","required":true,"schema":{"type":"integer","example":7}}],"responses":{"200":{"description":"Single category with all locale translations inlined and filterable attribute IDs.","content":{"application/json":{"example":{"id":7,"position":1,"status":1,"parentId":1,"displayMode":"products_and_description","logoUrl":"https://example.com/storage/category/7/logo.webp","bannerUrl":null,"name":"Apparel","slug":"apparel","description":"Men's and women's apparel","locale":"en","createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00","translations":[{"locale":"en","name":"Apparel","slug":"apparel","description":"Men's and women's apparel","metaTitle":null,"metaDescription":null,"metaKeywords":null},{"locale":"fr","name":"V\u00eatements","slug":"vetements","description":null,"metaTitle":null,"metaDescription":null,"metaKeywords":null}],"filterableAttributeIds":[11,23]}}}},"404":{"description":"Category not found.","content":{"application/json":{"example":{"type":"/errors/404","title":"An error occurred","status":404,"detail":"Category not found"}}}}},"operationId":"api_apiadmincatalogcategories_id_get"},"put":{"tags":["Admin Catalog: Categories"],"summary":"Update a category (and/or move it)","description":"Mirrors Bagisto admin Catalog \u2192 Categories \u2192 Edit. Validation is LOCALE-NESTED: `<locale>.slug`, `<locale>.name`, `<locale>.description` (when display_mode requires it) are required. Top-level fields: `position`, `attributes`, `parent_id`, `display_mode`, `status`. Moving a category is done via this endpoint with `parent_id` + `position` (no separate /move endpoint \u2014 parity with Bagisto admin which has no move action).","parameters":[{"name":"id","in":"path","description":"Category ID.","required":true,"schema":{"type":"integer","example":7}}],"requestBody":{"description":"The updated AdminCategory resource","content":{"application/json":{"schema":{"type":"object","required":["position","attributes"],"properties":{"locale":{"type":"string","example":"en"},"position":{"type":"integer","example":2},"attributes":{"type":"array","items":{"type":"integer"},"example":[11,23]},"parent_id":{"type":"integer","nullable":true,"example":1},"status":{"type":"integer","example":1},"en":{"type":"object","example":{"slug":"apparel","name":"Apparel","description":"Men's and women's apparel"}}}}}},"required":true},"responses":{"200":{"description":"Category updated. Returns the same shape as GET /catalog/categories/{id}.","content":{"application/json":{"example":{"id":7,"name":"Apparel","slug":"apparel","position":2}}}},"404":{"description":"Category not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincatalogcategories_id_put"},"delete":{"tags":["Admin Catalog: Categories"],"summary":"Delete a category","description":"Refuses with HTTP 400 if the category is the root (id=1) or referenced as `channels.root_category_id`.","parameters":[{"name":"id","in":"path","description":"Category ID.","required":true,"schema":{"type":"integer","example":7}}],"responses":{"200":{"description":"Category deleted.","content":{"application/json":{"example":{"message":"Category deleted successfully."}}}},"400":{"description":"Cannot delete \u2014 root category or a channel root.","content":{"application/json":{"example":{"type":"/errors/400","status":400,"detail":"Root and channel-root categories cannot be deleted."}}}},"404":{"description":"Category not found."}},"operationId":"api_apiadmincatalogcategories_id_delete"}},"/catalog/categories/mass-delete":{"post":{"tags":["Admin Catalog: Categories"],"summary":"Mass delete categories","description":"Deletes a batch of categories. If any ID is non-deletable (root or a channel root_category_id), the entire batch is rejected with HTTP 400. Non-existent IDs are silently skipped.","requestBody":{"description":"The new AdminCategoryMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"Categories deleted.","content":{"application/json":{"example":{"deleted":[12,18],"message":"Categories deleted successfully."}}}},"400":{"description":"Batch rejected \u2014 at least one ID is a root category or a channel root.","content":{"application/json":{"example":{"type":"/errors/400","status":400,"detail":"Root and channel-root categories cannot be deleted."}}}},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincatalogcategoriesmass-delete_post"}},"/catalog/categories/mass-update-status":{"post":{"tags":["Admin Catalog: Categories"],"summary":"Mass update category status","description":"Sets the status of a batch of categories to the given value (0 or 1).","requestBody":{"description":"The new AdminCategoryMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"Categories updated.","content":{"application/json":{"example":{"updated":[12,18],"message":"Categories status updated successfully."}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincatalogcategoriesmass-update-status_post"}},"/catalog/categories/tree":{"get":{"tags":["Admin Catalog: Categories"],"summary":"Category tree (nested)","description":"Full nested category tree. Supports optional locale, status, and rootId filters. Returns a JSON array of root nodes.","parameters":[{"name":"locale","in":"query","description":"Locale code for translation resolution (e.g. \"en\").","schema":{"type":"string","example":"en"}},{"name":"status","in":"query","description":"Filter by status (0 = disabled, 1 = enabled). Nodes with no qualifying descendants are pruned.","schema":{"type":"integer","enum":[0,1],"example":1}},{"name":"rootId","in":"query","description":"Limit tree to descendants of this category ID (inclusive). Returns empty array if the ID is unknown.","schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"Nested category tree in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":1,"name":"Root Category","slug":"root","status":1,"position":0,"parentId":null,"displayMode":null,"children":[{"id":2,"name":"Apparel","slug":"apparel","status":1,"position":1,"parentId":1,"displayMode":null,"children":[]},{"id":5,"name":"Electronics","slug":"electronics","status":1,"position":2,"parentId":1,"displayMode":null,"children":[]}]}],"meta":{"currentPage":1,"perPage":50,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincatalogcategoriestree_get_collection"}},"/cms/pages":{"get":{"tags":["Admin CMS"],"summary":"List CMS pages (datagrid parity)","description":"Paginated, filterable, sortable CMS pages list mirroring the admin CMS \u2192 Pages datagrid.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by CMS page ID.","schema":{"type":"integer","example":7}},{"name":"page_title","in":"query","description":"Partial page title match.","schema":{"type":"string","example":"About"}},{"name":"url_key","in":"query","description":"Partial url_key match.","schema":{"type":"string","example":"about"}},{"name":"channel","in":"query","description":"Filter by channel ID.","schema":{"type":"integer","example":1}},{"name":"locale","in":"query","description":"Locale code for translation resolution.","schema":{"type":"string","example":"en"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","page_title","url_key","created_at"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of CMS page rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":7,"urlKey":"about-us","pageTitle":"About Us","channel":"default","locale":"en","createdAt":"2026-01-12T08:15:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":3,"total":24,"from":1,"to":10}}}}}},"operationId":"api_apiadmincmspages_get_collection"},"post":{"tags":["Admin CMS"],"summary":"Create a new CMS page","description":"Mirrors Bagisto admin CMS \u2192 Pages \u2192 Create. Top-level translated fields (page_title, html_content, etc.) are broadcast to every locale by the PageRepository. Validates url_key (required + unique on cms_page_translations + slug regex), page_title, html_content, and channels (non-empty array of existing channel ids).","requestBody":{"description":"The new AdminCmsPage resource","content":{"application/json":{"schema":{"type":"object","required":["url_key","page_title","html_content","channels"],"properties":{"url_key":{"type":"string","example":"about-us"},"page_title":{"type":"string","example":"About Us"},"html_content":{"type":"string","example":"<h1>About Us</h1><p>Welcome.</p>"},"channels":{"type":"array","items":{"type":"integer"},"example":[1]},"meta_title":{"type":"string","example":"About Us"},"meta_keywords":{"type":"string","example":"about,us,company"},"meta_description":{"type":"string","example":"Learn more about our company."}}}}},"required":true},"responses":{"201":{"description":"Page created. Returns the same shape as GET /cms/pages/{id}.","content":{"application/json":{"example":{"id":7,"urlKey":"about-us","pageTitle":"About Us","htmlContent":"<h1>About Us</h1><p>Welcome.</p>","metaTitle":"About Us","metaKeywords":"about,us,company","metaDescription":"Learn more about our company.","locale":"en","translations":[{"locale":"en","url_key":"about-us","page_title":"About Us","html_content":"<h1>About Us</h1><p>Welcome.</p>","meta_title":"About Us","meta_keywords":"about,us,company","meta_description":"Learn more about our company."}],"channels":[{"id":1,"code":"default","name":"Default"}]}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincmspages_post"}},"/cms/pages/{id}":{"get":{"tags":["Admin CMS"],"summary":"CMS page detail with all translations + channels","description":"CMS page detail with all translations + channels","parameters":[{"name":"id","in":"path","description":"CMS page ID.","required":true,"schema":{"type":"integer","example":7}}],"responses":{"200":{"description":"Single CMS page with translations and channels inlined.","content":{"application/json":{"example":{"id":7,"urlKey":"about-us","pageTitle":"About Us","htmlContent":"<h1>About Us</h1>","metaTitle":"About Us","metaKeywords":"about,us","metaDescription":"About us page.","locale":"en","createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00","translations":[{"locale":"en","url_key":"about-us","page_title":"About Us","html_content":"<h1>About Us</h1>","meta_title":"About Us","meta_keywords":"about,us","meta_description":"About us page."}],"channels":[{"id":1,"code":"default","name":"Default"}]}}}},"404":{"description":"Page not found."}},"operationId":"api_apiadmincmspages_id_get"},"put":{"tags":["Admin CMS"],"summary":"Update a CMS page (locale-nested)","description":"Mirrors Bagisto admin CMS \u2192 Pages \u2192 Edit. Validation is LOCALE-NESTED: `<locale>.url_key`, `<locale>.page_title`, `<locale>.html_content` are required. Top-level: `channels` (required), `locale` (required \u2014 names which locale block is being updated). url_key uniqueness excludes the current page.","parameters":[{"name":"id","in":"path","description":"CMS page ID.","required":true,"schema":{"type":"integer","example":7}}],"requestBody":{"description":"The updated AdminCmsPage resource","content":{"application/json":{"schema":{"type":"object","required":["locale","channels"],"properties":{"locale":{"type":"string","example":"en"},"channels":{"type":"array","items":{"type":"integer"},"example":[1]},"en":{"type":"object","example":{"url_key":"about-us","page_title":"About Us (Updated)","html_content":"<h1>About Us</h1><p>Welcome back.</p>","meta_title":"About Us","meta_keywords":"about,us,company","meta_description":"Updated description."}}}}}},"required":true},"responses":{"200":{"description":"Page updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Page not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincmspages_id_put"},"delete":{"tags":["Admin CMS"],"summary":"Delete a CMS page","description":"Delete a CMS page","parameters":[{"name":"id","in":"path","description":"CMS page ID.","required":true,"schema":{"type":"integer","example":7}}],"responses":{"204":{"description":"Page deleted."},"404":{"description":"Page not found."}},"operationId":"api_apiadmincmspages_id_delete"}},"/cms/pages/export":{"get":{"tags":["Admin CMS"],"summary":"Export CMS pages as csv, xls or xlsx","description":"Downloads the CMS Pages datagrid as a csv, xls or xlsx file \u2014 the same data the admin CMS \u2192 Pages \"view\" listing shows (ID, Page Title, URL Key, Channel, Locale). Honours the same filters as the listing (`id`, `page_title`, `url_key`, `channel`, `locale`). The response is a binary download, not JSON.","parameters":[{"name":"format","in":"query","description":"Export format: `csv`, `xls` or `xlsx`. Defaults to `csv`.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}},{"name":"id","in":"query","description":"Filter by CMS page ID.","schema":{"type":"integer"}},{"name":"page_title","in":"query","description":"Partial page title match.","schema":{"type":"string"}},{"name":"url_key","in":"query","description":"Partial url_key match.","schema":{"type":"string"}},{"name":"channel","in":"query","description":"Filter by channel ID.","schema":{"type":"integer"}},{"name":"locale","in":"query","description":"Locale code for translation resolution.","schema":{"type":"string"}}],"responses":{"200":{"description":"The CMS pages export file is downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadmincmspagesexport_get"}},"/cms/pages/mass-delete":{"post":{"tags":["Admin CMS"],"summary":"Mass delete CMS pages","description":"Deletes a batch of CMS pages. Non-existent IDs are silently skipped (mirrors monolith).","requestBody":{"description":"The new AdminCmsPageMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"CMS pages deleted.","content":{"application/json":{"example":{"deleted":[12,18],"message":"CMS pages deleted successfully."}}}},"422":{"description":"Validation failure (empty/missing indices)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincmspagesmass-delete_post"}},"/configuration/menu":{"get":{"tags":["Admin Configuration"],"summary":"Configuration menu (schema tree)","description":"Returns the merged system_config tree. Use `?slug=<section>.<group>` to scope to one node. `?include_values=true` embeds the effective value per field (uses `?channel=` and `?locale=` for resolution).","parameters":[{"name":"slug","in":"query","description":"Optional slug filter, e.g. `sales.order_settings`.","schema":{"type":"string"}},{"name":"include_values","in":"query","description":"When true, embeds the effective value per field.","schema":{"type":"boolean"}},{"name":"channel","in":"query","description":"Channel code for value resolution.","schema":{"type":"string"}},{"name":"locale","in":"query","description":"Locale code for value resolution.","schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration menu tree.","content":{"application/json":{"example":[{"key":"general","name":"General","info":null,"sort":1,"icon":null,"children":[{"key":"general.general","name":"General","sort":1,"children":[{"key":"general.general.locale_options","name":"Locale Options","fields":[{"name":"weight_unit","code":"general.general.locale_options.weight_unit","title":"Weight Unit","type":"select","default":"kgs","channelBased":true,"localeBased":false,"validation":null,"options":[{"title":"lbs","value":"lbs"},{"title":"kgs","value":"kgs"}]}]}]}]}]}}},"404":{"description":"Slug not found in the registered config tree."},"401":{"description":"Unauthenticated."}},"operationId":"api_apiadminconfigurationmenu_get_collection"}},"/configuration/slugs":{"get":{"tags":["Admin Configuration"],"summary":"Configuration slugs (discovery)","description":"Lists every registered configuration slug (section/group key) with its label, so a client can discover the valid slugs to pass to the configuration values endpoint.","responses":{"200":{"description":"List of configuration slugs.","content":{"application/json":{"example":[{"id":"configuration-slugs","slugs":[{"slug":"general","name":"General","sort":1,"hasFields":false,"hasChildren":true},{"slug":"sales.order_settings","name":"Order Settings","sort":2,"hasFields":true,"hasChildren":false}]}]}}},"401":{"description":"Unauthenticated."}},"operationId":"api_apiadminconfigurationslugs_get_collection"}},"/configuration":{"get":{"tags":["Admin Configuration"],"summary":"Configuration values for one slug","description":"Returns the flat `key \u2192 string` map of effective values for every field under the given slug. Falls back to per-field defaults when no `core_config` row exists.","parameters":[{"name":"slug","in":"query","description":"Required. `<section>.<group>` slug, e.g. `sales.order_settings`.","required":true,"schema":{"type":"string"}},{"name":"channel","in":"query","description":"Channel code for resolution. Defaults to the requested channel.","schema":{"type":"string"}},{"name":"locale","in":"query","description":"Locale code for resolution. Defaults to the requested locale.","schema":{"type":"string"}}],"responses":{"200":{"description":"Effective values.","content":{"application/json":{"example":[{"slug":"sales.order_settings","channel":"default","locale":"en","values":{"sales.order_settings.reorder.admin":"1","sales.order_settings.reorder.shop":"1","sales.order_settings.minimum_order.enable":"0"}}]}}},"404":{"description":"Slug not found."},"422":{"description":"Slug query parameter missing."},"401":{"description":"Unauthenticated."}},"operationId":"api_apiadminconfiguration_get_collection"},"post":{"tags":["Admin Configuration"],"summary":"Bulk-update configuration values for one slug","description":"Upserts every value in `values` under the given slug, validating server-side against each field's registered `validation` string. Send as `application/json` for scalars or as `multipart/form-data` (with `values[<dotted.code>]` as the file part) when uploading file/image fields.","requestBody":{"description":"The new AdminConfigurationUpdate resource","content":{"application/json":{"schema":{"type":"object","required":["slug","values"],"properties":{"slug":{"type":"string","example":"sales.order_settings"},"channel":{"type":"string","example":"default"},"locale":{"type":"string","example":"en"},"values":{"type":"object","example":{"sales.order_settings.reorder.admin":"1","sales.order_settings.reorder.shop":"0"}}}}},"multipart/form-data":{"schema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"},"channel":{"type":"string"},"locale":{"type":"string"},"values[general.design.admin_logo.logo_image]":{"type":"string","format":"binary"}}}}},"required":true},"responses":{"200":{"description":"Configuration updated. Returns the freshly-resolved values for the slug.","content":{"application/json":{"example":{"success":true,"message":"Configuration updated successfully.","slug":"sales.order_settings","channel":"default","locale":"en","values":{"sales.order_settings.reorder.admin":"1","sales.order_settings.reorder.shop":"0"}}}}},"422":{"description":"Validation failed, scope-escape, missing slug/values, or custom-view field write attempt."},"404":{"description":"Slug not registered."},"401":{"description":"Unauthenticated."},"403":{"description":"Missing system.configuration.edit permission."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminconfiguration_post"}},"/customers":{"get":{"tags":["Admin Customers"],"summary":"List customers","description":"Paginated, filterable, sortable list. Returns the standard { data, meta } admin envelope; each row carries the linked group as a nested object.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"name","in":"query","description":"Filter by first/last name (partial).","schema":{"type":"string"}},{"name":"email","in":"query","description":"Filter by email (partial).","schema":{"type":"string"}},{"name":"phone","in":"query","description":"Filter by phone (partial).","schema":{"type":"string"}},{"name":"customer_group_id","in":"query","description":"Filter by customer group ID.","schema":{"type":"integer"}},{"name":"status","in":"query","description":"Filter by status (0/1).","schema":{"type":"integer"}},{"name":"channel_id","in":"query","description":"Filter by channel ID.","schema":{"type":"integer"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","email","first_name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated customers in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":14,"firstName":"Jane","lastName":"Doe","name":"Jane Doe","email":"jane@example.com","phone":"+1-202-555-0148","gender":"Female","dateOfBirth":"1990-01-01","channelId":1,"status":1,"subscribedToNewsLetter":false,"isVerified":0,"isSuspended":0,"createdAt":"2026-05-01T09:00:00+00:00","updatedAt":"2026-06-20T14:30:00+00:00","group":{"id":2,"code":"wholesale","name":"Wholesale"}}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_get_collection"},"post":{"tags":["Admin Customers"],"summary":"Create a new customer","description":"Create a new customer","requestBody":{"description":"The new AdminCustomer resource","content":{"application/json":{"schema":{"type":"object","required":["first_name","last_name","email","customer_group_id"],"properties":{"first_name":{"type":"string","example":"Jane"},"last_name":{"type":"string","example":"Doe"},"email":{"type":"string","example":"jane@example.com"},"phone":{"type":"string","nullable":true},"gender":{"type":"string","enum":["Male","Female","Other"],"nullable":true},"date_of_birth":{"type":"string","nullable":true,"example":"1990-01-01"},"customer_group_id":{"type":"integer","example":2},"channel_id":{"type":"integer","nullable":true},"status":{"type":"integer","example":1},"subscribed_to_news_letter":{"type":"boolean","nullable":true},"send_password":{"type":"boolean","example":true,"description":"When true, generate a random password and email credentials. When false, the explicit password field is required."},"password":{"type":"string","nullable":true}}}}},"required":true},"responses":{"201":{"description":"Customer created.","content":{"application/json":{"example":{"id":14,"firstName":"Jane","lastName":"Doe","name":"Jane Doe","email":"jane@example.com","phone":"+1-202-555-0148","gender":"Female","dateOfBirth":"1990-01-01","channelId":1,"status":1,"subscribedToNewsLetter":false,"isVerified":0,"isSuspended":0,"totalAddresses":0,"totalOrders":0,"totalAmountSpent":0,"createdAt":"2026-06-24T10:15:00+00:00","updatedAt":"2026-06-24T10:15:00+00:00","group":{"id":2,"code":"wholesale","name":"Wholesale"}}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomers_post"}},"/customers/{id}":{"get":{"tags":["Admin Customers"],"summary":"Customer detail","description":"Returns the customer with the linked group as a nested object.","parameters":[{"name":"id","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Customer detail.","content":{"application/json":{"example":{"id":14,"firstName":"Jane","lastName":"Doe","name":"Jane Doe","email":"jane@example.com","phone":"+1-202-555-0148","gender":"Female","dateOfBirth":"1990-01-01","channelId":1,"status":1,"subscribedToNewsLetter":false,"isVerified":0,"isSuspended":0,"totalAddresses":2,"totalOrders":5,"totalAmountSpent":1240.5,"createdAt":"2026-05-01T09:00:00+00:00","updatedAt":"2026-06-20T14:30:00+00:00","group":{"id":2,"code":"wholesale","name":"Wholesale"}}}}},"404":{"description":"Customer not found."}},"operationId":"api_apiadmincustomers_id_get"},"put":{"tags":["Admin Customers"],"summary":"Update a customer","description":"Update a customer","parameters":[{"name":"id","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminCustomer resource","content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string","nullable":true},"gender":{"type":"string","enum":["Male","Female","Other"],"nullable":true},"date_of_birth":{"type":"string","nullable":true},"customer_group_id":{"type":"integer"},"channel_id":{"type":"integer","nullable":true},"status":{"type":"integer"},"subscribed_to_news_letter":{"type":"boolean","nullable":true},"password":{"type":"string","nullable":true}}},"example":{"first_name":"Jane","last_name":"Doe","email":"jane@example.com","phone":"+1-202-555-0148","gender":"Female","date_of_birth":"1990-01-01","customer_group_id":2,"status":1}}},"required":true},"responses":{"200":{"description":"Customer updated.","content":{"application/json":{"example":{"id":14,"firstName":"Jane","lastName":"Doe","name":"Jane Doe","email":"jane@example.com","phone":"+1-202-555-0148","gender":"Female","dateOfBirth":"1990-01-01","channelId":1,"status":1,"subscribedToNewsLetter":false,"isVerified":0,"isSuspended":0,"totalAddresses":2,"totalOrders":5,"totalAmountSpent":1240.5,"createdAt":"2026-05-01T09:00:00+00:00","updatedAt":"2026-06-24T10:15:00+00:00","group":{"id":2,"code":"wholesale","name":"Wholesale"}}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomers_id_put"},"delete":{"tags":["Admin Customers"],"summary":"Delete a customer","description":"Refuses if the customer has any pending/processing orders (400).","parameters":[{"name":"id","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Customer deleted.","content":{"application/json":{"example":{"message":"Customer deleted successfully."}}}},"400":{"description":"Refused \u2014 customer has active orders."},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomers_id_delete"}},"/customers/{customerId}/addresses":{"get":{"tags":["Admin Customers"],"summary":"Get a customer's saved addresses","description":"Get a customer's saved addresses","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The customer's addresses in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":31,"customerId":14,"addressType":"customer","firstName":"Jane","lastName":"Doe","companyName":"Acme Inc.","address":"1600 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","email":"jane@example.com","phone":"+1-202-555-0148","vatId":"GB123456789","defaultAddress":true}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_customerIdaddresses_get_collection"},"post":{"tags":["Admin Customers"],"summary":"Create address for a customer","description":"Create address for a customer","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminCustomerAddress resource","content":{"application/json":{"schema":{"type":"object","required":["first_name","last_name","address","city","country","postcode","phone"],"properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"company_name":{"type":"string","nullable":true},"vat_id":{"type":"string","nullable":true},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string","nullable":true},"country":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","nullable":true},"default_address":{"type":"boolean"}}},"example":{"first_name":"Jane","last_name":"Doe","company_name":"Acme Inc.","vat_id":"GB123456789","address":"1600 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","phone":"+1-202-555-0148","email":"jane@example.com","default_address":true}}},"required":true},"responses":{"201":{"description":"Address created.","content":{"application/json":{"example":{"id":31,"customerId":14,"addressType":"customer","firstName":"Jane","lastName":"Doe","companyName":"Acme Inc.","address":"1600 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","email":"jane@example.com","phone":"+1-202-555-0148","vatId":"GB123456789","defaultAddress":true}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomers_customerIdaddresses_post"}},"/customers/{customerId}/addresses/{id}":{"get":{"tags":["Admin Customers"],"summary":"Address detail","description":"Address detail","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}},{"name":"id","in":"path","description":"Address ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Address detail.","content":{"application/json":{"example":{"id":31,"customerId":14,"addressType":"customer","firstName":"Jane","lastName":"Doe","companyName":"Acme Inc.","address":"1600 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","email":"jane@example.com","phone":"+1-202-555-0148","vatId":"GB123456789","defaultAddress":true}}}},"404":{"description":"Address not found."}},"operationId":"api_apiadmincustomers_customerIdaddresses_id_get"},"put":{"tags":["Admin Customers"],"summary":"Update address","description":"Update address","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}},{"name":"id","in":"path","description":"Address ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminCustomerAddress resource","content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"company_name":{"type":"string","nullable":true},"vat_id":{"type":"string","nullable":true},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string","nullable":true},"country":{"type":"string"},"postcode":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","nullable":true},"default_address":{"type":"boolean"}}},"example":{"first_name":"Jane","last_name":"Doe","address":"1601 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","phone":"+1-202-555-0148","default_address":true}}},"required":true},"responses":{"200":{"description":"Address updated.","content":{"application/json":{"example":{"id":31,"customerId":14,"addressType":"customer","firstName":"Jane","lastName":"Doe","companyName":"Acme Inc.","address":"1601 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","email":"jane@example.com","phone":"+1-202-555-0148","vatId":"GB123456789","defaultAddress":true}}}},"403":{"description":"Address does not belong to the customer."},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomers_customerIdaddresses_id_put"},"delete":{"tags":["Admin Customers"],"summary":"Delete address","description":"Delete address","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}},{"name":"id","in":"path","description":"Address ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Address deleted.","content":{"application/json":{"example":{"message":"Address deleted successfully."}}}},"403":{"description":"Address does not belong to the customer."},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomers_customerIdaddresses_id_delete"}},"/customers/{customerId}/addresses/{id}/set-default":{"post":{"tags":["Admin Customers"],"summary":"Set a customer address as the default","description":"Set a customer address as the default","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}},{"name":"id","in":"path","description":"Address ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminCustomerAddress resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"The address is now the default; all other addresses for the customer are unset.","content":{"application/json":{"example":{"id":31,"customerId":14,"addressType":"customer","firstName":"Jane","lastName":"Doe","companyName":"Acme Inc.","address":"1600 Amphitheatre Parkway","city":"Mountain View","state":"CA","country":"US","postcode":"94043","email":"jane@example.com","phone":"+1-202-555-0148","vatId":"GB123456789","defaultAddress":true}}}},"403":{"description":"Address does not belong to the customer."},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincustomers_customerIdaddresses_idset-default_post"}},"/customers/{customerId}/cart-items":{"get":{"tags":["Admin Customers"],"summary":"Get items in a customer's active cart","description":"Items the customer has in their own storefront cart (`carts.is_active = 1`). Used by the Create-Order screen's right sidebar so the admin can pull items into the draft cart.","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Active cart items (empty data array if the customer has no active cart).","content":{"application/json":{"example":{"data":[{"id":1701,"productId":2358,"sku":"test65","type":"simple","name":"Classic Watch Hand","quantity":1,"price":4000,"formattedPrice":"$4,000.00","total":4000,"formattedTotal":"$4,000.00","additional":{"quantity":1}}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_customerIdcart-items_get_collection"}},"/customers/{customerId}/compare-items":{"get":{"tags":["Admin Customers"],"summary":"Get a customer's compare list","description":"Get a customer's compare list","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Compare items for the customer.","content":{"application/json":{"example":{"data":[{"id":12,"productId":2358,"sku":"test65","name":"Classic Watch Hand","price":4000,"formattedPrice":"$4,000.00","productImage":"http://localhost:8000/storage/product/2358/example.webp"}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_customerIdcompare-items_get_collection"}},"/customers/{customerId}/gdpr-download-data":{"post":{"tags":["Admin Customer GDPR"],"summary":"Download a GDPR data export for a customer","description":"Returns a JSON dump of every table referencing the customer's id (orders, addresses, reviews, wishlists, notes). No request body \u2014 the customer is identified by the path.","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"GDPR data export for the customer.","content":{"application/json":{"example":{"customerId":14,"customerEmail":"jane@example.com","generatedAt":"2026-06-24T10:15:00+00:00","data":{"customer":{"id":14,"firstName":"Jane","lastName":"Doe","email":"jane@example.com"},"addresses":[{"id":31,"city":"Mountain View","country":"US","postcode":"94043"}],"orders":[{"id":1042,"incrementId":"1042","grandTotal":4000,"status":"completed"}],"reviews":[{"id":21,"productId":2358,"rating":5,"status":"approved"}],"wishlist":[{"id":88,"productId":2358}],"notes":[{"id":7,"note":"Called the customer about delivery."}]}}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincustomers_customerIdgdpr-download-data_post"}},"/customers/gdpr-requests/{id}/process":{"post":{"tags":["Admin Customer GDPR"],"summary":"Process (approve + execute) a GDPR request","description":"Sets status to \"approved\" and, for type=delete requests, cascades the customer deletion. Refuses to re-process an already-approved request.","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminCustomerGdprProcess resource","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","nullable":true}}},"example":{"message":"Approved and processed per customer request."}}}},"responses":{"200":{"description":"GDPR request processed.","content":{"application/json":{"example":{"id":9,"requestId":9,"customerId":14,"type":"delete","status":"approved","customerDeleted":true,"processedAt":"2026-06-24T10:15:00+00:00","message":"GDPR request processed successfully."}}}},"422":{"description":"Request already approved or revoked."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersgdpr-requests_idprocess_post"}},"/customers/gdpr-requests/{id}":{"get":{"tags":["Admin Customer GDPR"],"summary":"GDPR request detail","description":"GDPR request detail","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"GDPR request detail.","content":{"application/json":{"example":{"id":9,"customerId":14,"customerName":"Jane Doe","email":"jane@example.com","type":"delete","status":"pending","message":"Please remove my account.","revokedAt":null,"createdAt":"2026-06-10T09:00:00+00:00","updatedAt":"2026-06-10T09:00:00+00:00"}}}},"404":{"description":"GDPR request not found."}},"operationId":"api_apiadmincustomersgdpr-requests_id_get"},"put":{"tags":["Admin Customer GDPR"],"summary":"Update a GDPR request","description":"Update the request status. Allowed status values: pending, processing, declined, approved. Use the /process endpoint to also perform the destructive side-effect for delete requests.","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminCustomerGdprRequest resource","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","processing","declined","approved","revoked"],"example":"processing"},"message":{"type":"string","nullable":true}}},"example":{"status":"processing","message":"Reviewing the request."}}},"required":true},"responses":{"200":{"description":"GDPR request updated.","content":{"application/json":{"example":{"id":9,"customerId":14,"customerName":"Jane Doe","email":"jane@example.com","type":"delete","status":"processing","message":"Reviewing the request.","revokedAt":null,"createdAt":"2026-06-10T09:00:00+00:00","updatedAt":"2026-06-24T10:15:00+00:00"}}}},"422":{"description":"Invalid status value."},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomersgdpr-requests_id_put"},"delete":{"tags":["Admin Customer GDPR"],"summary":"Delete a GDPR request","description":"Delete a GDPR request","parameters":[{"name":"id","in":"path","description":"Request ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"GDPR request deleted.","content":{"application/json":{"example":{"message":"GDPR request deleted successfully."}}}},"404":{"description":"GDPR request not found."}},"operationId":"api_apiadmincustomersgdpr-requests_id_delete"}},"/customers/gdpr-requests":{"get":{"tags":["Admin Customer GDPR"],"summary":"List GDPR requests","description":"Paginated, filterable, sortable list. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"status","in":"query","description":"Filter by status.","schema":{"type":"string"}},{"name":"type","in":"query","description":"Filter by type (update or delete).","schema":{"type":"string"}},{"name":"customer_id","in":"query","description":"Filter by customer id.","schema":{"type":"integer"}},{"name":"email","in":"query","description":"Filter by email (partial).","schema":{"type":"string"}},{"name":"customer_name","in":"query","description":"Filter by customer name (partial).","schema":{"type":"string"}},{"name":"created_at_from","in":"query","description":"Filter by created_at >= (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"created_at_to","in":"query","description":"Filter by created_at <= (YYYY-MM-DD).","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","status","type","created_at"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated GDPR requests in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":9,"customerId":14,"customerName":"Jane Doe","email":"jane@example.com","type":"delete","status":"pending","message":"Please remove my account.","revokedAt":null,"createdAt":"2026-06-10T09:00:00+00:00","updatedAt":"2026-06-10T09:00:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomersgdpr-requests_get_collection"}},"/customers/groups":{"get":{"tags":["Admin Customer Groups"],"summary":"List customer groups","description":"Paginated, filterable, sortable list. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"code","in":"query","description":"Filter by code (partial).","schema":{"type":"string"}},{"name":"name","in":"query","description":"Filter by name (partial).","schema":{"type":"string"}},{"name":"is_user_defined","in":"query","description":"Filter by system/user-defined flag (0/1).","schema":{"type":"integer"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","code","name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated customer groups in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":5,"code":"wholesale","name":"Wholesale","isUserDefined":1,"customersCount":null,"createdAt":"2026-05-01T09:00:00+00:00","updatedAt":"2026-06-20T14:30:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomersgroups_get_collection"},"post":{"tags":["Admin Customer Groups"],"summary":"Create a new customer group","description":"New groups are always created with is_user_defined=1 (system groups cannot be created via API).","requestBody":{"description":"The new AdminCustomerGroup resource","content":{"application/json":{"schema":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string","example":"wholesale"},"name":{"type":"string","example":"Wholesale"}}}}},"required":true},"responses":{"201":{"description":"Customer group created.","content":{"application/json":{"example":{"id":5,"code":"wholesale","name":"Wholesale","isUserDefined":1,"customersCount":null,"createdAt":"2026-06-24T10:15:00+00:00","updatedAt":"2026-06-24T10:15:00+00:00"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersgroups_post"}},"/customers/groups/{id}":{"get":{"tags":["Admin Customer Groups"],"summary":"Customer group detail","description":"Customer group detail","parameters":[{"name":"id","in":"path","description":"Customer group ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Customer group detail (with customersCount).","content":{"application/json":{"example":{"id":5,"code":"wholesale","name":"Wholesale","isUserDefined":1,"customersCount":12,"createdAt":"2026-05-01T09:00:00+00:00","updatedAt":"2026-06-20T14:30:00+00:00"}}}},"404":{"description":"Customer group not found."}},"operationId":"api_apiadmincustomersgroups_id_get"},"put":{"tags":["Admin Customer Groups"],"summary":"Update a customer group","description":"System groups refuse code/is_user_defined changes (422). Only name can be updated for system groups.","parameters":[{"name":"id","in":"path","description":"Customer group ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminCustomerGroup resource","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}}},"example":{"code":"wholesale","name":"Wholesale Buyers"}}},"required":true},"responses":{"200":{"description":"Customer group updated.","content":{"application/json":{"example":{"id":5,"code":"wholesale","name":"Wholesale Buyers","isUserDefined":1,"customersCount":null,"createdAt":"2026-05-01T09:00:00+00:00","updatedAt":"2026-06-24T10:15:00+00:00"}}}},"422":{"description":"Validation failure or immutable system-group field."},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomersgroups_id_put"},"delete":{"tags":["Admin Customer Groups"],"summary":"Delete a customer group","description":"Refuses if the group is a system group (is_user_defined=0) or has customers attached (400).","parameters":[{"name":"id","in":"path","description":"Customer group ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Customer group deleted.","content":{"application/json":{"example":{"message":"Customer group deleted successfully."}}}},"400":{"description":"Refused \u2014 system group or has attached customers."},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomersgroups_id_delete"}},"/customers/groups/mass-delete":{"post":{"tags":["Admin Customer Groups"],"summary":"Mass delete customer groups","description":"System groups and groups with attached customers are skipped with a reason.","requestBody":{"description":"The new AdminCustomerGroupMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"}}}},"example":{"indices":[5,6,7]}}},"required":true},"responses":{"200":{"description":"Mass-delete result.","content":{"application/json":{"example":{"deleted":[5,7],"skipped":[{"id":6,"reason":"Group has customers attached."}],"message":"Customer groups deleted successfully."}}}},"422":{"description":"No indices supplied."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersgroupsmass-delete_post"}},"/customers/{customerId}/impersonate":{"post":{"tags":["Admin Customers"],"summary":"Issue an impersonation token for a customer","description":"Returns a Sanctum customer token that the admin can use to act as the customer. The token expires in 1 hour and is audited as having been issued by the calling admin. No request body \u2014 the customer is identified by the path.","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"201":{"description":"Impersonation token issued.","content":{"application/json":{"example":{"token":"42|q7Xz9aB3cD5eF7gH9iJ1kL3mN5oP7qR9sT1uV3w","customerId":14,"customerEmail":"jane@example.com","customerName":"Jane Doe","impersonatedByAdminId":1,"expiresAt":"2026-06-24T11:15:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincustomers_customerIdimpersonate_post"}},"/customers/mass-delete":{"post":{"tags":["Admin Customers"],"summary":"Mass delete customers","description":"Customers with pending/processing orders are skipped with a reason.","requestBody":{"description":"The new AdminCustomerMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"}}}},"example":{"indices":[14,15,16]}}},"required":true},"responses":{"200":{"description":"Mass-delete result.","content":{"application/json":{"example":{"deleted":[14,16],"skipped":[{"id":15,"reason":"Customer has pending or processing orders."}],"message":"Customers deleted successfully."}}}},"422":{"description":"No indices supplied."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersmass-delete_post"}},"/customers/mass-update-status":{"post":{"tags":["Admin Customers"],"summary":"Mass update customer status","description":"Mass update customer status","requestBody":{"description":"The new AdminCustomerMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"}},"value":{"type":"integer","enum":[0,1]}}},"example":{"indices":[14,15,16],"value":1}}},"required":true},"responses":{"200":{"description":"Mass-update result.","content":{"application/json":{"example":{"updated":[14,15,16],"value":1,"message":"Customer status updated successfully."}}}},"422":{"description":"Missing indices or invalid value."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersmass-update-status_post"}},"/customers/{customerId}/notes":{"get":{"tags":["Admin Customers"],"summary":"List a customer's notes","description":"List a customer's notes","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Notes for the customer, newest first.","content":{"application/json":{"example":{"data":[{"id":7,"note":"Called the customer about delivery.","customerId":1,"customerNotified":false,"createdAt":"2026-06-09T10:15:00+00:00"}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_customerIdnotes_get_collection"},"post":{"tags":["Admin Customers"],"summary":"Add a note to a customer","description":"Add a note to a customer","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminCustomerNote resource","content":{"application/json":{"schema":{"type":"object","required":["note"],"properties":{"note":{"type":"string"},"customer_notified":{"type":"boolean"}}},"example":{"note":"Called the customer about delivery.","customer_notified":false}}},"required":true},"responses":{"201":{"description":"Note added.","content":{"application/json":{"example":{"id":7,"note":"Called the customer about delivery.","customerId":14,"customerNotified":false,"createdAt":"2026-06-24T10:15:00+00:00"}}}},"422":{"description":"Empty note."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomers_customerIdnotes_post"}},"/customers/{customerId}/recent-order-items":{"get":{"tags":["Admin Customers"],"summary":"Get a customer's recent order items","description":"Top-level (`parent_id IS NULL`) items from the customer's most-recent orders, distinct by product, limited to 5.","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Up to 5 recent items.","content":{"application/json":{"example":{"data":[{"id":2694,"productId":2358,"sku":"test65","type":"simple","name":"Classic Watch Hand","price":4000,"formattedPrice":"$4,000.00","productImage":"http://localhost:8000/storage/product/2358/example.webp","additional":{"quantity":1}}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_customerIdrecent-order-items_get_collection"}},"/customers/reviews/{id}":{"get":{"tags":["Admin Customer Reviews"],"summary":"Review detail (with linked product + customer)","description":"Review detail (with linked product + customer)","parameters":[{"name":"id","in":"path","description":"Review ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Review detail with nested product, customer and images.","content":{"application/json":{"example":{"id":21,"title":"Great product","comment":"Exactly as described.","rating":5,"status":"approved","name":"Jane Doe","createdAt":"2026-06-01T08:00:00+00:00","updatedAt":"2026-06-20T14:30:00+00:00","product":{"id":2358,"name":"Classic Watch Hand","sku":"SP-001"},"customer":{"id":14,"name":"Jane Doe","email":"jane@example.com"},"images":[{"id":4,"path":"review/21/photo.webp","url":"http://localhost:8000/storage/review/21/photo.webp"}]}}}},"404":{"description":"Review not found."}},"operationId":"api_apiadmincustomersreviews_id_get"},"put":{"tags":["Admin Customer Reviews"],"summary":"Update review status","description":"Only the status field is editable; reviews originate from the storefront.","parameters":[{"name":"id","in":"path","description":"Review ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminCustomerReview resource","content":{"application/json":{"schema":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["pending","approved","disapproved"],"example":"approved"}}}}},"required":true},"responses":{"200":{"description":"Review updated.","content":{"application/json":{"example":{"id":21,"title":"Great product","comment":"Exactly as described.","rating":5,"status":"approved","name":"Jane Doe","createdAt":"2026-06-01T08:00:00+00:00","updatedAt":"2026-06-24T10:15:00+00:00","product":{"id":2358,"name":"Classic Watch Hand","sku":"SP-001"},"customer":{"id":14,"name":"Jane Doe","email":"jane@example.com"},"images":[{"id":4,"path":"review/21/photo.webp","url":"http://localhost:8000/storage/review/21/photo.webp"}]}}}},"422":{"description":"Invalid status value."},"400":{"description":"Invalid input"},"404":{"description":"Not found"}},"operationId":"api_apiadmincustomersreviews_id_put"},"delete":{"tags":["Admin Customer Reviews"],"summary":"Delete a review","description":"Delete a review","parameters":[{"name":"id","in":"path","description":"Review ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Review deleted.","content":{"application/json":{"example":{"message":"Review deleted successfully."}}}},"404":{"description":"Review not found."}},"operationId":"api_apiadmincustomersreviews_id_delete"}},"/customers/reviews":{"get":{"tags":["Admin Customer Reviews"],"summary":"List customer reviews","description":"Paginated, filterable, sortable list. Returns { data, meta } envelope.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"status","in":"query","description":"pending|approved|disapproved","schema":{"type":"string"}},{"name":"rating","in":"query","description":"Filter by rating value","schema":{"type":"integer"}},{"name":"product_id","in":"query","description":"Filter by product ID","schema":{"type":"integer"}},{"name":"customer_id","in":"query","description":"Filter by customer ID","schema":{"type":"integer"}},{"name":"created_at_from","in":"query","description":"Lower bound for created_at","schema":{"type":"string"}},{"name":"created_at_to","in":"query","description":"Upper bound for created_at","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","rating","created_at"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated reviews in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":21,"title":"Great product","comment":"Exactly as described.","rating":5,"status":"approved","name":"Jane Doe","createdAt":"2026-06-01T08:00:00+00:00","updatedAt":"2026-06-20T14:30:00+00:00","product":{"id":2358,"name":"Classic Watch Hand","sku":"SP-001"},"customer":{"id":14,"name":"Jane Doe","email":"jane@example.com"}}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomersreviews_get_collection"}},"/customers/reviews/mass-delete":{"post":{"tags":["Admin Customer Reviews"],"summary":"Mass delete reviews","description":"Mass delete reviews","requestBody":{"description":"The new AdminCustomerReviewMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"}}}},"example":{"indices":[21,22,23]}}},"required":true},"responses":{"200":{"description":"Mass-delete result.","content":{"application/json":{"example":{"deleted":[21,22,23],"skipped":[],"message":"Reviews deleted successfully."}}}},"422":{"description":"No indices supplied."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersreviewsmass-delete_post"}},"/customers/reviews/mass-update-status":{"post":{"tags":["Admin Customer Reviews"],"summary":"Mass update review status","description":"Mass update review status","requestBody":{"description":"The new AdminCustomerReviewMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"}},"value":{"type":"string","enum":["pending","approved","disapproved"]}}},"example":{"indices":[21,22,23],"value":"approved"}}},"required":true},"responses":{"200":{"description":"Mass-update result.","content":{"application/json":{"example":{"updated":[21,22,23],"value":"approved","message":"Review status updated successfully."}}}},"422":{"description":"Missing indices or invalid value."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmincustomersreviewsmass-update-status_post"}},"/customers/{customerId}/wishlist-items":{"get":{"tags":["Admin Customers"],"summary":"Get a customer's wishlist","description":"Get a customer's wishlist","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Wishlist items for the customer.","content":{"application/json":{"example":{"data":[{"id":88,"productId":2358,"sku":"test65","name":"Classic Watch Hand","price":4000,"formattedPrice":"$4,000.00","productImage":"http://localhost:8000/storage/product/2358/example.webp","additional":null}],"meta":{"currentPage":1,"perPage":1,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmincustomers_customerIdwishlist-items_get_collection"}},"/dashboard/stats":{"get":{"tags":["Admin Dashboard"],"summary":"Admin dashboard statistics","description":"Returns aggregate stats from `Webkul\\Admin\\Helpers\\Dashboard`. Use `?type=` to choose the stat group; `?start=` + `?end=` (ISO dates) to bound the window; `?channel=` (channel code) to filter by channel.","parameters":[{"name":"type","in":"query","description":"Stat group: over-all (default), today, stock-threshold-products, total-sales, total-visitors, top-selling-products, top-customers.","schema":{"type":"string","enum":["over-all","today","stock-threshold-products","total-sales","total-visitors","top-selling-products","top-customers"]}},{"name":"start","in":"query","description":"Start date (YYYY-MM-DD). Defaults to 30 days ago.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date (YYYY-MM-DD). Defaults to today.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code filter.","schema":{"type":"string"}}],"responses":{"200":{"description":"Stats payload + date range.","content":{"application/json":{"example":[{"type":"over-all","dateRange":"25 Apr - 25 May","statistics":{"total_customers":{"previous":12,"current":18,"progress":50},"total_orders":{"previous":32,"current":41,"progress":28.13},"total_sales":{"previous":{"price":1200},"current":{"price":1900},"progress":58.33},"avg_sales":{"previous":{"price":37.5},"current":{"price":46.3},"progress":23.46},"total_unpaid_invoices":{"total":250,"formatted_total":"$250.00"}}}]}}}},"operationId":"api_apiadmindashboardstats_get_collection"}},"/customers/{customerId}/draft-carts":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Create an empty draft cart for a customer","description":"Bootstraps an empty admin draft cart (`is_active = false`) for the given customer. The returned `cartId` is the handle the admin uses for the rest of the Create-Order flow (`POST /api/admin/carts/{id}/items`, addresses, shipping, payment, place-order).","parameters":[{"name":"customerId","in":"path","description":"Customer ID","required":true,"schema":{"type":"integer"}}],"requestBody":[],"responses":{"201":{"description":"A new empty draft cart was created for the customer.","content":{"application/json":{"example":{"cartId":412,"customerId":7,"success":true,"message":"Draft cart created."}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmincustomers_customerIddraft-carts_post"}},"/eu-withdrawals":{"get":{"tags":["Admin Sales: EU Withdrawal"],"summary":"List EU right-of-withdrawal declarations","description":"Filters: order_increment_id (LIKE), customer_email (LIKE), status (received|refunded|declined), channel_code, received_at_from/to, confirmation_sent_at_from/to. Sort: id (default desc), received_at, status. Permission: sales.eu_withdrawals.","responses":{"200":{"description":"The withdrawal declarations.","content":{"application/json":{"example":{"data":[{"id":7,"uuid":"b2f1c0de-5a2e-4d7a-9f2e-3c1a2b4d5e6f","orderId":12,"orderIncrementId":"000000012","customerId":5,"customerName":"Jane Doe","customerEmail":"jane@example.com","isGuest":false,"channelId":1,"channelCode":"default","locale":"en","reasonText":"Changed my mind.","status":"received","receivedAt":"2026-07-20T09:00:00+00:00","confirmationSentAt":"2026-07-20T09:00:05+00:00","finalConfirmationSentAt":null,"confirmationError":null,"declinedAt":null,"declinedReason":null,"declinedByUserId":null,"declinedByName":null,"refundedAt":null,"refundedByUserId":null,"refundedByName":null,"refundNote":null,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:05+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmineu-withdrawals_get_collection"}},"/eu-withdrawals/{id}":{"get":{"tags":["Admin Sales: EU Withdrawal"],"summary":"Get a withdrawal declaration (evidence + timeline)","description":"Get a withdrawal declaration (evidence + timeline)","parameters":[{"name":"id","in":"path","description":"Eu withdrawal ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The withdrawal declaration with its full evidence timeline.","content":{"application/json":{"example":{"id":7,"uuid":"b2f1c0de-5a2e-4d7a-9f2e-3c1a2b4d5e6f","orderId":12,"orderIncrementId":"000000012","customerId":5,"customerName":"Jane Doe","customerEmail":"jane@example.com","isGuest":false,"channelId":1,"channelCode":"default","locale":"en","reasonText":"Changed my mind.","status":"refunded","receivedAt":"2026-07-20T09:00:00+00:00","confirmationSentAt":"2026-07-20T09:00:05+00:00","finalConfirmationSentAt":"2026-07-21T14:00:00+00:00","confirmationError":null,"declinedAt":null,"declinedReason":null,"declinedByUserId":null,"declinedByName":null,"refundedAt":"2026-07-21T14:00:00+00:00","refundedByUserId":1,"refundedByName":"Example Admin","refundNote":"Refunded via original payment method.","message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-21T14:00:00+00:00"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadmineu-withdrawals_id_get"}},"/eu-withdrawals/{id}/decline":{"post":{"tags":["Admin Sales: EU Withdrawal"],"summary":"Decline a withdrawal (merchant contests entitlement)","description":"Sets status=declined and clears any prior refund metadata. Permission: sales.eu_withdrawals.decline.","parameters":[{"name":"id","in":"path","description":"Eu withdrawal ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminEuWithdrawal resource","content":{"application/json":{"schema":{"type":"object","required":["declined_reason"],"properties":{"declined_reason":{"type":"string","example":"Item was a personalised good, exempt from withdrawal."}}}}},"required":true},"responses":{"200":{"description":"The declined withdrawal declaration.","content":{"application/json":{"example":{"id":7,"uuid":"b2f1c0de-5a2e-4d7a-9f2e-3c1a2b4d5e6f","orderIncrementId":"000000012","customerEmail":"jane@example.com","status":"declined","declinedAt":"2026-07-21T15:00:00+00:00","declinedReason":"Item was a personalised good, exempt from withdrawal.","declinedByUserId":1,"declinedByName":"Example Admin","refundedAt":null,"refundNote":null,"message":"Withdrawal declined.","updatedAt":"2026-07-21T15:00:00+00:00"}}}},"201":{"description":"AdminEuWithdrawal resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmineu-withdrawals_iddecline_post"}},"/eu-withdrawals/{id}/mark-refunded":{"post":{"tags":["Admin Sales: EU Withdrawal"],"summary":"Mark a withdrawal refunded (recorded out-of-band)","description":"Sets status=refunded and clears any prior decline metadata. Permission: sales.eu_withdrawals.mark_refunded.","parameters":[{"name":"id","in":"path","description":"Eu withdrawal ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminEuWithdrawal resource","content":{"application/json":{"schema":{"type":"object","properties":{"refund_note":{"type":"string","example":"Refunded via original payment method."}}}}}},"responses":{"200":{"description":"The refunded withdrawal declaration.","content":{"application/json":{"example":{"id":7,"uuid":"b2f1c0de-5a2e-4d7a-9f2e-3c1a2b4d5e6f","orderIncrementId":"000000012","customerEmail":"jane@example.com","status":"refunded","declinedAt":null,"declinedReason":null,"refundedAt":"2026-07-21T14:00:00+00:00","refundedByUserId":1,"refundedByName":"Example Admin","refundNote":"Refunded via original payment method.","message":"Withdrawal marked as refunded.","updatedAt":"2026-07-21T14:00:00+00:00"}}}},"201":{"description":"AdminEuWithdrawal resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmineu-withdrawals_idmark-refunded_post"}},"/eu-withdrawals/{id}/resend-confirmation":{"post":{"tags":["Admin Sales: EU Withdrawal"],"summary":"Resend the durable-medium confirmation email","description":"Empty body. Re-sends the confirmation email in the declaration's locale. Permission: sales.eu_withdrawals.resend_confirmation.","parameters":[{"name":"id","in":"path","description":"Eu withdrawal ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The declaration after the confirmation email was re-sent (confirmationSentAt refreshed).","content":{"application/json":{"example":{"id":7,"uuid":"b2f1c0de-5a2e-4d7a-9f2e-3c1a2b4d5e6f","orderIncrementId":"000000012","customerEmail":"jane@example.com","status":"received","confirmationSentAt":"2026-07-21T16:30:00+00:00","confirmationError":null,"message":"Confirmation email re-sent.","updatedAt":"2026-07-21T16:30:00+00:00"}}}},"201":{"description":"AdminEuWithdrawal resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadmineu-withdrawals_idresend-confirmation_post"}},"/invoices":{"get":{"tags":["Admin Sales: Invoices"],"summary":"List invoices (datagrid parity)","description":"Paginated invoices listing. Every invoice column + billing/shipping addresses are populated per row (line items are detail-only). Returns a `{ data, meta }` envelope. Requires `sales.invoices.view`.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by invoice id (integer or comma-separated list).","schema":{"type":"string","example":"12"}},{"name":"order_id","in":"query","description":"Partial order increment_id match.","schema":{"type":"string","example":"00000"}},{"name":"state","in":"query","description":"Filter by invoice state.","schema":{"type":"string","enum":["pending","pending_payment","paid","overdue"],"example":"paid"}},{"name":"base_grand_total_from","in":"query","description":"Minimum base grand total.","schema":{"type":"number","example":0}},{"name":"base_grand_total_to","in":"query","description":"Maximum base grand total.","schema":{"type":"number","example":1000}},{"name":"created_at_from","in":"query","description":"Created after (ISO date).","schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"created_at_to","in":"query","description":"Created before (ISO date).","schema":{"type":"string","format":"date","example":"2026-12-31"}},{"name":"sort","in":"query","description":"Column to sort by.","schema":{"type":"string","enum":["id","increment_id","order_id","base_grand_total","state","created_at"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"AdminInvoice collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadmininvoices_get_collection"}},"/invoices/{id}":{"get":{"tags":["Admin Sales: Invoices"],"summary":"Get invoice detail","description":"Full single-invoice payload \u2014 every invoice column, order/customer context, billing & shipping addresses, and embedded line items. Requires `sales.invoices.view`.","parameters":[{"name":"id","in":"path","description":"Invoice ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Invoice detail.","content":{"application/json":{"example":{"id":585,"incrementId":"585","orderId":41,"orderIncrementId":"41","state":"paid","emailSent":true,"totalQty":1,"orderCurrencyCode":"USD","baseCurrencyCode":"USD","channelCurrencyCode":"USD","subTotal":4000,"formattedSubTotal":"$4,000.00","baseSubTotal":4000,"formattedBaseSubTotal":"$4,000.00","subTotalInclTax":4000,"formattedSubTotalInclTax":"$4,000.00","baseSubTotalInclTax":4000,"formattedBaseSubTotalInclTax":"$4,000.00","grandTotal":4000,"formattedGrandTotal":"$4,000.00","baseGrandTotal":4000,"formattedBaseGrandTotal":"$4,000.00","taxAmount":0,"formattedTaxAmount":"$0.00","baseTaxAmount":0,"formattedBaseTaxAmount":"$0.00","discountAmount":0,"formattedDiscountAmount":"$0.00","baseDiscountAmount":0,"formattedBaseDiscountAmount":"$0.00","shippingAmount":0,"formattedShippingAmount":"$0.00","baseShippingAmount":0,"formattedBaseShippingAmount":"$0.00","shippingAmountInclTax":0,"formattedShippingAmountInclTax":"$0.00","baseShippingAmountInclTax":0,"formattedBaseShippingAmountInclTax":"$0.00","shippingTaxAmount":0,"formattedShippingTaxAmount":"$0.00","baseShippingTaxAmount":0,"formattedBaseShippingTaxAmount":"$0.00","transactionId":null,"reminders":0,"nextReminderAt":null,"createdAt":"2026-06-04 17:52:47","updatedAt":"2026-06-04 18:34:43","orderStatus":"processing","orderStatusLabel":"Processing","orderDate":"2024-06-13 17:28:47","channelName":"bagisto store","customerName":"webkul pvt ltd","customerEmail":"abhijit.kumar018@webkul.in","order":{"id":41,"addresses":[{"id":190,"addressType":"order_billing","firstName":"webkul","lastName":"pvt ltd","companyName":"C. Trades","address":"noida arv park 63","city":"Wyoming","state":"Uttar Pradesh","country":"IN","postcode":"456464","email":"abhijit.kumar018@webkul.in","phone":"09999999999"},{"id":189,"addressType":"order_shipping","firstName":"webkul","lastName":"pvt ltd","companyName":"C. Trades","address":"noida arv park 63","city":"Wyoming","state":"Uttar Pradesh","country":"IN","postcode":"456464","email":"abhijit.kumar018@webkul.in","phone":"09999999999"}]},"items":[{"id":860,"orderItemId":50,"sku":"Head13","name":"Bagisto Cowboy Hat","qty":1,"price":4000,"formattedPrice":"$4,000.00","basePrice":4000,"basePriceInclTax":4000,"total":4000,"formattedTotal":"$4,000.00","baseTotal":4000,"baseTotalInclTax":4000,"taxAmount":0,"formattedTaxAmount":"$0.00","discountAmount":0,"formattedDiscountAmount":"$0.00","productId":122,"productType":"simple","baseImageUrl":"http://localhost:8000/storage/product/122/P9n1dbmgM4UOBT3zUAEGCn4wpKi0GjPGhgS1jZe7.webp","additional":{"locale":"en","quantity":1,"product_id":"122","super_attribute":[],"selected_configurable_option":122}}]}}}},"404":{"description":"Not found"}},"operationId":"api_apiadmininvoices_id_get"}},"/invoices/{id}/print":{"get":{"tags":["Admin Sales: Invoices"],"summary":"Download an invoice as PDF","description":"Returns the invoice as a PDF file (`application/pdf` attachment) \u2014 the response is a binary download, not JSON. There is no example body; the browser/client downloads `invoice-{id}.pdf`.","parameters":[{"name":"id","in":"path","description":"Invoice ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The invoice PDF file is downloaded (application/pdf attachment).","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadmininvoices_idprint_get"}},"/orders/{orderId}/invoices":{"post":{"tags":["Admin Sales: Orders"],"summary":"Create an invoice for an order","description":"Create an invoice for an order","parameters":[{"name":"orderId","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminInvoice resource","content":{"application/json":{"schema":{"type":"object"},"example":{"items":[{"orderItemId":42,"quantity":3},{"orderItemId":43,"quantity":1}],"can_create_transaction":true}}},"required":true},"responses":{"201":{"description":"AdminInvoice resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminorders_orderIdinvoices_post"}},"/invoices/export":{"get":{"tags":["Admin Sales: Invoices"],"summary":"Export invoices as csv, xls or xlsx","description":"Downloads the invoices datagrid as a csv, xls or xlsx file \u2014 the same data the admin Export button produces. Honours the same filters as the listing. Binary download, not JSON. Pick the file type with ?format=csv|xls|xlsx (default csv).","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}}],"responses":{"200":{"description":"Export file downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks the view permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadmininvoicesexport_get"}},"/invoices/mass-update-status":{"post":{"tags":["Admin Sales: Invoices"],"summary":"Mass update invoice status","description":"Bulk-sets the status of a batch of invoices to pending, paid, or overdue. This is a manual status override \u2014 it does not capture or reverse a payment.","requestBody":{"description":"The new AdminInvoiceMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[560,561]},"value":{"type":"string","enum":["pending","paid","overdue"],"example":"paid"}}}}},"required":true},"responses":{"200":{"description":"Invoices updated.","content":{"application/json":{"example":{"updated":[560,561],"message":"Invoice status updated successfully."}}}},"422":{"description":"Empty indices, or value not one of pending/paid/overdue."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.invoices.view."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmininvoicesmass-update-status_post"}},"/invoices/{id}/send-duplicate":{"post":{"tags":["Admin Sales: Invoices"],"summary":"Send a duplicate invoice email","description":"Emails a copy of the invoice. `email` is optional \u2014 defaults to the order's customer email. Requires `sales.invoices.view`.","parameters":[{"name":"id","in":"path","description":"Invoice send duplicate ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminInvoiceSendDuplicate resource","content":{"application/json":{"schema":{"type":"object"},"example":{"email":"customer@example.com"}}}},"responses":{"200":{"description":"Invoice email sent.","content":{"application/json":{"example":{"id":585,"email":"customer@example.com","success":true,"message":"Invoice email sent to customer@example.com."}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.invoices.view."},"404":{"description":"Invoice not found."},"422":{"description":"Recipient email is invalid."},"400":{"description":"Invalid input"}},"operationId":"api_apiadmininvoices_idsend-duplicate_post"}},"/marketing/campaigns":{"get":{"tags":["Admin Marketing: Communications"],"summary":"List marketing campaigns","description":"Filters: name (LIKE), status (0/1), marketing_template_id, marketing_event_id, channel_id, customer_group_id. Sort: id (default desc), name.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Enabled flag (0/1).","schema":{"type":"integer"}},{"name":"marketing_template_id","in":"query","description":"Filter by template id.","schema":{"type":"integer"}},{"name":"marketing_event_id","in":"query","description":"Filter by event id.","schema":{"type":"integer"}},{"name":"channel_id","in":"query","description":"Filter by channel id.","schema":{"type":"integer"}},{"name":"customer_group_id","in":"query","description":"Filter by customer group id.","schema":{"type":"integer"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope. The channel / customerGroup / marketingTemplate / marketingEvent objects are detail-only and null on list rows.","content":{"application/json":{"example":{"data":[{"id":5,"name":"Holiday Newsletter","subject":"Big Holiday Sale Inside","status":1,"channel":null,"customerGroup":null,"marketingTemplate":null,"marketingEvent":null,"createdAt":"2026-05-26T16:51:08+05:30","updatedAt":"2026-05-26T16:51:28+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":2,"from":1,"to":2}}}}}},"operationId":"api_apiadminmarketingcampaigns_get_collection"},"post":{"tags":["Admin Marketing: Communications"],"summary":"Create a marketing campaign","description":"Create a marketing campaign","requestBody":{"description":"The new AdminMarketingCampaign resource","content":{"application/json":{"schema":{"type":"object","required":["name","subject","marketing_template_id","marketing_event_id","channel_id","customer_group_id"],"properties":{"name":{"type":"string","example":"July Newsletter"},"subject":{"type":"string","example":"Big July deals inside!"},"marketing_template_id":{"type":"integer","example":1},"marketing_event_id":{"type":"integer","example":1},"channel_id":{"type":"integer","example":1},"customer_group_id":{"type":"integer","example":1},"status":{"type":"integer","example":1}}}}},"required":true},"responses":{"201":{"description":"Campaign created.","content":{"application/json":{"example":{"id":5,"name":"Holiday Newsletter","subject":"Big Holiday Sale Inside","status":1,"channel":{"id":1,"code":"default","name":"Default"},"customerGroup":{"id":2,"code":"general","name":"General"},"marketingTemplate":{"id":16,"name":"Holiday Template","status":"active"},"marketingEvent":null,"createdAt":"2026-05-26T16:51:08+05:30","updatedAt":"2026-05-26T16:51:28+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcampaigns_post"}},"/marketing/campaigns/{id}":{"get":{"tags":["Admin Marketing: Communications"],"summary":"Campaign detail","description":"Campaign detail","parameters":[{"name":"id","in":"path","description":"Marketing campaign ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign with embedded channel / customerGroup / marketingTemplate / marketingEvent objects.","content":{"application/json":{"example":{"id":5,"name":"Holiday Newsletter","subject":"Big Holiday Sale Inside","status":1,"channel":{"id":1,"code":"default","name":"Default"},"customerGroup":{"id":2,"code":"general","name":"General"},"marketingTemplate":{"id":16,"name":"Holiday Template","status":"active"},"marketingEvent":{"id":3,"name":"Holiday Sale","date":"2026-12-25"},"createdAt":"2026-05-26T16:51:08+05:30","updatedAt":"2026-05-26T16:51:28+05:30"}}}},"404":{"description":"Campaign not found."}},"operationId":"api_apiadminmarketingcampaigns_id_get"},"put":{"tags":["Admin Marketing: Communications"],"summary":"Update a marketing campaign","description":"Update a marketing campaign","parameters":[{"name":"id","in":"path","description":"Marketing campaign ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingCampaign resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"July Newsletter"},"subject":{"type":"string","example":"Big July deals inside!"},"marketing_template_id":{"type":"integer","example":1},"marketing_event_id":{"type":"integer","example":1},"channel_id":{"type":"integer","example":1},"customer_group_id":{"type":"integer","example":1},"status":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"Campaign updated.","content":{"application/json":{"example":{"id":5,"name":"Holiday Newsletter","subject":"Big Holiday Sale Inside","status":1,"channel":{"id":1,"code":"default","name":"Default"},"customerGroup":{"id":2,"code":"general","name":"General"},"marketingTemplate":{"id":16,"name":"Holiday Template","status":"active"},"marketingEvent":null,"createdAt":"2026-05-26T16:51:08+05:30","updatedAt":"2026-05-26T16:51:28+05:30"}}}},"404":{"description":"Campaign not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcampaigns_id_put"},"delete":{"tags":["Admin Marketing: Communications"],"summary":"Delete a marketing campaign","description":"Delete a marketing campaign","parameters":[{"name":"id","in":"path","description":"Marketing campaign ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign deleted.","content":{"application/json":{"example":{"message":"Campaign deleted."}}}},"404":{"description":"Campaign not found."}},"operationId":"api_apiadminmarketingcampaigns_id_delete"}},"/marketing/campaigns/{id}/send":{"post":{"tags":["Admin Marketing: Communications"],"summary":"Send a marketing campaign","description":"Queues the campaign email for every subscriber in its customer_group. Refuses inactive campaigns with HTTP 422.","parameters":[{"name":"id","in":"path","description":"Marketing campaign send ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminMarketingCampaignSend resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Send queued.","content":{"application/json":{"example":{"campaignId":5,"queued":124,"message":"Campaign queued for 124 recipient(s)."}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks marketing.communications.campaigns.edit."},"404":{"description":"Campaign not found."},"422":{"description":"Campaign is inactive."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcampaigns_idsend_post"}},"/marketing/cart-rules":{"get":{"tags":["Admin Marketing: Promotions"],"summary":"List cart rules","description":"Paginated, filterable, sortable list. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"id","in":"query","description":"Filter by ID (single or comma-separated).","schema":{"type":"string"}},{"name":"name","in":"query","description":"Filter by name (partial match).","schema":{"type":"string"}},{"name":"coupon_code","in":"query","description":"Filter by coupon code (partial match).","schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status (0/1).","schema":{"type":"integer"}},{"name":"coupon_type","in":"query","description":"Filter by coupon_type (1/2).","schema":{"type":"integer"}},{"name":"sort_order","in":"query","description":"Filter by priority (sort_order, exact).","schema":{"type":"integer"}},{"name":"starts_from_from","in":"query","description":"Start date >= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"starts_from_to","in":"query","description":"Start date <= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"ends_till_from","in":"query","description":"End date >= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"ends_till_to","in":"query","description":"End date <= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name","sort_order"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope. conditions / channels / customerGroups are detail-only and null on list rows.","content":{"application/json":{"example":{"data":[{"id":17,"name":"10% off summer","description":"Sitewide 10% off summer collection","startsFrom":"2026-06-01T00:00:00+05:30","endsTill":"2026-08-31T23:59:59+05:30","status":1,"couponType":1,"useAutoGeneration":0,"usagePerCustomer":1,"usesPerCoupon":100,"timesUsed":0,"conditionType":1,"conditions":null,"actionType":"by_percent","discountAmount":10,"discountQuantity":1,"discountStep":"0","applyToShipping":0,"freeShipping":0,"endOtherRules":0,"usesAttributeConditions":0,"sortOrder":0,"couponCode":"SUMMER10","channels":null,"customerGroups":null,"createdAt":"2026-06-09T13:48:29+05:30","updatedAt":"2026-06-09T13:48:29+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminmarketingcart-rules_get_collection"},"post":{"tags":["Admin Marketing: Promotions"],"summary":"Create a new cart rule","description":"Create a new cart rule","requestBody":{"description":"The new AdminMarketingCartRule resource","content":{"application/json":{"schema":{"type":"object","required":["name","channels","customer_groups","coupon_type","action_type","discount_amount"],"properties":{"name":{"type":"string","example":"10% off summer"},"description":{"type":"string","example":"Sitewide 10% off summer collection"},"channels":{"type":"array","items":{"type":"integer"},"description":"Assigned channel ids (request stays id-based; the response returns objects).","example":[1]},"customer_groups":{"type":"array","items":{"type":"integer"},"description":"Assigned customer-group ids (request stays id-based; the response returns objects).","example":[1,2,3]},"coupon_type":{"type":"integer","enum":[0,1],"description":"0 = no coupon (auto-applied), 1 = specific coupon.","example":1},"use_auto_generation":{"type":"integer","enum":[0,1],"description":"When coupon_type=1: 1 = auto-generate codes, 0 = use the supplied coupon_code.","example":0},"coupon_code":{"type":"string","description":"Required when coupon_type=1 and use_auto_generation=0; must be unique.","example":"SUMMER10"},"uses_per_coupon":{"type":"integer","description":"Total redemptions allowed per coupon (0 = unlimited).","example":100},"usage_per_customer":{"type":"integer","description":"Redemptions allowed per customer (0 = unlimited).","example":1},"condition_type":{"type":"integer","enum":[1,2],"description":"1 = all conditions true, 2 = any condition true.","example":1},"conditions":{"type":"array","items":{"type":"object"},"description":"Condition rows: { attribute, operator, value, attribute_type }.","example":[{"attribute":"cart|base_sub_total","operator":">=","value":"100","attribute_type":"price"}]},"action_type":{"type":"string","enum":["by_percent","by_fixed","cart_fixed","buy_x_get_y"],"example":"by_percent"},"discount_amount":{"type":"number","description":"0-100 when action_type=by_percent.","example":10},"discount_quantity":{"type":"integer","description":"Max quantity discounted (buy_x_get_y).","example":1},"discount_step":{"type":"integer","description":"Buy-X step (buy_x_get_y).","example":0},"apply_to_shipping":{"type":"integer","enum":[0,1],"description":"Apply the discount to shipping too.","example":0},"free_shipping":{"type":"integer","enum":[0,1],"example":0},"end_other_rules":{"type":"integer","enum":[0,1],"description":"Stop processing further rules when this one matches.","example":0},"sort_order":{"type":"integer","description":"Priority (lower runs first).","example":0},"starts_from":{"type":"string","format":"date-time","example":"2026-06-01 00:00:00"},"ends_till":{"type":"string","format":"date-time","example":"2026-08-31 23:59:59"},"status":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"201":{"description":"Cart rule created.","content":{"application/json":{"example":{"id":17,"name":"10% off summer","description":"Sitewide 10% off summer collection","startsFrom":"2026-06-01T00:00:00+05:30","endsTill":"2026-08-31T23:59:59+05:30","status":1,"couponType":1,"useAutoGeneration":0,"usagePerCustomer":1,"usesPerCoupon":100,"timesUsed":0,"conditionType":1,"conditions":[{"attribute":"cart|base_sub_total","operator":">=","value":"100","attribute_type":"price"}],"actionType":"by_percent","discountAmount":10,"discountQuantity":1,"discountStep":"0","applyToShipping":0,"freeShipping":0,"endOtherRules":0,"usesAttributeConditions":0,"sortOrder":0,"couponCode":"SUMMER10","channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":1,"code":"guest","name":"Guest"},{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-09T13:48:29+05:30","updatedAt":"2026-06-09T13:48:29+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcart-rules_post"}},"/marketing/cart-rules/{id}":{"get":{"tags":["Admin Marketing: Promotions"],"summary":"Cart rule detail","description":"Cart rule detail","parameters":[{"name":"id","in":"path","description":"Cart rule ID.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Single cart rule with conditions, channels and customerGroups (object arrays) resolved.","content":{"application/json":{"example":{"id":17,"name":"10% off summer","description":"Sitewide 10% off summer collection","startsFrom":"2026-06-01T00:00:00+05:30","endsTill":"2026-08-31T23:59:59+05:30","status":1,"couponType":1,"useAutoGeneration":0,"usagePerCustomer":1,"usesPerCoupon":100,"timesUsed":0,"conditionType":1,"conditions":[{"attribute":"cart|base_sub_total","operator":">=","value":"100","attribute_type":"price"}],"actionType":"by_percent","discountAmount":10,"discountQuantity":1,"discountStep":"0","applyToShipping":0,"freeShipping":0,"endOtherRules":0,"usesAttributeConditions":0,"sortOrder":0,"couponCode":"SUMMER10","channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-09T13:48:29+05:30","updatedAt":"2026-06-09T13:48:29+05:30"}}}},"404":{"description":"Cart rule not found."}},"operationId":"api_apiadminmarketingcart-rules_id_get"},"put":{"tags":["Admin Marketing: Promotions"],"summary":"Update a cart rule","description":"Partial update \u2014 send only the fields you change. channels / customer_groups, when supplied, fully replace the current set.","parameters":[{"name":"id","in":"path","description":"Cart rule ID.","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminMarketingCartRule resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"15% off summer"},"description":{"type":"string","example":"Updated description"},"channels":{"type":"array","items":{"type":"integer"},"example":[1]},"customer_groups":{"type":"array","items":{"type":"integer"},"example":[1,2,3]},"coupon_type":{"type":"integer","enum":[0,1],"example":1},"use_auto_generation":{"type":"integer","enum":[0,1],"example":0},"coupon_code":{"type":"string","example":"SUMMER15"},"uses_per_coupon":{"type":"integer","example":100},"usage_per_customer":{"type":"integer","example":1},"condition_type":{"type":"integer","enum":[1,2],"example":1},"conditions":{"type":"array","items":{"type":"object"},"example":[{"attribute":"cart|base_sub_total","operator":">=","value":"100","attribute_type":"price"}]},"action_type":{"type":"string","enum":["by_percent","by_fixed","cart_fixed","buy_x_get_y"],"example":"by_percent"},"discount_amount":{"type":"number","example":15},"discount_quantity":{"type":"integer","example":1},"discount_step":{"type":"integer","example":0},"apply_to_shipping":{"type":"integer","enum":[0,1],"example":0},"free_shipping":{"type":"integer","enum":[0,1],"example":0},"end_other_rules":{"type":"integer","enum":[0,1],"example":0},"sort_order":{"type":"integer","example":0},"starts_from":{"type":"string","format":"date-time","example":"2026-06-01 00:00:00"},"ends_till":{"type":"string","format":"date-time","example":"2026-08-31 23:59:59"},"status":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"Cart rule updated; returns the updated detail.","content":{"application/json":{"example":{"id":17,"name":"15% off summer","description":"Updated description","startsFrom":"2026-06-01T00:00:00+05:30","endsTill":"2026-08-31T23:59:59+05:30","status":1,"couponType":1,"useAutoGeneration":0,"usagePerCustomer":1,"usesPerCoupon":100,"timesUsed":0,"conditionType":1,"conditions":[{"attribute":"cart|base_sub_total","operator":">=","value":"100","attribute_type":"price"}],"actionType":"by_percent","discountAmount":15,"discountQuantity":1,"discountStep":"0","applyToShipping":0,"freeShipping":0,"endOtherRules":0,"usesAttributeConditions":0,"sortOrder":0,"couponCode":"SUMMER15","channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":1,"code":"guest","name":"Guest"},{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-09T13:48:29+05:30","updatedAt":"2026-06-10T09:20:11+05:30"}}}},"404":{"description":"Cart rule not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcart-rules_id_put"},"delete":{"tags":["Admin Marketing: Promotions"],"summary":"Delete a cart rule","description":"Delete a cart rule","parameters":[{"name":"id","in":"path","description":"Cart rule ID.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"example":{"message":"Cart rule deleted."}}}},"404":{"description":"Not found."}},"operationId":"api_apiadminmarketingcart-rules_id_delete"}},"/marketing/cart-rules/{id}/copy":{"post":{"tags":["Admin Marketing: Promotions"],"summary":"Copy a cart rule","description":"Duplicates the cart rule with status forced inactive and the name prefixed \"Copy of ...\", copies its channel and customer-group assignments, and returns the new rule's full detail (prefilled for editing). Coupons are not copied. Mirrors the admin datagrid Copy action.","parameters":[{"name":"id","in":"path","description":"Source cart rule ID.","required":true,"schema":{"type":"integer","example":17}}],"requestBody":{"description":"The new AdminMarketingCartRule resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Cart rule copied; returns the new rule detail.","content":{"application/json":{"example":{"id":18,"name":"Copy of 10% off summer","description":"Sitewide 10% off summer collection","startsFrom":"2026-06-01T00:00:00+05:30","endsTill":"2026-08-31T23:59:59+05:30","status":0,"couponType":1,"useAutoGeneration":0,"usagePerCustomer":1,"usesPerCoupon":100,"timesUsed":0,"conditionType":1,"conditions":[{"attribute":"cart|base_sub_total","operator":">=","value":"100","attribute_type":"price"}],"actionType":"by_percent","discountAmount":10,"discountQuantity":1,"discountStep":"0","applyToShipping":0,"freeShipping":0,"endOtherRules":0,"usesAttributeConditions":0,"sortOrder":0,"couponCode":null,"channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":1,"code":"guest","name":"Guest"},{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-10T11:05:00+05:30","updatedAt":"2026-06-10T11:05:00+05:30"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks marketing.promotions.cart_rules.create."},"404":{"description":"Source cart rule not found."},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminmarketingcart-rules_idcopy_post"}},"/marketing/cart-rules/{cartRuleId}/coupons":{"get":{"tags":["Admin Marketing: Promotions"],"summary":"List coupons for a cart rule","description":"List coupons for a cart rule","parameters":[{"name":"cartRuleId","in":"path","description":"Parent cart rule ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Coupons for the cart rule.","content":{"application/json":{"example":{"data":[{"id":22,"cartRuleId":47,"code":"SUMMER10","usageLimit":100,"usagePerCustomer":1,"timesUsed":0,"type":1,"isPrimary":false,"expiredAt":"2026-12-31","createdAt":"2026-06-09T13:48:29+05:30","updatedAt":"2026-06-09T13:48:29+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}},"404":{"description":"Cart rule not found."}},"operationId":"api_apiadminmarketingcart-rules_cartRuleIdcoupons_get_collection"},"post":{"tags":["Admin Marketing: Promotions"],"summary":"Create a single coupon code for a cart rule","description":"Create a single coupon code for a cart rule","parameters":[{"name":"cartRuleId","in":"path","description":"Parent cart rule ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminMarketingCartRuleCoupon resource","content":{"application/json":{"schema":{"type":"object","required":["code"],"properties":{"code":{"type":"string","example":"WELCOME10"},"usage_limit":{"type":"integer","example":100,"nullable":true},"usage_per_customer":{"type":"integer","example":1,"nullable":true},"expired_at":{"type":"string","format":"date","nullable":true,"example":"2027-12-31"}}}}},"required":true},"responses":{"201":{"description":"Coupon created.","content":{"application/json":{"example":{"id":22,"cartRuleId":47,"code":"SUMMER10","usageLimit":100,"usagePerCustomer":1,"timesUsed":0,"type":1,"isPrimary":false,"expiredAt":"2026-12-31","createdAt":"2026-06-09T13:48:29+05:30","updatedAt":"2026-06-09T13:48:29+05:30"}}}},"404":{"description":"Cart rule not found."},"422":{"description":"Validation failed (e.g. code missing or already in use)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcart-rules_cartRuleIdcoupons_post"}},"/marketing/cart-rules/{cartRuleId}/coupons/{id}":{"delete":{"tags":["Admin Marketing: Promotions"],"summary":"Delete a coupon","description":"Delete a coupon","parameters":[{"name":"cartRuleId","in":"path","description":"Parent cart rule ID","required":true,"schema":{"type":"integer"}},{"name":"id","in":"path","description":"Coupon ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Coupon deleted.","content":{"application/json":{"example":{"message":"Coupon deleted."}}}},"404":{"description":"Coupon not found, or it does not belong to this cart rule."}},"operationId":"api_apiadminmarketingcart-rules_cartRuleIdcoupons_id_delete"}},"/marketing/cart-rules/{cartRuleId}/coupons/generate":{"post":{"tags":["Admin Marketing: Promotions"],"summary":"Bulk-generate coupons for a cart rule","description":"Generates `coupon_qty` random codes of the given format and length, optionally with prefix/suffix. Inherits usage_limit/usage_per_customer/expired_at from the parent cart rule.","parameters":[{"name":"cartRuleId","in":"path","description":"Parent cart rule ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminMarketingCartRuleCouponGenerate resource","content":{"application/json":{"schema":{"type":"object","required":["length","format","coupon_qty"],"properties":{"length":{"type":"integer","minimum":4,"maximum":30,"example":10},"format":{"type":"string","enum":["alphabetic","alphanumeric","numeric"],"example":"alphanumeric"},"prefix":{"type":"string","nullable":true,"example":"SAVE-"},"suffix":{"type":"string","nullable":true,"example":"-2026"},"coupon_qty":{"type":"integer","minimum":1,"maximum":100,"example":5}}}}},"required":true},"responses":{"201":{"description":"Coupons generated.","content":{"application/json":{"example":{"generated":3,"coupons":[{"id":23,"cartRuleId":47,"code":"SUMMER-AB12","usageLimit":100,"usagePerCustomer":1,"timesUsed":0,"type":1,"isPrimary":false,"expiredAt":"2026-12-31","createdAt":"2026-06-10T09:00:00+05:30","updatedAt":"2026-06-10T09:00:00+05:30"}]}}}},"404":{"description":"Parent cart rule not found."},"422":{"description":"Validation failed (invalid length, format, or coupon_qty)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcart-rules_cartRuleIdcouponsgenerate_post"}},"/marketing/cart-rules/{cartRuleId}/coupons/mass-delete":{"post":{"tags":["Admin Marketing: Promotions"],"summary":"Mass-delete coupons for a cart rule","description":"Mass-delete coupons for a cart rule","parameters":[{"name":"cartRuleId","in":"path","description":"Parent cart rule ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminMarketingCartRuleCouponMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,13,14]}}}}},"required":true},"responses":{"200":{"description":"Coupons deleted","content":{"application/json":{"example":{"deleted":[23,24],"skipped":[],"message":"Coupons deleted."}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminmarketingcart-rules_cartRuleIdcouponsmass-delete_post"}},"/marketing/cart-rules/mass-delete":{"post":{"tags":["Admin Marketing: Promotions"],"summary":"Mass delete cart rules","description":"Deletes a batch of cart rules. Non-existent IDs are silently skipped.","requestBody":{"description":"The new AdminMarketingCartRuleMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[3,5]}}}}},"required":true},"responses":{"200":{"description":"Cart rules deleted.","content":{"application/json":{"example":{"deleted":[12,18],"skipped":[],"message":"Cart rules deleted."}}}},"422":{"description":"Empty indices."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcart-rulesmass-delete_post"}},"/marketing/catalog-rules":{"get":{"tags":["Admin Marketing: Promotions"],"summary":"List catalog rules","description":"Filters: name (LIKE), status. Sort: id (default desc), name, sort_order.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by ID (single or comma-separated).","schema":{"type":"string"}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Enabled flag (0/1).","schema":{"type":"integer"}},{"name":"sort_order","in":"query","description":"Filter by priority (sort_order, exact).","schema":{"type":"integer"}},{"name":"starts_from_from","in":"query","description":"Start date >= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"starts_from_to","in":"query","description":"Start date <= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"ends_till_from","in":"query","description":"End date >= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"ends_till_to","in":"query","description":"End date <= (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name","sort_order"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope. conditions / channels / customerGroups are detail-only and null on list rows.","content":{"application/json":{"example":{"data":[{"id":126,"name":"Summer Collection 10% Off","description":"Sitewide 10% off the summer collection","startsFrom":null,"endsTill":null,"status":1,"sortOrder":0,"conditionType":1,"conditions":null,"endOtherRules":0,"actionType":"by_percent","discountAmount":10,"channels":null,"customerGroups":null,"createdAt":"2026-06-17T12:13:15+05:30","updatedAt":"2026-06-17T12:13:15+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":38,"total":38,"from":1,"to":1}}}}}},"operationId":"api_apiadminmarketingcatalog-rules_get_collection"},"post":{"tags":["Admin Marketing: Promotions"],"summary":"Create a catalog rule","description":"Create a catalog rule","requestBody":{"description":"The new AdminMarketingCatalogRule resource","content":{"application/json":{"schema":{"type":"object","required":["name","channels","customer_groups","action_type","discount_amount"],"properties":{"name":{"type":"string","example":"Summer 10% off"},"description":{"type":"string","example":"Sitewide 10% off summer collection"},"starts_from":{"type":"string","example":"2026-06-01"},"ends_till":{"type":"string","example":"2026-08-31"},"status":{"type":"integer","example":1},"sort_order":{"type":"integer","example":0},"condition_type":{"type":"integer","example":1},"conditions":{"type":"array","items":{"type":"object"},"example":[]},"end_other_rules":{"type":"integer","example":0},"action_type":{"type":"string","example":"by_percent"},"discount_amount":{"type":"number","example":10},"channels":{"type":"array","items":{"type":"integer"},"description":"Assigned channel ids (request stays id-based; the response returns objects).","example":[1]},"customer_groups":{"type":"array","items":{"type":"integer"},"description":"Assigned customer-group ids (request stays id-based; the response returns objects).","example":[1,2]}}}}},"required":true},"responses":{"201":{"description":"Catalog rule created.","content":{"application/json":{"example":{"id":126,"name":"Summer Collection 10% Off","description":"Sitewide 10% off the summer collection","startsFrom":null,"endsTill":null,"status":1,"sortOrder":0,"conditionType":1,"conditions":[],"endOtherRules":0,"actionType":"by_percent","discountAmount":10,"channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":1,"code":"guest","name":"Guest"},{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-17T12:13:15+05:30","updatedAt":"2026-06-17T12:13:15+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcatalog-rules_post"}},"/marketing/catalog-rules/{id}":{"get":{"tags":["Admin Marketing: Promotions"],"summary":"Catalog rule detail","description":"Catalog rule detail","parameters":[{"name":"id","in":"path","description":"Marketing catalog rule ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single catalog rule with channels + customerGroups (object arrays) + conditions.","content":{"application/json":{"example":{"id":126,"name":"Summer Collection 10% Off","description":"Sitewide 10% off the summer collection","startsFrom":null,"endsTill":null,"status":1,"sortOrder":0,"conditionType":1,"conditions":[],"endOtherRules":0,"actionType":"by_percent","discountAmount":10,"channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-17T12:13:15+05:30","updatedAt":"2026-06-17T12:13:15+05:30"}}}},"404":{"description":"Catalog rule not found."}},"operationId":"api_apiadminmarketingcatalog-rules_id_get"},"put":{"tags":["Admin Marketing: Promotions"],"summary":"Update a catalog rule","description":"Partial update \u2014 send only the fields you change. channels + customer_groups, when supplied, fully replace the current pivots.","parameters":[{"name":"id","in":"path","description":"Marketing catalog rule ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingCatalogRule resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Summer 15% off"},"description":{"type":"string","example":"Updated description"},"channels":{"type":"array","items":{"type":"integer"},"example":[1]},"customer_groups":{"type":"array","items":{"type":"integer"},"example":[1,2]},"condition_type":{"type":"integer","enum":[1,2],"example":1},"conditions":{"type":"array","items":{"type":"object"},"example":[{"attribute":"product|category_ids","operator":"{}","value":"5","attribute_type":"select"}]},"end_other_rules":{"type":"integer","enum":[0,1],"example":0},"action_type":{"type":"string","enum":["by_percent","by_fixed"],"example":"by_percent"},"discount_amount":{"type":"number","example":15},"sort_order":{"type":"integer","example":0},"starts_from":{"type":"string","example":"2026-06-01"},"ends_till":{"type":"string","example":"2026-08-31"},"status":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"Catalog rule updated; returns the updated detail.","content":{"application/json":{"example":{"id":126,"name":"Summer 15% off","description":"Updated description","startsFrom":null,"endsTill":null,"status":1,"sortOrder":0,"conditionType":1,"conditions":[],"endOtherRules":0,"actionType":"by_percent","discountAmount":15,"channels":[{"id":1,"code":"default","name":"Default"}],"customerGroups":[{"id":1,"code":"guest","name":"Guest"},{"id":2,"code":"general","name":"General"}],"createdAt":"2026-06-17T12:13:15+05:30","updatedAt":"2026-06-17T13:01:42+05:30"}}}},"404":{"description":"Catalog rule not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcatalog-rules_id_put"},"delete":{"tags":["Admin Marketing: Promotions"],"summary":"Delete a catalog rule","description":"Delete a catalog rule","parameters":[{"name":"id","in":"path","description":"Marketing catalog rule ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Catalog rule deleted.","content":{"application/json":{"example":{"message":"Catalog rule deleted."}}}},"404":{"description":"Catalog rule not found."}},"operationId":"api_apiadminmarketingcatalog-rules_id_delete"}},"/marketing/catalog-rules/mass-delete":{"post":{"tags":["Admin Marketing: Promotions"],"summary":"Mass delete catalog rules","description":"Deletes a batch of catalog rules. Non-existent IDs are silently skipped.","requestBody":{"description":"The new AdminMarketingCatalogRuleMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"Catalog rules deleted.","content":{"application/json":{"example":{"deleted":[12,18],"skipped":[],"message":"Catalog rules deleted."}}}},"422":{"description":"Empty indices."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingcatalog-rulesmass-delete_post"}},"/marketing/events":{"get":{"tags":["Admin Marketing: Communications"],"summary":"List marketing events","description":"Filters: name (LIKE), date_from, date_to. Sort: id (default desc), name, date.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"date_from","in":"query","description":"Event date range lower bound (Y-m-d).","schema":{"type":"string"}},{"name":"date_to","in":"query","description":"Event date range upper bound (Y-m-d).","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name","date"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":14,"name":"Holiday Sale Kickoff","description":"Email blast to all subscribers.","date":"2026-12-20","createdAt":"2026-05-28T10:57:24+05:30","updatedAt":"2026-05-28T10:57:24+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":3,"from":1,"to":3}}}}}},"operationId":"api_apiadminmarketingevents_get_collection"},"post":{"tags":["Admin Marketing: Communications"],"summary":"Create a marketing event","description":"Create a marketing event","requestBody":{"description":"The new AdminMarketingEvent resource","content":{"application/json":{"schema":{"type":"object","required":["name","description","date"],"properties":{"name":{"type":"string","example":"Holiday Sale Kickoff"},"description":{"type":"string","example":"Email blast to all subscribers."},"date":{"type":"string","example":"2026-12-20"}}}}},"required":true},"responses":{"201":{"description":"Marketing event created.","content":{"application/json":{"example":{"id":14,"name":"Holiday Sale Kickoff","description":"Email blast to all subscribers.","date":"2026-12-20","createdAt":"2026-05-28T10:57:24+05:30","updatedAt":"2026-05-28T10:57:24+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingevents_post"}},"/marketing/events/{id}":{"get":{"tags":["Admin Marketing: Communications"],"summary":"Marketing event detail","description":"Marketing event detail","parameters":[{"name":"id","in":"path","description":"Marketing event ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single marketing event.","content":{"application/json":{"example":{"id":14,"name":"Holiday Sale Kickoff","description":"Email blast to all subscribers.","date":"2026-12-20","createdAt":"2026-05-28T10:57:24+05:30","updatedAt":"2026-05-28T10:57:24+05:30"}}}},"404":{"description":"Marketing event not found."}},"operationId":"api_apiadminmarketingevents_id_get"},"put":{"tags":["Admin Marketing: Communications"],"summary":"Update a marketing event","description":"Update a marketing event","parameters":[{"name":"id","in":"path","description":"Marketing event ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingEvent resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Holiday Sale Kickoff"},"description":{"type":"string","example":"Email blast to all subscribers."},"date":{"type":"string","example":"2026-08-01"}}}}},"required":true},"responses":{"200":{"description":"Marketing event updated.","content":{"application/json":{"example":{"id":14,"name":"Holiday Sale Kickoff","description":"Email blast to all subscribers.","date":"2026-08-01","createdAt":"2026-05-28T10:57:24+05:30","updatedAt":"2026-06-10T09:20:11+05:30"}}}},"404":{"description":"Marketing event not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingevents_id_put"},"delete":{"tags":["Admin Marketing: Communications"],"summary":"Delete a marketing event","description":"Delete a marketing event","parameters":[{"name":"id","in":"path","description":"Marketing event ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Marketing event deleted.","content":{"application/json":{"example":{"message":"Marketing event deleted."}}}},"404":{"description":"Marketing event not found."}},"operationId":"api_apiadminmarketingevents_id_delete"}},"/marketing/search-synonyms":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"List search synonyms","description":"Filters: name (LIKE), terms (LIKE). Sort: id (default desc), name.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"terms","in":"query","description":"Partial terms match.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":19,"name":"shirt-group","terms":"shirt,tshirt,tee","createdAt":"2026-05-28T10:57:59+05:30","updatedAt":"2026-05-28T10:57:59+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":3,"from":1,"to":3}}}}}},"operationId":"api_apiadminmarketingsearch-synonyms_get_collection"},"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Create a search synonym","description":"Create a search synonym","requestBody":{"description":"The new AdminMarketingSearchSynonym resource","content":{"application/json":{"schema":{"type":"object","required":["name","terms"],"properties":{"name":{"type":"string","example":"shirt-group"},"terms":{"type":"string","example":"shirt,tshirt,tee"}}}}},"required":true},"responses":{"201":{"description":"Search synonym created.","content":{"application/json":{"example":{"id":19,"name":"shirt-group","terms":"shirt,tshirt,tee","createdAt":"2026-05-28T10:57:59+05:30","updatedAt":"2026-05-28T10:57:59+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsearch-synonyms_post"}},"/marketing/search-synonyms/{id}":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"Search synonym detail","description":"Search synonym detail","parameters":[{"name":"id","in":"path","description":"Marketing search synonym ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single search synonym.","content":{"application/json":{"example":{"id":19,"name":"shirt-group","terms":"shirt,tshirt,tee","createdAt":"2026-05-28T10:57:59+05:30","updatedAt":"2026-05-28T10:57:59+05:30"}}}},"404":{"description":"Search synonym not found."}},"operationId":"api_apiadminmarketingsearch-synonyms_id_get"},"put":{"tags":["Admin Marketing: Search & SEO"],"summary":"Update a search synonym","description":"Update a search synonym","parameters":[{"name":"id","in":"path","description":"Marketing search synonym ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingSearchSynonym resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"shirt-group"},"terms":{"type":"string","example":"shirt,tshirt,tee"}}}}},"required":true},"responses":{"200":{"description":"Search synonym updated.","content":{"application/json":{"example":{"id":19,"name":"shirt-group","terms":"shirt,tshirt,tee","createdAt":"2026-05-28T10:57:59+05:30","updatedAt":"2026-05-28T10:57:59+05:30"}}}},"404":{"description":"Search synonym not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsearch-synonyms_id_put"},"delete":{"tags":["Admin Marketing: Search & SEO"],"summary":"Delete a search synonym","description":"Delete a search synonym","parameters":[{"name":"id","in":"path","description":"Marketing search synonym ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Search synonym deleted.","content":{"application/json":{"example":{"message":"Search synonym deleted."}}}},"404":{"description":"Search synonym not found."}},"operationId":"api_apiadminmarketingsearch-synonyms_id_delete"}},"/marketing/search-synonyms/mass-delete":{"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Mass delete search synonyms","description":"Deletes a batch of search synonyms. Non-existent IDs are silently skipped (mirrors monolith).","requestBody":{"description":"The new AdminMarketingSearchSynonymMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"Search synonyms deleted.","content":{"application/json":{"example":{"deleted":[12,18],"skipped":[],"message":"Search synonyms deleted."}}}},"422":{"description":"Validation failure (empty/missing indices)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsearch-synonymsmass-delete_post"}},"/marketing/search-terms/{id}":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"Search term detail","description":"Search term detail","parameters":[{"name":"id","in":"path","description":"Search term ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Single search term.","content":{"application/json":{"example":{"id":106,"term":"Coastal Breeze QA","results":1,"uses":3,"redirectUrl":"https://example.com/qa","channel":{"id":1,"code":"default","name":"Default"},"locale":"en","createdAt":"2026-06-03T13:14:05+05:30","updatedAt":"2026-06-17T12:14:07+05:30"}}}},"404":{"description":"Search term not found."}},"operationId":"api_apiadminmarketingsearch-terms_id_get"},"put":{"tags":["Admin Marketing: Search & SEO"],"summary":"Update a search term","description":"Admin can edit the term text and optional redirect URL. Counts (uses/results) are not editable.","parameters":[{"name":"id","in":"path","description":"Search term ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminMarketingSearchTerm resource","content":{"application/json":{"schema":{"type":"object","required":["term"],"properties":{"term":{"type":"string","example":"red shirt"},"redirect_url":{"type":"string","nullable":true,"example":"https://example.com/shirts"}}}}},"required":true},"responses":{"200":{"description":"Search term updated; returns the updated detail.","content":{"application/json":{"example":{"id":106,"term":"Coastal Breeze QA","results":1,"uses":3,"redirectUrl":"https://example.com/qa","channel":{"id":1,"code":"default","name":"Default"},"locale":"en","createdAt":"2026-06-03T13:14:05+05:30","updatedAt":"2026-06-17T12:14:07+05:30"}}}},"404":{"description":"Search term not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsearch-terms_id_put"},"delete":{"tags":["Admin Marketing: Search & SEO"],"summary":"Delete a search term","description":"Delete a search term","parameters":[{"name":"id","in":"path","description":"Search term ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"example":{"message":"Search term deleted."}}}},"404":{"description":"Not found."}},"operationId":"api_apiadminmarketingsearch-terms_id_delete"}},"/marketing/search-terms":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"List search terms","description":"Paginated, filterable, sortable list. Sort by uses desc for popular terms. Returns { data, meta } envelope.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"term","in":"query","description":"Term LIKE filter","schema":{"type":"string"}},{"name":"channel_id","in":"query","description":"Filter by channel id","schema":{"type":"integer"}},{"name":"locale","in":"query","description":"Filter by locale code","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","term","uses","results"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":106,"term":"Coastal Breeze QA","results":1,"uses":3,"redirectUrl":"https://example.com/qa","channel":{"id":1,"code":"default","name":"Default"},"locale":"en","createdAt":"2026-06-03T13:14:05+05:30","updatedAt":"2026-06-17T12:14:07+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":11,"total":103,"from":1,"to":10}}}}}},"operationId":"api_apiadminmarketingsearch-terms_get_collection"}},"/marketing/search-terms/mass-delete":{"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Mass delete search terms","description":"Deletes a batch of search terms. Non-existent IDs are silently skipped (mirrors monolith).","requestBody":{"description":"The new AdminMarketingSearchTermMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"Search terms deleted.","content":{"application/json":{"example":{"deleted":[12,18],"skipped":[],"message":"Search terms deleted."}}}},"422":{"description":"Validation failed (e.g. empty indices)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsearch-termsmass-delete_post"}},"/marketing/sitemaps":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"List sitemaps","description":"Filters: file_name (LIKE). Sort: id (default desc), file_name.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"file_name","in":"query","description":"Partial file_name match.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","file_name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope. indexFile / generatedSitemaps are detail-only and null on list rows.","content":{"application/json":{"example":{"data":[{"id":1,"fileName":"sitemap.xml","path":"/","generatedAt":null,"indexFile":null,"generatedSitemaps":null,"createdAt":"2026-06-20T10:00:00+05:30","updatedAt":"2026-06-20T10:00:00+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminmarketingsitemaps_get_collection"},"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Create a sitemap","description":"Create a sitemap","requestBody":{"description":"The new AdminMarketingSitemap resource","content":{"application/json":{"schema":{"type":"object","required":["file_name","path"],"properties":{"file_name":{"type":"string","example":"sitemap.xml"},"path":{"type":"string","example":"/"}}}}},"required":true},"responses":{"201":{"description":"Sitemap created. Use POST /generate to build the XML.","content":{"application/json":{"example":{"id":1,"fileName":"sitemap.xml","path":"/","generatedAt":null,"indexFile":null,"generatedSitemaps":[],"createdAt":"2026-06-20T10:00:00+05:30","updatedAt":"2026-06-20T10:00:00+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsitemaps_post"}},"/marketing/sitemaps/{id}":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"Sitemap detail","description":"Sitemap detail","parameters":[{"name":"id","in":"path","description":"Marketing sitemap ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sitemap row with generated_at and generated index/sitemap file paths.","content":{"application/json":{"example":{"id":1,"fileName":"sitemap.xml","path":"/","generatedAt":"2026-06-23T13:00:00+05:30","indexFile":"/sitemap.xml","generatedSitemaps":["/sitemap-products-1.xml","/sitemap-categories-1.xml"],"createdAt":"2026-06-20T10:00:00+05:30","updatedAt":"2026-06-23T13:05:00+05:30"}}}},"404":{"description":"Sitemap not found."}},"operationId":"api_apiadminmarketingsitemaps_id_get"},"put":{"tags":["Admin Marketing: Search & SEO"],"summary":"Update a sitemap","description":"Update a sitemap","parameters":[{"name":"id","in":"path","description":"Marketing sitemap ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingSitemap resource","content":{"application/json":{"schema":{"type":"object","properties":{"file_name":{"type":"string","example":"sitemap.xml"},"path":{"type":"string","example":"/"}}}}},"required":true},"responses":{"200":{"description":"Sitemap updated.","content":{"application/json":{"example":{"id":1,"fileName":"sitemap.xml","path":"/","generatedAt":"2026-06-23T13:00:00+05:30","indexFile":"/sitemap.xml","generatedSitemaps":["/sitemap-products-1.xml","/sitemap-categories-1.xml"],"createdAt":"2026-06-20T10:00:00+05:30","updatedAt":"2026-06-23T13:05:00+05:30"}}}},"404":{"description":"Sitemap not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsitemaps_id_put"},"delete":{"tags":["Admin Marketing: Search & SEO"],"summary":"Delete a sitemap (removes the DB row and generated XML files).","description":"Delete a sitemap (removes the DB row and generated XML files).","parameters":[{"name":"id","in":"path","description":"Marketing sitemap ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Sitemap deleted.","content":{"application/json":{"example":{"message":"Sitemap deleted."}}}},"404":{"description":"Sitemap not found."}},"operationId":"api_apiadminmarketingsitemaps_id_delete"}},"/marketing/sitemaps/{id}/generate":{"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Regenerate a sitemap","description":"Walks every public Category / Product / Page and (re)writes the XML files under the public disk.","parameters":[{"name":"id","in":"path","description":"Marketing sitemap generate ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminMarketingSitemapGenerate resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Sitemap regenerated.","content":{"application/json":{"example":{"sitemapId":1,"indexFile":"/sitemap.xml","generatedSitemaps":["/sitemap-products-1.xml","/sitemap-categories-1.xml"],"generatedAt":"2026-06-23T13:00:00+05:30","message":"Sitemap generated."}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks marketing.search_seo.sitemaps.edit."},"404":{"description":"Sitemap not found."},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminmarketingsitemaps_idgenerate_post"}},"/marketing/subscribers/{id}":{"get":{"tags":["Admin Marketing: Communications"],"summary":"Subscription detail","description":"Subscription detail","parameters":[{"name":"id","in":"path","description":"Subscriber ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Subscriber detail.","content":{"application/json":{"example":{"id":26,"email":"ddd@gmail.com","isSubscribed":true,"customerId":null,"customerName":null,"channel":{"id":1,"code":"default","name":"Default"},"createdAt":"2025-12-30T18:32:42+05:30","updatedAt":"2026-06-17T12:14:15+05:30"}}}},"404":{"description":"Subscriber not found."}},"operationId":"api_apiadminmarketingsubscribers_id_get"},"put":{"tags":["Admin Marketing: Communications"],"summary":"Toggle a newsletter subscription","description":"Sets is_subscribed for the subscriber row and mirrors the flag onto the linked customer (if any).","parameters":[{"name":"id","in":"path","description":"Subscriber ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminMarketingSubscriber resource","content":{"application/json":{"schema":{"type":"object","required":["is_subscribed"],"properties":{"is_subscribed":{"type":"boolean","example":false}}}}},"required":true},"responses":{"200":{"description":"Subscription updated.","content":{"application/json":{"example":{"id":26,"email":"ddd@gmail.com","isSubscribed":false,"customerId":null,"customerName":null,"channel":{"id":1,"code":"default","name":"Default"},"createdAt":"2025-12-30T18:32:42+05:30","updatedAt":"2026-06-17T12:14:15+05:30"}}}},"404":{"description":"Subscriber not found."},"422":{"description":"Validation failed (is_subscribed required)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingsubscribers_id_put"},"delete":{"tags":["Admin Marketing: Communications"],"summary":"Delete a subscription","description":"Delete a subscription","parameters":[{"name":"id","in":"path","description":"Subscriber ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Subscriber deleted.","content":{"application/json":{"example":{"message":"Subscriber deleted."}}}},"404":{"description":"Subscriber not found."}},"operationId":"api_apiadminmarketingsubscribers_id_delete"}},"/marketing/subscribers":{"get":{"tags":["Admin Marketing: Communications"],"summary":"List newsletter subscribers","description":"Paginated, filterable, sortable list. Returns { data, meta } envelope.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"email","in":"query","description":"Email LIKE filter","schema":{"type":"string"}},{"name":"channel_id","in":"query","description":"Filter by channel id","schema":{"type":"integer"}},{"name":"is_subscribed","in":"query","description":"0 or 1","schema":{"type":"integer"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","email"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated subscriber list.","content":{"application/json":{"example":{"data":[{"id":26,"email":"ddd@gmail.com","isSubscribed":true,"customerId":null,"customerName":null,"channel":null,"createdAt":"2025-12-30T18:32:42+05:30","updatedAt":"2026-06-17T12:14:15+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":3,"total":25,"from":1,"to":10}}}}}},"operationId":"api_apiadminmarketingsubscribers_get_collection"}},"/marketing/templates":{"get":{"tags":["Admin Marketing: Communications"],"summary":"List email templates","description":"Filters: name (LIKE), status. Sort: id (default desc), name.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Status filter.","schema":{"type":"string","enum":["active","inactive","draft"]}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":21,"name":"Welcome Email","status":"active","content":"<p>Welcome to our store!</p>","createdAt":"2026-05-28T10:57:33+05:30","updatedAt":"2026-05-28T10:57:33+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":4,"from":1,"to":4}}}}}},"operationId":"api_apiadminmarketingtemplates_get_collection"},"post":{"tags":["Admin Marketing: Communications"],"summary":"Create an email template","description":"Create an email template","requestBody":{"description":"The new AdminMarketingTemplate resource","content":{"application/json":{"schema":{"type":"object","required":["name","status","content"],"properties":{"name":{"type":"string","example":"Welcome Email"},"status":{"type":"string","enum":["active","inactive","draft"],"example":"active"},"content":{"type":"string","example":"<p>Welcome to our store!</p>"}}}}},"required":true},"responses":{"201":{"description":"Template created.","content":{"application/json":{"example":{"id":21,"name":"Welcome Email","status":"active","content":"<p>Welcome to our store!</p>","createdAt":"2026-05-28T10:57:33+05:30","updatedAt":"2026-05-28T10:57:33+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingtemplates_post"}},"/marketing/templates/{id}":{"get":{"tags":["Admin Marketing: Communications"],"summary":"Email template detail","description":"Email template detail","parameters":[{"name":"id","in":"path","description":"Marketing template ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single template with content.","content":{"application/json":{"example":{"id":21,"name":"Welcome Email","status":"active","content":"<p>Welcome to our store!</p>","createdAt":"2026-05-28T10:57:33+05:30","updatedAt":"2026-05-28T10:57:33+05:30"}}}},"404":{"description":"Template not found."}},"operationId":"api_apiadminmarketingtemplates_id_get"},"put":{"tags":["Admin Marketing: Communications"],"summary":"Update an email template","description":"Update an email template","parameters":[{"name":"id","in":"path","description":"Marketing template ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingTemplate resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Welcome Email"},"status":{"type":"string","enum":["active","inactive","draft"],"example":"active"},"content":{"type":"string","example":"<p>Welcome to our store!</p>"}}}}},"required":true},"responses":{"200":{"description":"Template updated; returns the updated detail.","content":{"application/json":{"example":{"id":21,"name":"Welcome Email","status":"active","content":"<p>Welcome to our store!</p>","createdAt":"2026-05-28T10:57:33+05:30","updatedAt":"2026-05-28T10:57:33+05:30"}}}},"404":{"description":"Template not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingtemplates_id_put"},"delete":{"tags":["Admin Marketing: Communications"],"summary":"Delete an email template","description":"Delete an email template","parameters":[{"name":"id","in":"path","description":"Marketing template ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"example":{"message":"Email template deleted."}}}},"404":{"description":"Template not found."}},"operationId":"api_apiadminmarketingtemplates_id_delete"}},"/marketing/url-rewrites":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"List URL rewrites","description":"Filters: entity_type, request_path (LIKE), redirect_type, locale. Sort: id (default desc), entity_type, locale, redirect_type.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"entity_type","in":"query","description":"Entity type filter (product|category|cms_page).","schema":{"type":"string"}},{"name":"request_path","in":"query","description":"Partial match on request_path.","schema":{"type":"string"}},{"name":"redirect_type","in":"query","description":"Redirect type filter (301|302).","schema":{"type":"string"}},{"name":"locale","in":"query","description":"Locale filter.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","entity_type","locale","redirect_type"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":118,"entityType":"cms_page","requestPath":"cms-test","targetPath":"testing","redirectType":"301","locale":"en","createdAt":"2026-06-23T12:32:58+05:30","updatedAt":"2026-06-23T12:32:58+05:30"}],"meta":{"currentPage":1,"perPage":10,"lastPage":8,"total":78,"from":1,"to":10}}}}}},"operationId":"api_apiadminmarketingurl-rewrites_get_collection"},"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Create a URL rewrite","description":"Create a URL rewrite","requestBody":{"description":"The new AdminMarketingUrlRewrite resource","content":{"application/json":{"schema":{"type":"object","required":["entity_type","request_path","target_path","redirect_type","locale"],"properties":{"entity_type":{"type":"string","enum":["product","category","cms_page"],"example":"product"},"request_path":{"type":"string","example":"old-path"},"target_path":{"type":"string","example":"new-path"},"redirect_type":{"type":"string","enum":["301","302"],"example":"301"},"locale":{"type":"string","example":"en"}}}}},"required":true},"responses":{"201":{"description":"URL rewrite created.","content":{"application/json":{"example":{"id":118,"entityType":"cms_page","requestPath":"cms-test","targetPath":"testing","redirectType":"301","locale":"en","createdAt":"2026-06-23T12:32:58+05:30","updatedAt":"2026-06-23T12:32:58+05:30"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingurl-rewrites_post"}},"/marketing/url-rewrites/{id}":{"get":{"tags":["Admin Marketing: Search & SEO"],"summary":"URL rewrite detail","description":"URL rewrite detail","parameters":[{"name":"id","in":"path","description":"Marketing url rewrite ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single URL rewrite.","content":{"application/json":{"example":{"id":118,"entityType":"cms_page","requestPath":"cms-test","targetPath":"testing","redirectType":"301","locale":"en","createdAt":"2026-06-23T12:32:58+05:30","updatedAt":"2026-06-23T12:32:58+05:30"}}}},"404":{"description":"URL rewrite not found."}},"operationId":"api_apiadminmarketingurl-rewrites_id_get"},"put":{"tags":["Admin Marketing: Search & SEO"],"summary":"Update a URL rewrite","description":"Update a URL rewrite","parameters":[{"name":"id","in":"path","description":"Marketing url rewrite ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminMarketingUrlRewrite resource","content":{"application/json":{"schema":{"type":"object","properties":{"entity_type":{"type":"string","enum":["product","category","cms_page"],"example":"product"},"request_path":{"type":"string","example":"old-path"},"target_path":{"type":"string","example":"new-path"},"redirect_type":{"type":"string","enum":["301","302"],"example":"301"},"locale":{"type":"string","example":"en"}}}}},"required":true},"responses":{"200":{"description":"URL rewrite updated.","content":{"application/json":{"example":{"id":118,"entityType":"cms_page","requestPath":"cms-test","targetPath":"testing","redirectType":"301","locale":"en","createdAt":"2026-06-23T12:32:58+05:30","updatedAt":"2026-06-23T12:32:58+05:30"}}}},"404":{"description":"URL rewrite not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingurl-rewrites_id_put"},"delete":{"tags":["Admin Marketing: Search & SEO"],"summary":"Delete a URL rewrite","description":"Delete a URL rewrite","parameters":[{"name":"id","in":"path","description":"Marketing url rewrite ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"URL rewrite deleted.","content":{"application/json":{"example":{"message":"URL rewrite deleted."}}}},"404":{"description":"URL rewrite not found."}},"operationId":"api_apiadminmarketingurl-rewrites_id_delete"}},"/marketing/url-rewrites/mass-delete":{"post":{"tags":["Admin Marketing: Search & SEO"],"summary":"Mass delete URL rewrites","description":"Deletes a batch of URL rewrites. Non-existent IDs are silently skipped (mirrors monolith).","requestBody":{"description":"The new AdminMarketingUrlRewriteMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[12,18]}}}}},"required":true},"responses":{"200":{"description":"URL rewrites deleted.","content":{"application/json":{"example":{"deleted":[12,18],"skipped":[],"message":"URL rewrites deleted."}}}},"422":{"description":"Validation failure (empty/missing indices)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminmarketingurl-rewritesmass-delete_post"}},"/menu":{"get":{"tags":["Admin Menu"],"summary":"Admin navigation menu","description":"Returns the admin sidebar menu as a nested tree, filtered to what the authenticated token's admin role is allowed to see. Each node carries its label, ACL permission key, hierarchy, and a mapping to the matching API resource (REST path + GraphQL field), or `apiResource: null` for group headers and panel-only screens that have no API endpoint.","responses":{"200":{"description":"The permission-filtered admin menu tree.","content":{"application/json":{"example":[{"id":"menu","tree":[{"key":"sales","label":"Sales","icon":"icon-sales","sort":2,"permission":"sales","apiResource":null,"children":[{"key":"sales.orders","label":"Orders","icon":null,"sort":1,"permission":"sales.orders","apiResource":{"rest":"/api/admin/orders","graphql":"adminOrders"},"children":[]}]}]}]}}},"401":{"description":"Missing or invalid admin token."}},"operationId":"api_apiadminmenu_get_collection"}},"/orders":{"get":{"tags":["Admin Sales: Orders"],"summary":"List orders","description":"Paginated, filterable list of all orders across every customer. Returns a slim row per order in a `{ data, meta }` envelope; use the order detail and sub-resources for items / invoices / shipments.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (max 50)","schema":{"type":"integer","example":10}},{"name":"order_id","in":"query","description":"Filter by order increment ID (partial match)","schema":{"type":"string"}},{"name":"status","in":"query","description":"Filter by status","schema":{"type":"string","enum":["pending","pending_payment","processing","completed","canceled","closed","fraud"]}},{"name":"grand_total","in":"query","description":"Filter by base grand total (exact)","schema":{"type":"number"}},{"name":"grand_total_from","in":"query","description":"Filter by base grand total (minimum)","schema":{"type":"number"}},{"name":"grand_total_to","in":"query","description":"Filter by base grand total (maximum)","schema":{"type":"number"}},{"name":"channel","in":"query","description":"Filter by channel ID","schema":{"type":"integer"}},{"name":"customer","in":"query","description":"Filter by customer name (partial match)","schema":{"type":"string"}},{"name":"email","in":"query","description":"Filter by customer email (partial match)","schema":{"type":"string"}},{"name":"date_range","in":"query","description":"Date preset (matches the admin datagrid)","schema":{"type":"string","enum":["today","yesterday","this_week","this_month","last_month","last_three_months","last_six_months","this_year"]}},{"name":"date_from","in":"query","description":"Custom range start (Y-m-d)","schema":{"type":"string","format":"date"}},{"name":"date_to","in":"query","description":"Custom range end (Y-m-d)","schema":{"type":"string","format":"date"}},{"name":"sort","in":"query","description":"Sort field","schema":{"type":"string","example":"created_at"}},{"name":"order","in":"query","description":"Sort direction","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of orders in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":2392,"incrementId":"2392","status":"processing","statusLabel":"Processing","channelId":1,"channelName":"bagisto store","isGuest":false,"customerId":19,"customerEmail":"admin@example.com","customerName":"Test User","paymentTitle":"Money Transfer","couponCode":null,"totalItemCount":1,"totalQtyOrdered":1,"orderCurrencyCode":"USD","grandTotal":4000,"baseGrandTotal":4000,"formattedGrandTotal":"$4,000.00","location":"New York, NY, US","createdAt":"2026-05-19 13:13:29","updatedAt":"2026-05-19 13:13:30","items":[{"id":2694,"sku":"test65","name":"Classic Watch Hand","qtyOrdered":1,"productImage":"http://localhost:8000/storage/product/2358/example.webp"}]}],"meta":{"currentPage":1,"perPage":10,"lastPage":62,"total":616,"from":1,"to":10}}}}}},"operationId":"api_apiadminorders_get_collection"}},"/orders/export":{"get":{"tags":["Admin Sales: Orders"],"summary":"Export orders as csv, xls or xlsx","description":"Downloads the orders datagrid as a csv, xls or xlsx file \u2014 the same data the admin Export button produces. Honours the same filters as the listing. Binary download, not JSON. Pick the file type with ?format=csv|xls|xlsx (default csv).","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}}],"responses":{"200":{"description":"Export file downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks the view permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadminordersexport_get"}},"/orders/{orderId}/comments":{"get":{"tags":["Admin Sales: Orders"],"summary":"List comments on an order","description":"Returns all comments newest-first in a `{ data, meta }` envelope.","parameters":[{"name":"orderId","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"AdminOrderComment collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminorders_orderIdcomments_get_collection"},"post":{"tags":["Admin Sales: Orders"],"summary":"Add a comment to an order","description":"Persists an order comment. When `customerNotified=true` core listeners send the customer email.","parameters":[{"name":"orderId","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminOrderComment resource","content":{"application/json":{"schema":{"type":"object"},"example":{"comment":"Customer called to confirm shipping address.","customerNotified":true}}},"required":true},"responses":{"201":{"description":"AdminOrderComment resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminorders_orderIdcomments_post"}},"/permissions":{"get":{"tags":["Admin Menu"],"summary":"Authenticated admin permissions","description":"Returns the effective permission set for the authenticated token: `permissionType` (`all` / `custom` / `same_as_web`) and the granted `permissions` keys (capped by the admin's role). `permissionType: \"all\"` returns `permissions: [\"*\"]` (full access). Use this to gate UI actions without trial-and-error 403s.","responses":{"200":{"description":"The token's effective permissions.","content":{"application/json":{"example":[{"id":"permissions","permissionType":"custom","permissions":["catalog","catalog.products","sales.orders"]}]}}},"401":{"description":"Missing or invalid admin token."}},"operationId":"api_apiadminpermissions_get_collection"}},"/orders/place/{cartId}":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Place an order from a draft cart","description":"Finalises the given draft cart into an order. Mirrors the monolith `admin.sales.orders.store` flow. Returns 409 if a prerequisite (addresses / shipping / payment method) is missing, and 422 if the payment method is not in `['cashondelivery', 'moneytransfer']`.","parameters":[{"name":"cartId","in":"path","description":"Draft Cart ID","required":true,"schema":{"type":"integer"}}],"requestBody":[],"responses":{"201":{"description":"Order placed.","content":{"application/json":{"example":{"orderId":1284,"incrementId":"1000001284","customerId":7,"grandTotal":149.99,"success":true,"message":"Order placed successfully."}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminordersplace_cartId_post"}},"/products":{"get":{"tags":["Admin Products"],"summary":"Search/list products (admin)","description":"Paginated, filterable product list for admin pickers. Returns ALL statuses (disabled/draft included) unless filtered. Supports booking products. Returns slim rows in a `{ data, meta }` envelope.","parameters":[{"name":"page","in":"query","description":"Page number","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (max 50, default 30)","schema":{"type":"integer","example":30}},{"name":"query","in":"query","description":"Search term \u2014 matches product name OR SKU (partial match).","schema":{"type":"string"}},{"name":"sku","in":"query","description":"Exact SKU match.","schema":{"type":"string"}},{"name":"type","in":"query","description":"Filter by product type.","schema":{"type":"string","enum":["simple","configurable","bundle","downloadable","grouped","virtual","booking"]}},{"name":"status","in":"query","description":"Filter by status (0=disabled, 1=enabled).","schema":{"type":"integer","enum":[0,1]}},{"name":"categoryId","in":"query","description":"Filter by category ID.","schema":{"type":"integer"}},{"name":"channel","in":"query","description":"Channel code for value resolution.","schema":{"type":"string"}},{"name":"locale","in":"query","description":"Locale code for value resolution.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort field.","schema":{"type":"string","enum":["id","sku","created_at","updated_at"],"example":"created_at"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of admin product rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":142,"sku":"SP-001","type":"simple","name":"Classic Watch","status":1,"price":99.99,"formattedPrice":"$99.99","baseImageUrl":"http://localhost:8000/cache/medium/product/142/image.webp","isSaleable":true}],"meta":{"currentPage":1,"perPage":30,"lastPage":8,"total":231,"from":1,"to":30}}}}}},"operationId":"api_apiadminproducts_get_collection"}},"/get":{"get":{"tags":["Admin Authentication"],"summary":"Get logged-in admin user's details","description":"Returns the profile of the currently authenticated admin. Requires a Bearer token.","responses":{"200":{"description":"The authenticated admin's profile.","content":{"application/json":{"example":[{"id":"1","name":"Example Admin","email":"admin@example.com","image":null,"status":"1","roleId":1,"roleName":"Administrator","success":true,"message":null}]}}}},"operationId":"api_apiadminget_get_collection"}},"/refunds":{"get":{"tags":["Admin Sales: Refunds"],"summary":"List refunds (datagrid parity)","description":"Paginated refunds listing. Every refund column + billing/shipping addresses are populated per row (line items are detail-only). Returns a `{ data, meta }` envelope. Requires `sales.refunds.view`.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"id","in":"query","description":"Filter by refund id (integer or comma-list).","schema":{"type":"string"}},{"name":"order_id","in":"query","description":"Partial order increment_id match.","schema":{"type":"string"}},{"name":"state","in":"query","description":"Refund state.","schema":{"type":"string"}},{"name":"base_grand_total_from","in":"query","description":"Min refunded amount.","schema":{"type":"number"}},{"name":"base_grand_total_to","in":"query","description":"Max refunded amount.","schema":{"type":"number"}},{"name":"billed_to","in":"query","description":"Partial billed-to name match.","schema":{"type":"string"}},{"name":"created_at_from","in":"query","description":"Created after.","schema":{"type":"string","format":"date"}},{"name":"created_at_to","in":"query","description":"Created before.","schema":{"type":"string","format":"date"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","order_id","state","base_grand_total","billed_to","created_at"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"AdminRefund collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminrefunds_get_collection"}},"/refunds/{id}":{"get":{"tags":["Admin Sales: Refunds"],"summary":"Get refund detail","description":"Full single-refund payload \u2014 every refund column (incl. adjustments), order/customer context, payment info, billing & shipping addresses, and embedded line items. Requires `sales.refunds.view`.","parameters":[{"name":"id","in":"path","description":"Refund ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Refund detail.","content":{"application/json":{"example":{"id":1,"orderId":105,"orderIncrementId":"105","state":"refunded","emailSent":true,"totalQty":3,"orderCurrencyCode":"USD","baseCurrencyCode":"USD","channelCurrencyCode":"USD","subTotal":4203,"formattedSubTotal":"$4,203.00","baseSubTotal":4203,"formattedBaseSubTotal":"$4,203.00","subTotalInclTax":4203,"formattedSubTotalInclTax":"$4,203.00","baseSubTotalInclTax":4203,"formattedBaseSubTotalInclTax":"$4,203.00","grandTotal":4233,"formattedGrandTotal":"$4,233.00","baseGrandTotal":4233,"formattedBaseGrandTotal":"$4,233.00","taxAmount":0,"formattedTaxAmount":"$0.00","baseTaxAmount":0,"formattedBaseTaxAmount":"$0.00","discountAmount":0,"formattedDiscountAmount":"$0.00","baseDiscountAmount":0,"formattedBaseDiscountAmount":"$0.00","shippingAmount":30,"formattedShippingAmount":"$30.00","baseShippingAmount":30,"formattedBaseShippingAmount":"$30.00","shippingAmountInclTax":30,"formattedShippingAmountInclTax":"$30.00","baseShippingAmountInclTax":30,"formattedBaseShippingAmountInclTax":"$30.00","shippingTaxAmount":0,"formattedShippingTaxAmount":"$0.00","baseShippingTaxAmount":0,"formattedBaseShippingTaxAmount":"$0.00","adjustmentRefund":0,"formattedAdjustmentRefund":"$0.00","baseAdjustmentRefund":0,"formattedBaseAdjustmentRefund":"$0.00","adjustmentFee":0,"formattedAdjustmentFee":"$0.00","baseAdjustmentFee":0,"formattedBaseAdjustmentFee":"$0.00","createdAt":"2026-05-20 14:00:00","updatedAt":"2026-05-20 14:00:02","billedTo":"John Doe","orderStatus":"closed","orderStatusLabel":"Closed","orderDate":"2026-05-19 16:47:17","channelName":"bagisto store","customerName":"John Doe","customerEmail":"john.doe@example.com","paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","shippingMethod":"flatrate_flatrate","shippingTitle":"Flat Rate - Flat Rate","billingAddress":{"id":493,"addressType":"order_billing","firstName":"John","lastName":"Doe","companyName":"Acme Trades","address":"21 Market Street","city":"Los Angeles","state":"CA","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"shippingAddress":{"id":492,"addressType":"order_shipping","firstName":"John","lastName":"Doe","companyName":"Acme Trades","address":"21 Market Street","city":"Los Angeles","state":"CA","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"items":[{"id":1,"orderItemId":119,"sku":"Nike-Shoes","name":"Nike Shoes","qty":1,"price":123,"formattedPrice":"$123.00","basePrice":123,"basePriceInclTax":123,"total":123,"formattedTotal":"$123.00","baseTotal":123,"baseTotalInclTax":123,"taxAmount":0,"formattedTaxAmount":"$0.00","discountAmount":0,"formattedDiscountAmount":"$0.00","productId":114,"productType":"simple","baseImageUrl":"https://example.com/storage/product/114/nike-shoes.webp","additional":{"locale":"en","quantity":1,"product_id":"114"}}]}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrefunds_id_get"}},"/orders/{orderId}/refunds":{"post":{"tags":["Admin Sales: Orders"],"summary":"Create a refund for an order","description":"Create a refund for an order","parameters":[{"name":"orderId","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminRefund resource","content":{"application/json":{"schema":{"type":"object"},"example":{"items":[{"orderItemId":42,"quantity":1}],"shipping":0,"adjustmentRefund":0,"adjustmentFee":0}}},"required":true},"responses":{"201":{"description":"AdminRefund resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminorders_orderIdrefunds_post"}},"/orders/{orderId}/refunds/preview":{"post":{"tags":["Admin Sales: Orders"],"summary":"Preview refund totals without saving","description":"Preview refund totals without saving","parameters":[{"name":"orderId","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminRefund resource","content":{"application/json":{"schema":{"type":"object"},"example":{"items":[{"orderItemId":42,"quantity":1}],"shipping":0,"adjustmentRefund":0,"adjustmentFee":0}}},"required":true},"responses":{"201":{"description":"AdminRefund resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminorders_orderIdrefundspreview_post"}},"/refunds/export":{"get":{"tags":["Admin Sales: Refunds"],"summary":"Export refunds as csv, xls or xlsx","description":"Downloads the refunds datagrid as a csv, xls or xlsx file \u2014 the same data the admin Refunds \"Export\" button produces (ID, Order ID, Refunded Amount, Billed To, Refund Date). Honours the same filters as the listing (`id`, `order_id`, `state`, `base_grand_total_from`/`_to`, `billed_to`, `created_at_from`/`_to`). The response is a binary download, not JSON. Requires `sales.refunds.view`.","parameters":[{"name":"format","in":"query","description":"Export format: `csv`, `xls` or `xlsx`. Defaults to `csv`.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}},{"name":"id","in":"query","description":"Filter by refund id (integer or comma-list).","schema":{"type":"string"}},{"name":"order_id","in":"query","description":"Partial order increment_id match.","schema":{"type":"string"}},{"name":"state","in":"query","description":"Refund state.","schema":{"type":"string"}},{"name":"base_grand_total_from","in":"query","description":"Min refunded amount.","schema":{"type":"number"}},{"name":"base_grand_total_to","in":"query","description":"Max refunded amount.","schema":{"type":"number"}},{"name":"billed_to","in":"query","description":"Partial billed-to name match.","schema":{"type":"string"}},{"name":"created_at_from","in":"query","description":"Created after.","schema":{"type":"string","format":"date"}},{"name":"created_at_to","in":"query","description":"Created before.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"The refunds export file is downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.refunds.view."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadminrefundsexport_get"}},"/orders/{id}/reorder":{"post":{"tags":["Admin: Customer Order creation"],"summary":"Reorder an order","description":"Builds a fresh admin draft cart from the given order's items and returns the new cart ID. The admin can then finalise the order in `admin.sales.orders.create`. Returns `success: false` if the order can't be reordered (guest order or any item is no longer saleable).","parameters":[{"name":"id","in":"path","description":"Reorder ID","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Reorder accepted; a new draft cart was created.","content":{"application/json":{"example":{"success":true,"message":"Reorder successful. A new draft cart has been created.","cartId":314}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminorders_idreorder_post"}},"/reporting/customers":{"get":{"tags":["Admin Reporting: Customers"],"summary":"Reporting \u2014 customers","description":"Customer reporting stats. `?type=` picks the stat group.","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string","enum":["total-customers","customers-traffic","customers-with-most-sales","customers-with-most-orders","customers-with-most-reviews","top-customer-groups"]}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingCustomers collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingcustomers_get_collection"}},"/reporting/customers/view":{"get":{"tags":["Admin Reporting: Customers"],"summary":"Reporting \u2014 customers (View Details)","description":"The detailed table form of a customer stat (the admin \"View Details\" page). `statistics` is `{ columns, records }`. `?type=` picks the stat group.","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string","enum":["total-customers","customers-traffic","customers-with-most-sales","customers-with-most-orders","customers-with-most-reviews","top-customer-groups"]}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingCustomers collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingcustomersview_get_collection"}},"/reporting/customers/export":{"get":{"tags":["Admin Reporting: Customers"],"summary":"Reporting \u2014 customers export (csv, xls, xlsx)","description":"Streams a customer stat as a csv, xls or xlsx download (the admin Export button). REST only; send the Accept header matching the requested format. `?type=` picks the stat group; `?format=` accepts csv, xls or xlsx (default csv).","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string"}},{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"example":"csv"}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingCustomers collection","content":{"text/csv":{"schema":[]},"application/vnd.ms-excel":{"schema":[]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":[]}}}},"operationId":"api_apiadminreportingcustomersexport_get_collection"}},"/reporting/stats":{"get":{"tags":["Admin Reporting: Overview"],"summary":"Reporting \u2014 overview","description":"Aggregate headline stats across sales/customers/products. Use `?type=` for the stat group; `?start=`, `?end=`, `?channel=` to bound the period.","parameters":[{"name":"type","in":"query","description":"Stat group: total-sales (default), total-orders, total-customers, top-selling-products-by-revenue.","schema":{"type":"string"}},{"name":"start","in":"query","description":"Start date (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date (YYYY-MM-DD).","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingOverview collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingstats_get_collection"}},"/reporting/products":{"get":{"tags":["Admin Reporting: Products"],"summary":"Reporting \u2014 products","description":"Product reporting stats. `?type=` picks the stat group.","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string","enum":["total-sold-quantities","total-products-added-to-wishlist","top-selling-products-by-revenue","top-selling-products-by-quantity","products-with-most-reviews","products-with-most-visits","last-search-terms","top-search-terms"]}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingProducts collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingproducts_get_collection"}},"/reporting/products/view":{"get":{"tags":["Admin Reporting: Products"],"summary":"Reporting \u2014 products (View Details)","description":"The detailed table form of a product stat (the admin \"View Details\" page). `statistics` is `{ columns, records }`. `?type=` picks the stat group.","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string","enum":["total-sold-quantities","total-products-added-to-wishlist","top-selling-products-by-revenue","top-selling-products-by-quantity","products-with-most-reviews","products-with-most-visits","last-search-terms","top-search-terms"]}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingProducts collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingproductsview_get_collection"}},"/reporting/products/export":{"get":{"tags":["Admin Reporting: Products"],"summary":"Reporting \u2014 products export (csv, xls, xlsx)","description":"Streams a product stat as a csv, xls or xlsx download (the admin Export button). REST only; send the Accept header matching the requested format. `?type=` picks the stat group; `?format=` accepts csv, xls or xlsx (default csv).","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string"}},{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"example":"csv"}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingProducts collection","content":{"text/csv":{"schema":[]},"application/vnd.ms-excel":{"schema":[]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":[]}}}},"operationId":"api_apiadminreportingproductsexport_get_collection"}},"/reporting/sales":{"get":{"tags":["Admin Reporting: Sales"],"summary":"Reporting \u2014 sales","description":"Sales reporting stats. `?type=` chooses the stat group.","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string","enum":["total-sales","average-sales","total-orders","purchase-funnel","abandoned-carts","refunds","tax-collected","shipping-collected","top-payment-methods","sales-by-coupon"]}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingSales collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingsales_get_collection"}},"/reporting/sales/view":{"get":{"tags":["Admin Reporting: Sales"],"summary":"Reporting \u2014 sales (View Details)","description":"The detailed table form of a sales stat (the admin \"View Details\" page). `statistics` is `{ columns, records }`. `?type=` chooses the stat group.","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string","enum":["total-sales","average-sales","total-orders","purchase-funnel","abandoned-carts","refunds","tax-collected","shipping-collected","top-payment-methods","sales-by-coupon"]}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingSales collection","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminreportingsalesview_get_collection"}},"/reporting/sales/export":{"get":{"tags":["Admin Reporting: Sales"],"summary":"Reporting \u2014 sales export (csv, xls, xlsx)","description":"Streams a sales stat as a csv, xls or xlsx download (the admin Export button). REST only; send the Accept header matching the requested format. `?type=` chooses the stat group; `?format=` accepts csv, xls or xlsx (default csv).","parameters":[{"name":"type","in":"query","description":"Stat group.","schema":{"type":"string"}},{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"example":"csv"}},{"name":"start","in":"query","description":"Start date.","schema":{"type":"string","format":"date"}},{"name":"end","in":"query","description":"End date.","schema":{"type":"string","format":"date"}},{"name":"channel","in":"query","description":"Channel code.","schema":{"type":"string"}}],"responses":{"200":{"description":"AdminReportingSales collection","content":{"text/csv":{"schema":[]},"application/vnd.ms-excel":{"schema":[]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":[]}}}},"operationId":"api_apiadminreportingsalesexport_get_collection"}},"/rma/requests":{"get":{"tags":["Admin Sales: RMA"],"summary":"List RMA (return) requests","description":"Admin listing of every return request (RMADataGrid parity). Filters: id, order_id, status (title), customer_name, created_at range. Sort: id (default desc), order_id, created_at.","responses":{"200":{"description":"Paginated return requests. Detail-only fields (item/images/availableStatuses/information/messagesCount/canReopen) are null on the listing.","content":{"application/json":{"example":{"data":[{"id":12,"orderId":45,"orderIncrementId":"000000045","orderStatus":"processing","customerName":"Jane Doe","customerEmail":"jane@example.com","isGuest":0,"statusId":1,"statusTitle":"Pending","statusColor":"#FDB022","packageCondition":null,"information":null,"canReopen":null,"item":null,"images":null,"availableStatuses":null,"messagesCount":null,"createdAt":"2026-07-20T10:15:30+00:00","updatedAt":"2026-07-20T10:15:30+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminrmarequests_get_collection"},"post":{"tags":["Admin Sales: RMA"],"summary":"Create an RMA request for a customer order","description":"Admin-side return creation for any order. `rmaQty` is capped server-side by the item's returnable/cancelable quantity. Optional image files via multipart `images[]` (REST only). Returns the created RMA. Permission: sales.rma.requests.create.","requestBody":{"description":"The new AdminReturn resource","content":{"application/json":{"schema":{"type":"object","required":["order_id","order_item_id","rma_qty","resolution_type","rma_reason_id"],"properties":{"order_id":{"type":"integer","example":12},"order_item_id":{"type":"integer","example":45},"rma_qty":{"type":"integer","example":1},"resolution_type":{"type":"string","enum":["return","cancel_items"],"example":"return"},"rma_reason_id":{"type":"integer","example":2},"information":{"type":"string","example":"Customer reported a defect."},"package_condition":{"type":"string","example":"opened"}}}}},"required":true},"responses":{"201":{"description":"The created return request.","content":{"application/json":{"example":{"id":12,"orderId":45,"orderIncrementId":"000000045","orderStatus":"processing","customerName":"Jane Doe","customerEmail":"jane@example.com","isGuest":0,"statusId":1,"statusTitle":"Pending","statusColor":"#FDB022","packageCondition":"opened","information":"Customer reported a defect.","canReopen":false,"item":{"id":30,"order_item_id":78,"sku":"COASTALBREEZEMENSHOODIE","name":"Coastal Breeze Men's Blue Zipper Hoodie","quantity":1,"resolution":"return","reason_id":2,"reason":"Damaged product","variant_id":null},"images":[],"availableStatuses":[{"id":2,"title":"Accept"},{"id":3,"title":"Declined"}],"messagesCount":0,"createdAt":"2026-07-20T10:15:30+00:00","updatedAt":"2026-07-20T10:15:30+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmarequests_post"}},"/rma/requests/{id}":{"get":{"tags":["Admin Sales: RMA"],"summary":"Get one RMA request","description":"Full detail of a single return request \u2014 the returned item, images, status, the customer/order context, whether it can be reopened, and the list of status transitions the admin may set next.","parameters":[{"name":"id","in":"path","description":"Return ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The return request detail. availableStatuses lists the status transitions the admin may set next.","content":{"application/json":{"example":{"id":12,"orderId":45,"orderIncrementId":"000000045","orderStatus":"processing","customerName":"Jane Doe","customerEmail":"jane@example.com","isGuest":0,"statusId":1,"statusTitle":"Pending","statusColor":"#FDB022","packageCondition":"opened","information":"Customer reported a defect.","canReopen":false,"item":{"id":30,"order_item_id":78,"sku":"COASTALBREEZEMENSHOODIE","name":"Coastal Breeze Men's Blue Zipper Hoodie","quantity":1,"resolution":"return","reason_id":2,"reason":"Damaged product","variant_id":null},"images":[{"id":5,"path":"rma/12/damage-front.png","url":"https://example.com/storage/rma/12/damage-front.png"}],"availableStatuses":[{"id":2,"title":"Accept"},{"id":3,"title":"Declined"}],"messagesCount":2,"createdAt":"2026-07-20T10:15:30+00:00","updatedAt":"2026-07-20T10:15:30+00:00"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrmarequests_id_get"}},"/rma/requests/{id}/update-status":{"post":{"tags":["Admin Sales: RMA"],"summary":"Update the status of an RMA request","description":"Sets the RMA status. Status 5 (received package) creates a refund for the returned item (send `shipping` to include shipping); status 8 (item canceled) cancels the order item and restores its inventory; any other status just updates the status. Adds a status note and notifies the customer. Returns the updated RMA. Permission: sales.rma.requests.","parameters":[{"name":"id","in":"path","description":"Return ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminReturn resource","content":{"application/json":{"schema":{"type":"object","required":["rma_status_id"],"properties":{"rma_status_id":{"type":"integer","example":2},"shipping":{"type":"number","example":0}}}}},"required":true},"responses":{"200":{"description":"The updated return request after the status change.","content":{"application/json":{"example":{"id":12,"orderId":45,"orderIncrementId":"000000045","statusId":2,"statusTitle":"Accept","statusColor":"#12B76A","canReopen":false,"availableStatuses":[{"id":5,"title":"Received package"},{"id":4,"title":"Dispatched package"}],"messagesCount":3,"updatedAt":"2026-07-20T11:00:00+00:00"}}}},"201":{"description":"AdminReturn resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmarequests_idupdate-status_post"}},"/rma/requests/{id}/reopen":{"post":{"tags":["Admin Sales: RMA"],"summary":"Reopen an RMA request","description":"Reopens a declined/canceled RMA back to pending when store settings allow it (otherwise 422). Empty body. Returns the updated RMA. Permission: sales.rma.requests.","parameters":[{"name":"id","in":"path","description":"Return ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminReturn resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"The reopened return request.","content":{"application/json":{"example":{"id":12,"orderId":45,"orderIncrementId":"000000045","statusId":1,"statusTitle":"Pending","statusColor":"#FDB022","canReopen":false,"availableStatuses":[{"id":2,"title":"Accept"},{"id":3,"title":"Declined"}],"messagesCount":3,"updatedAt":"2026-07-20T11:20:00+00:00"}}}},"201":{"description":"AdminReturn resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmarequests_idreopen_post"}},"/rma/messages":{"get":{"tags":["Admin Sales: RMA"],"summary":"List the conversation messages of an RMA request","description":"Messages on the RMA named by `?return_id=`, newest first.","parameters":[{"name":"return_id","in":"query","description":"Return (RMA) id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The RMA conversation messages, newest first.","content":{"application/json":{"example":[{"id":90,"rmaId":12,"message":"We have received your package.","isAdmin":true,"attachment":null,"attachmentUrl":null,"createdAt":"2026-07-20T11:30:00+00:00"},{"id":87,"rmaId":12,"message":"The hoodie zipper is broken.","isAdmin":false,"attachment":"rma/12/messages/zipper.jpg","attachmentUrl":"https://example.com/storage/rma/12/messages/zipper.jpg","createdAt":"2026-07-20T10:20:00+00:00"}]}}}},"operationId":"api_apiadminrmamessages_get_collection"},"post":{"tags":["Admin Sales: RMA"],"summary":"Send an admin message on an RMA request","description":"Adds an admin message to the RMA conversation and notifies the customer. Body `{ return_id, message }`; optional multipart `file` (REST only). Permission: sales.rma.requests.","requestBody":{"description":"The new AdminReturnMessage resource","content":{"application/json":{"schema":{"type":"object","required":["return_id","message"],"properties":{"return_id":{"type":"integer","example":12},"message":{"type":"string","example":"We have received your package."}}}}},"required":true},"responses":{"201":{"description":"The created admin message.","content":{"application/json":{"example":{"id":91,"rmaId":12,"message":"We have received your package.","isAdmin":true,"attachment":null,"attachmentUrl":null,"createdAt":"2026-07-20T11:35:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmamessages_post"}},"/rma/requests/resolution-reasons":{"get":{"tags":["Admin Sales: RMA"],"summary":"List active return reasons for a resolution type","description":"Reasons available when creating a return, filtered by `?resolution_type=return|cancel_items`.","parameters":[{"name":"resolution_type","in":"query","description":"return | cancel_items","required":true,"schema":{"type":"string","enum":["return","cancel_items"]}}],"responses":{"200":{"description":"Active reasons for the resolution type.","content":{"application/json":{"example":[{"id":2,"title":"Damaged product","position":1},{"id":3,"title":"Wrong item delivered","position":2}]}}}},"operationId":"api_apiadminrmarequestsresolution-reasons_get_collection"}},"/rma/requests/order-items":{"get":{"tags":["Admin Sales: RMA"],"summary":"List the returnable items of an order (RMA create form)","description":"Items of the order named by `?order_id=` that can be put on a return, each with the trusted quantity caps (`forReturnQuantity`, `forCancelQuantity`, `currentQuantity`). No customer scope \u2014 admin can open a return for any order.","parameters":[{"name":"order_id","in":"query","description":"Order id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The returnable items of the order, with server-enforced quantity caps.","content":{"application/json":{"example":[{"orderItemId":78,"productId":1,"sku":"COASTALBREEZEMENSHOODIE","name":"Coastal Breeze Men's Blue Zipper Hoodie","type":"simple","price":100,"qtyOrdered":2,"currentQuantity":2,"forReturnQuantity":2,"forCancelQuantity":0,"rmaQuantity":0,"rmaReturnPeriod":30}]}}}},"operationId":"api_apiadminrmarequestsorder-items_get_collection"}},"/rma/custom-fields":{"get":{"tags":["Admin Sales: RMA"],"summary":"List RMA custom fields","description":"Extra fields the return form collects. Filters: code (LIKE), label (LIKE), type, status. Sort: id (default desc), position, code.","responses":{"200":{"description":"The RMA custom fields. options is populated only for select/multiselect/checkbox/radio types.","content":{"application/json":{"example":{"data":[{"id":4,"code":"preferred_resolution","label":"Preferred resolution","type":"select","isRequired":1,"position":1,"inputValidation":null,"status":1,"options":[{"id":11,"name":"Refund","value":"refund"},{"id":12,"name":"Replacement","value":"replacement"}],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminrmacustom-fields_get_collection"},"post":{"tags":["Admin Sales: RMA"],"summary":"Create an RMA custom field","description":"`options` is required for select/multiselect/checkbox/radio types. Permission: sales.rma.custom-fields.create.","requestBody":{"description":"The new AdminRmaCustomField resource","content":{"application/json":{"schema":{"type":"object","required":["code","label","type"],"properties":{"code":{"type":"string","example":"preferred_resolution"},"label":{"type":"string","example":"Preferred resolution"},"type":{"type":"string","enum":["text","textarea","select","multiselect","checkbox","radio"],"example":"select"},"is_required":{"type":"integer","enum":[0,1],"example":1},"position":{"type":"integer","example":1},"input_validation":{"type":"string","example":null},"status":{"type":"integer","enum":[0,1],"example":1},"options":{"type":"array","description":"Required for select/multiselect/checkbox/radio.","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}}},"example":[{"name":"Refund","value":"refund"},{"name":"Replacement","value":"replacement"}]}}}}},"required":true},"responses":{"201":{"description":"The created RMA custom field.","content":{"application/json":{"example":{"id":4,"code":"preferred_resolution","label":"Preferred resolution","type":"select","isRequired":1,"position":1,"inputValidation":null,"status":1,"options":[{"id":11,"name":"Refund","value":"refund"},{"id":12,"name":"Replacement","value":"replacement"}],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmacustom-fields_post"}},"/rma/custom-fields/{id}":{"get":{"tags":["Admin Sales: RMA"],"summary":"Get an RMA custom field (with its options)","description":"Get an RMA custom field (with its options)","parameters":[{"name":"id","in":"path","description":"Rma custom field ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA custom field with its options.","content":{"application/json":{"example":{"id":4,"code":"preferred_resolution","label":"Preferred resolution","type":"select","isRequired":1,"position":1,"inputValidation":null,"status":1,"options":[{"id":11,"name":"Refund","value":"refund"},{"id":12,"name":"Replacement","value":"replacement"}],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrmacustom-fields_id_get"},"put":{"tags":["Admin Sales: RMA"],"summary":"Update an RMA custom field","description":"Partial update. Sending `options` replaces the full option set. Permission: sales.rma.custom-fields.edit.","parameters":[{"name":"id","in":"path","description":"Rma custom field ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminRmaCustomField resource","content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","example":"How should we resolve this?"},"is_required":{"type":"integer","enum":[0,1],"example":0},"position":{"type":"integer","example":2},"status":{"type":"integer","enum":[0,1],"example":1},"options":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}}},"example":[{"name":"Refund","value":"refund"},{"name":"Store credit","value":"store_credit"}]}}}}},"required":true},"responses":{"200":{"description":"The updated RMA custom field.","content":{"application/json":{"example":{"id":4,"code":"preferred_resolution","label":"How should we resolve this?","type":"select","isRequired":0,"position":2,"inputValidation":null,"status":1,"options":[{"id":13,"name":"Refund","value":"refund"},{"id":14,"name":"Store credit","value":"store_credit"}],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T11:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmacustom-fields_id_put"},"delete":{"tags":["Admin Sales: RMA"],"summary":"Delete an RMA custom field","description":"Permission: sales.rma.custom-fields.delete.","parameters":[{"name":"id","in":"path","description":"Rma custom field ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA custom field was deleted.","content":{"application/json":{"example":{"message":"RMA custom field deleted successfully."}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrmacustom-fields_id_delete"}},"/rma/custom-fields/mass-delete":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-delete RMA custom fields","description":"Permission: sales.rma.custom-fields.delete.","requestBody":{"description":"The new AdminRmaCustomFieldMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[4,6]}}}}},"required":true},"responses":{"200":{"description":"The deleted custom-field ids.","content":{"application/json":{"example":{"deleted":[4,6],"message":"Selected RMA custom fields deleted successfully."}}}},"201":{"description":"AdminRmaCustomFieldMassDelete resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmacustom-fieldsmass-delete_post"}},"/rma/custom-fields/mass-update-status":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-update RMA custom field status","description":"Permission: sales.rma.custom-fields.edit.","requestBody":{"description":"The new AdminRmaCustomFieldMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[4,6]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"The updated custom-field ids.","content":{"application/json":{"example":{"updated":[4,6],"message":"Selected RMA custom fields updated successfully."}}}},"201":{"description":"AdminRmaCustomFieldMassUpdateStatus resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmacustom-fieldsmass-update-status_post"}},"/rma/reasons":{"get":{"tags":["Admin Sales: RMA"],"summary":"List RMA reasons","description":"Return/cancel reasons the RMA form offers. Filters: title (LIKE), status. Sort: id (default desc), position, title.","responses":{"200":{"description":"The RMA reasons.","content":{"application/json":{"example":{"data":[{"id":2,"title":"Damaged product","status":1,"position":1,"isAdmin":0,"resolutionType":["return","cancel_items"],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminrmareasons_get_collection"},"post":{"tags":["Admin Sales: RMA"],"summary":"Create an RMA reason","description":"Permission: sales.rma.reasons.create.","requestBody":{"description":"The new AdminRmaReason resource","content":{"application/json":{"schema":{"type":"object","required":["title","resolution_type"],"properties":{"title":{"type":"string","example":"Damaged product"},"status":{"type":"integer","enum":[0,1],"example":1},"position":{"type":"integer","example":1},"resolution_type":{"type":"array","items":{"type":"string","enum":["return","cancel_items"]},"example":["return","cancel_items"]}}}}},"required":true},"responses":{"201":{"description":"The created RMA reason.","content":{"application/json":{"example":{"id":6,"title":"Damaged product","status":1,"position":1,"isAdmin":0,"resolutionType":["return","cancel_items"],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmareasons_post"}},"/rma/reasons/{id}":{"get":{"tags":["Admin Sales: RMA"],"summary":"Get an RMA reason","description":"Get an RMA reason","parameters":[{"name":"id","in":"path","description":"Rma reason ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA reason.","content":{"application/json":{"example":{"id":2,"title":"Damaged product","status":1,"position":1,"isAdmin":0,"resolutionType":["return","cancel_items"],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrmareasons_id_get"},"put":{"tags":["Admin Sales: RMA"],"summary":"Update an RMA reason","description":"Partial update. Permission: sales.rma.reasons.edit.","parameters":[{"name":"id","in":"path","description":"Rma reason ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminRmaReason resource","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"Damaged on arrival"},"status":{"type":"integer","enum":[0,1],"example":1},"position":{"type":"integer","example":2},"resolution_type":{"type":"array","items":{"type":"string","enum":["return","cancel_items"]},"example":["return"]}}}}},"required":true},"responses":{"200":{"description":"The updated RMA reason.","content":{"application/json":{"example":{"id":2,"title":"Damaged on arrival","status":1,"position":2,"isAdmin":0,"resolutionType":["return"],"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T11:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmareasons_id_put"},"delete":{"tags":["Admin Sales: RMA"],"summary":"Delete an RMA reason","description":"Permission: sales.rma.reasons.delete.","parameters":[{"name":"id","in":"path","description":"Rma reason ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA reason was deleted.","content":{"application/json":{"example":{"message":"RMA reason deleted successfully."}}}},"204":{"description":"AdminRmaReason resource deleted"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmareasons_id_delete"}},"/rma/reasons/mass-delete":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-delete RMA reasons","description":"Permission: sales.rma.reasons.delete.","requestBody":{"description":"The new AdminRmaReasonMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[2,3,4]}}}}},"required":true},"responses":{"200":{"description":"The deleted reason ids.","content":{"application/json":{"example":{"deleted":[2,3,4],"message":"Selected RMA reasons deleted successfully."}}}},"201":{"description":"AdminRmaReasonMassDelete resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmareasonsmass-delete_post"}},"/rma/reasons/mass-update-status":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-update RMA reason status","description":"Permission: sales.rma.reasons.edit.","requestBody":{"description":"The new AdminRmaReasonMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[2,3]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"The updated reason ids.","content":{"application/json":{"example":{"updated":[2,3],"message":"Selected RMA reasons updated successfully."}}}},"201":{"description":"AdminRmaReasonMassUpdateStatus resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmareasonsmass-update-status_post"}},"/rma/rules":{"get":{"tags":["Admin Sales: RMA"],"summary":"List RMA rules","description":"Return rules (a rule sets the return window for matching products). Filters: name (LIKE), status. Sort: id (default desc), name.","responses":{"200":{"description":"The RMA rules.","content":{"application/json":{"example":{"data":[{"id":3,"name":"Apparel 30-day returns","description":"Return window for all clothing.","status":1,"returnPeriod":30,"default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminrmarules_get_collection"},"post":{"tags":["Admin Sales: RMA"],"summary":"Create an RMA rule","description":"Permission: sales.rma.rules.create.","requestBody":{"description":"The new AdminRmaRule resource","content":{"application/json":{"schema":{"type":"object","required":["name","return_period"],"properties":{"name":{"type":"string","example":"Apparel 30-day returns"},"description":{"type":"string","example":"Return window for all clothing."},"status":{"type":"integer","enum":[0,1],"example":1},"return_period":{"type":"integer","example":30}}}}},"required":true},"responses":{"201":{"description":"The created RMA rule.","content":{"application/json":{"example":{"id":3,"name":"Apparel 30-day returns","description":"Return window for all clothing.","status":1,"returnPeriod":30,"default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmarules_post"}},"/rma/rules/{id}":{"get":{"tags":["Admin Sales: RMA"],"summary":"Get an RMA rule","description":"Get an RMA rule","parameters":[{"name":"id","in":"path","description":"Rma rule ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA rule.","content":{"application/json":{"example":{"id":3,"name":"Apparel 30-day returns","description":"Return window for all clothing.","status":1,"returnPeriod":30,"default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrmarules_id_get"},"put":{"tags":["Admin Sales: RMA"],"summary":"Update an RMA rule","description":"Partial update. Permission: sales.rma.rules.edit.","parameters":[{"name":"id","in":"path","description":"Rma rule ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminRmaRule resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Apparel 45-day returns"},"description":{"type":"string","example":"Extended window for clothing."},"status":{"type":"integer","enum":[0,1],"example":1},"return_period":{"type":"integer","example":45}}}}},"required":true},"responses":{"200":{"description":"The updated RMA rule.","content":{"application/json":{"example":{"id":3,"name":"Apparel 45-day returns","description":"Extended window for clothing.","status":1,"returnPeriod":45,"default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T11:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmarules_id_put"},"delete":{"tags":["Admin Sales: RMA"],"summary":"Delete an RMA rule","description":"Permission: sales.rma.rules.delete.","parameters":[{"name":"id","in":"path","description":"Rma rule ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA rule was deleted.","content":{"application/json":{"example":{"message":"RMA rule deleted successfully."}}}},"204":{"description":"AdminRmaRule resource deleted"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmarules_id_delete"}},"/rma/rules/mass-delete":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-delete RMA rules","description":"Permission: sales.rma.rules.delete.","requestBody":{"description":"The new AdminRmaRuleMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[3,5]}}}}},"required":true},"responses":{"200":{"description":"The deleted rule ids.","content":{"application/json":{"example":{"deleted":[3,5],"message":"Selected RMA rules deleted successfully."}}}},"201":{"description":"AdminRmaRuleMassDelete resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmarulesmass-delete_post"}},"/rma/rules/mass-update-status":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-update RMA rule status","description":"Permission: sales.rma.rules.edit.","requestBody":{"description":"The new AdminRmaRuleMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[3,5]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"The updated rule ids.","content":{"application/json":{"example":{"updated":[3,5],"message":"Selected RMA rules updated successfully."}}}},"201":{"description":"AdminRmaRuleMassUpdateStatus resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmarulesmass-update-status_post"}},"/rma/statuses":{"get":{"tags":["Admin Sales: RMA"],"summary":"List RMA statuses","description":"Custom return statuses. Filters: title (LIKE), status. Sort: id (default desc), title. Default statuses cannot be deleted.","responses":{"200":{"description":"The RMA statuses.","content":{"application/json":{"example":{"data":[{"id":9,"title":"Awaiting inspection","status":1,"color":"#FDB022","default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminrmastatuses_get_collection"},"post":{"tags":["Admin Sales: RMA"],"summary":"Create an RMA status","description":"Title must be unique. Permission: sales.rma.statuses.create.","requestBody":{"description":"The new AdminRmaStatus resource","content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","example":"Awaiting inspection"},"status":{"type":"integer","enum":[0,1],"example":1},"color":{"type":"string","example":"#FDB022"}}}}},"required":true},"responses":{"201":{"description":"The created RMA status.","content":{"application/json":{"example":{"id":9,"title":"Awaiting inspection","status":1,"color":"#FDB022","default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmastatuses_post"}},"/rma/statuses/{id}":{"get":{"tags":["Admin Sales: RMA"],"summary":"Get an RMA status","description":"Get an RMA status","parameters":[{"name":"id","in":"path","description":"Rma status ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA status.","content":{"application/json":{"example":{"id":9,"title":"Awaiting inspection","status":1,"color":"#FDB022","default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T09:00:00+00:00"}}}},"404":{"description":"Not found"}},"operationId":"api_apiadminrmastatuses_id_get"},"put":{"tags":["Admin Sales: RMA"],"summary":"Update an RMA status","description":"Partial update. Permission: sales.rma.statuses.edit.","parameters":[{"name":"id","in":"path","description":"Rma status ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminRmaStatus resource","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"Inspection complete"},"status":{"type":"integer","enum":[0,1],"example":1},"color":{"type":"string","example":"#12B76A"}}}}},"required":true},"responses":{"200":{"description":"The updated RMA status.","content":{"application/json":{"example":{"id":9,"title":"Inspection complete","status":1,"color":"#12B76A","default":0,"message":null,"createdAt":"2026-07-20T09:00:00+00:00","updatedAt":"2026-07-20T11:00:00+00:00"}}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmastatuses_id_put"},"delete":{"tags":["Admin Sales: RMA"],"summary":"Delete an RMA status","description":"Only non-default statuses can be deleted (422 otherwise). Permission: sales.rma.statuses.delete.","parameters":[{"name":"id","in":"path","description":"Rma status ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The RMA status was deleted.","content":{"application/json":{"example":{"message":"RMA status deleted successfully."}}}},"204":{"description":"AdminRmaStatus resource deleted"},"404":{"description":"Not found"}},"operationId":"api_apiadminrmastatuses_id_delete"}},"/rma/statuses/mass-delete":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-delete RMA statuses","description":"Default statuses are skipped. Permission: sales.rma.statuses.delete.","requestBody":{"description":"The new AdminRmaStatusMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[9,10]}}}}},"required":true},"responses":{"200":{"description":"The deleted status ids (default statuses skipped).","content":{"application/json":{"example":{"deleted":[9,10],"message":"Selected RMA statuses deleted successfully."}}}},"201":{"description":"AdminRmaStatusMassDelete resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmastatusesmass-delete_post"}},"/rma/statuses/mass-update-status":{"post":{"tags":["Admin Sales: RMA"],"summary":"Mass-update RMA status active flag","description":"Permission: sales.rma.statuses.edit.","requestBody":{"description":"The new AdminRmaStatusMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[9,10]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"The updated status ids.","content":{"application/json":{"example":{"updated":[9,10],"message":"Selected RMA statuses updated successfully."}}}},"201":{"description":"AdminRmaStatusMassUpdateStatus resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminrmastatusesmass-update-status_post"}},"/settings/channels":{"get":{"tags":["Admin Settings: Channels"],"summary":"List channels (datagrid parity)","description":"Paginated, filterable, sortable channels list. Filters: code, name, hostname. Sort: id, code, name.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"code","in":"query","description":"Partial code match.","schema":{"type":"string","example":"default"}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string","example":"US"}},{"name":"hostname","in":"query","description":"Partial hostname match.","schema":{"type":"string","example":"example.com"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","code","name"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated channels in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingschannels_get_collection"},"post":{"tags":["Admin Settings: Channels"],"summary":"Create a new channel","description":"Mirrors Bagisto admin Settings \u2192 Channels \u2192 Create. Validates code (unique, alpha-dash), hostname (unique), locales/currencies/inventory_sources (non-empty arrays), default_locale_id and base_currency_id (must appear in the respective arrays), root_category_id (must exist).","requestBody":{"description":"The new AdminSettingsChannel resource","content":{"application/json":{"schema":{"type":"object"},"example":{"code":"us_store","name":"US Store","hostname":"us.example.com","theme":"default","timezone":"America/New_York","locales":[1],"default_locale_id":1,"currencies":[1],"base_currency_id":1,"inventory_sources":[1],"root_category_id":1,"seo_title":"Welcome to the US store","seo_description":"Best products for the US market","seo_keywords":"shop, us, store","is_maintenance_on":false}}},"required":true},"responses":{"201":{"description":"Channel created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingschannels_post"}},"/settings/channels/{id}":{"get":{"tags":["Admin Settings: Channels"],"summary":"Channel detail","description":"Channel detail","parameters":[{"name":"id","in":"path","description":"Channel ID.","required":true,"schema":{"type":"integer","example":3}}],"responses":{"200":{"description":"Single channel with translations, locales, currencies, inventory sources (as object arrays) and homeSeo.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Channel not found."}},"operationId":"api_apiadminsettingschannels_id_get"},"put":{"tags":["Admin Settings: Channels"],"summary":"Update a channel","description":"Code/hostname uniqueness excludes the current id. Use the `translations` map for locale-nested attributes (name, description, seo_*, maintenance_mode_text). Top-level scalar fields broadcast to every configured locale via the repository.","parameters":[{"name":"id","in":"path","description":"Channel ID.","required":true,"schema":{"type":"integer","example":3}}],"requestBody":{"description":"The updated AdminSettingsChannel resource","content":{"application/json":{"schema":{"type":"object"},"example":{"code":"us_store","hostname":"us.example.com","locales":[1],"default_locale_id":1,"currencies":[1],"base_currency_id":1,"inventory_sources":[1],"root_category_id":1,"translations":{"en":{"name":"US Store","description":"Our US storefront","seo_title":"Welcome","seo_description":"Welcome to our shop","seo_keywords":"shop, us"}}}}},"required":true},"responses":{"200":{"description":"Channel updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Channel not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingschannels_id_put"},"delete":{"tags":["Admin Settings: Channels"],"summary":"Delete a channel","description":"Refuses with HTTP 400 if this is the only remaining channel OR if its code matches the application-wide default channel (config(\"app.channel\")).","parameters":[{"name":"id","in":"path","description":"Channel ID.","required":true,"schema":{"type":"integer","example":3}}],"responses":{"200":{"description":"Channel deleted."},"400":{"description":"Cannot delete \u2014 last channel or default app channel."},"404":{"description":"Channel not found."}},"operationId":"api_apiadminsettingschannels_id_delete"}},"/settings/currencies":{"get":{"tags":["Admin Settings: Currencies"],"summary":"List currencies (datagrid parity)","description":"Paginated, filterable, sortable currencies list. Filters: code, name, symbol. Sort: id, code, name.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"code","in":"query","description":"Partial code match (SQL LIKE).","schema":{"type":"string","example":"EUR"}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string","example":"Euro"}},{"name":"symbol","in":"query","description":"Partial symbol match.","schema":{"type":"string","example":"\u20ac"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","code","name"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list of currency rows in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":1,"code":"USD","name":"US Dollar","symbol":"$","decimal":2,"groupSeparator":",","decimalSeparator":".","currencyPosition":"left","createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminsettingscurrencies_get_collection"},"post":{"tags":["Admin Settings: Currencies"],"summary":"Create a new currency","description":"Mirrors Bagisto admin Settings \u2192 Currencies \u2192 Create. Validates code (required, alpha, exactly 3 chars, unique), name (required). Code is uppercased by the model mutator.","requestBody":{"description":"The new AdminSettingsCurrency resource","content":{"application/json":{"schema":{"type":"object","required":["code","name"],"properties":{"code":{"type":"string","example":"EUR"},"name":{"type":"string","example":"Euro"},"symbol":{"type":"string","example":"\u20ac"},"decimal":{"type":"integer","example":2},"group_separator":{"type":"string","example":","},"decimal_separator":{"type":"string","example":"."},"currency_position":{"type":"string","example":"left"}}}}},"required":true},"responses":{"201":{"description":"Currency created.","content":{"application/json":{"example":{"id":5,"code":"EUR","name":"Euro","symbol":"\u20ac","decimal":2,"groupSeparator":",","decimalSeparator":".","currencyPosition":"left"}}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingscurrencies_post"}},"/settings/currencies/{id}":{"get":{"tags":["Admin Settings: Currencies"],"summary":"Currency detail","description":"Currency detail","parameters":[{"name":"id","in":"path","description":"Currency ID.","required":true,"schema":{"type":"integer","example":5}}],"responses":{"200":{"description":"Single currency.","content":{"application/json":{"example":{"id":5,"code":"EUR","name":"Euro","symbol":"\u20ac","decimal":2,"groupSeparator":",","decimalSeparator":".","currencyPosition":"left","createdAt":"2026-01-12T08:15:00+00:00","updatedAt":"2026-04-30T14:20:09+00:00"}}}},"404":{"description":"Currency not found."}},"operationId":"api_apiadminsettingscurrencies_id_get"},"put":{"tags":["Admin Settings: Currencies"],"summary":"Update a currency","description":"Validates name (required). Code is immutable in the monolith UI; if sent here it will be ignored by the repository payload filter.","parameters":[{"name":"id","in":"path","description":"Currency ID.","required":true,"schema":{"type":"integer","example":5}}],"requestBody":{"description":"The updated AdminSettingsCurrency resource","content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"Euro"},"symbol":{"type":"string","example":"\u20ac"},"decimal":{"type":"integer","example":2},"group_separator":{"type":"string","example":","},"decimal_separator":{"type":"string","example":"."},"currency_position":{"type":"string","example":"left"}}}}},"required":true},"responses":{"200":{"description":"Currency updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Currency not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingscurrencies_id_put"},"delete":{"tags":["Admin Settings: Currencies"],"summary":"Delete a currency","description":"Refuses with HTTP 400 if this is the only remaining currency, or if any channel uses it as its base_currency_id.","parameters":[{"name":"id","in":"path","description":"Currency ID.","required":true,"schema":{"type":"integer","example":5}}],"responses":{"200":{"description":"Currency deleted.","content":{"application/json":{"example":{"message":"Currency deleted successfully."}}}},"400":{"description":"Cannot delete \u2014 last remaining currency or a channel base currency."},"404":{"description":"Currency not found."}},"operationId":"api_apiadminsettingscurrencies_id_delete"}},"/settings/currencies/mass-delete":{"post":{"tags":["Admin Settings: Currencies"],"summary":"Mass delete currencies","description":"Deletes a batch of currencies. If any ID is a channel base_currency_id, OR the batch would empty the currencies table, the entire batch is rejected with HTTP 400. Non-existent IDs are silently skipped.","requestBody":{"description":"The new AdminSettingsCurrencyMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[2,3]}}}}},"required":true},"responses":{"200":{"description":"Currencies deleted.","content":{"application/json":{"example":{"deleted":[2,3],"message":"Currencies deleted successfully."}}}},"400":{"description":"Batch rejected \u2014 last currency or channel base currency."},"422":{"description":"Validation Error"}},"operationId":"api_apiadminsettingscurrenciesmass-delete_post"}},"/settings/data-transfer/imports":{"get":{"tags":["Admin Settings: Data Transfer"],"summary":"List imports","description":"Paginated listing of all imports across entity types and actions. Filters: code (entity type), type (synonym for code), action, state, created_at_from, created_at_to. Sort: id (default desc), state, created_at.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"code","in":"query","description":"Filter by entity type (e.g. product, customer).","schema":{"type":"string","example":"product"}},{"name":"type","in":"query","description":"Alias for code (kept for spec compatibility).","schema":{"type":"string","example":"product"}},{"name":"action","in":"query","description":"Filter by action (append / update / delete).","schema":{"type":"string","example":"append"}},{"name":"state","in":"query","description":"Filter by state.","schema":{"type":"string","example":"pending"}},{"name":"created_at_from","in":"query","description":"Filter by created_at >= (ISO date).","schema":{"type":"string","example":"2026-01-01"}},{"name":"created_at_to","in":"query","description":"Filter by created_at <= (ISO date).","schema":{"type":"string","example":"2026-12-31"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","state","created_at"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated imports in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingsdata-transferimports_get_collection"},"post":{"tags":["Admin Settings: Data Transfer"],"summary":"Create an import","description":"Creates a new import. Send as multipart/form-data with the binary `file` part plus type / action / validation_strategy / allowed_errors / field_separator. Binary upload is REST-only. Permission: settings.data_transfer.imports.create.","requestBody":{"description":"The new AdminSettingsDataTransferImport resource","content":{"multipart/form-data":{"schema":{"type":"object","required":["type","action","validation_strategy","allowed_errors","field_separator","file"],"properties":{"type":{"type":"string","example":"products"},"action":{"type":"string","enum":["append","delete"],"example":"append"},"validation_strategy":{"type":"string","enum":["stop-on-errors","skip-errors"],"example":"stop-on-errors"},"allowed_errors":{"type":"integer","example":0},"field_separator":{"type":"string","example":","},"process_in_queue":{"type":"boolean","example":false},"images_directory_path":{"type":"string","example":""},"file":{"type":"string","format":"binary"}}}}},"required":true},"responses":{"201":{"description":"Import created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.create."},"422":{"description":"Validation failure (missing file, invalid type/action/strategy)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsdata-transferimports_post"}},"/settings/data-transfer/imports/{id}":{"get":{"tags":["Admin Settings: Data Transfer"],"summary":"Import detail","description":"Import detail","parameters":[{"name":"id","in":"path","description":"Import ID.","required":true,"schema":{"type":"integer","example":3}}],"responses":{"200":{"description":"Single import with full state, counts and file info.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"401":{"description":"Missing or invalid admin token."},"404":{"description":"Import not found."}},"operationId":"api_apiadminsettingsdata-transferimports_id_get"},"put":{"tags":["Admin Settings: Data Transfer"],"summary":"Update an import","description":"Updates an import. Send as multipart/form-data; the `file` part is optional. Re-uploading resets the import state to pending and clears the previous counts / error report. Permission: settings.data_transfer.imports.edit.","parameters":[{"name":"id","in":"path","description":"Import ID.","required":true,"schema":{"type":"integer","example":3}}],"requestBody":{"description":"The updated AdminSettingsDataTransferImport resource","content":{"multipart/form-data":{"schema":{"type":"object","required":["type","action","validation_strategy","allowed_errors","field_separator"],"properties":{"type":{"type":"string","example":"products"},"action":{"type":"string","enum":["append","delete"],"example":"append"},"validation_strategy":{"type":"string","enum":["stop-on-errors","skip-errors"],"example":"stop-on-errors"},"allowed_errors":{"type":"integer","example":0},"field_separator":{"type":"string","example":","},"file":{"type":"string","format":"binary"}}}}},"required":true},"responses":{"200":{"description":"Import updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.edit."},"404":{"description":"Import not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsdata-transferimports_id_put"},"delete":{"tags":["Admin Settings: Data Transfer"],"summary":"Delete an import","description":"Removes the DB row and best-effort deletes the underlying upload file from storage. Permission: settings.data_transfer.imports.delete.","parameters":[{"name":"id","in":"path","description":"Import ID.","required":true,"schema":{"type":"integer","example":3}}],"responses":{"200":{"description":"Import deleted."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.delete."},"404":{"description":"Import not found."}},"operationId":"api_apiadminsettingsdata-transferimports_id_delete"}},"/settings/data-transfer/imports/{id}/cancel":{"post":{"tags":["Admin Settings: Data Transfer"],"summary":"Cancel a running or pending import","description":"Sets state to \"cancelled\". Refuses (422) when the import is in a terminal state (completed / processed / failed / cancelled). Permission: settings.data_transfer.imports.edit.","parameters":[{"name":"id","in":"path","description":"Settings data transfer import cancel ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminSettingsDataTransferImportCancel resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Import cancelled successfully.","content":{"application/json":{"example":{"id":3,"state":"cancelled","success":true,"message":"Import cancelled successfully."}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.edit."},"404":{"description":"Import not found."},"422":{"description":"Import is in a terminal state and cannot be cancelled."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsdata-transferimports_idcancel_post"}},"/settings/data-transfer/imports/{id}/download":{"get":{"tags":["Admin Settings: Data Transfer"],"summary":"Download the uploaded import file","description":"Streams the original uploaded file as an attachment. Send `Accept: application/octet-stream`. 404 when no file is present.","parameters":[{"name":"id","in":"path","description":"Import ID.","required":true,"schema":{"type":"integer","example":3}}],"responses":{"200":{"description":"The uploaded file is downloaded.","content":{"application/octet-stream":{"schema":[]}}},"404":{"description":"Import or file not found."}},"operationId":"api_apiadminsettingsdata-transferimports_iddownload_get"}},"/settings/data-transfer/imports/{id}/download-error-report":{"get":{"tags":["Admin Settings: Data Transfer"],"summary":"Download the import error report","description":"Streams the generated error report as an attachment. Send `Accept: application/octet-stream`. 404 when no error report exists.","parameters":[{"name":"id","in":"path","description":"Import ID.","required":true,"schema":{"type":"integer","example":3}}],"responses":{"200":{"description":"The error report is downloaded.","content":{"application/octet-stream":{"schema":[]}}},"404":{"description":"Import or error report not found."}},"operationId":"api_apiadminsettingsdata-transferimports_iddownload-error-report_get"}},"/settings/data-transfer/imports/sample/{type}/{format}":{"get":{"tags":["Admin Settings: Data Transfer"],"summary":"Download a sample import file","description":"Streams the configured sample file for the given importer type and format. Send `Accept: application/octet-stream`. 422 for an unsupported format; 404 for an unknown type / missing sample.","parameters":[{"name":"type","in":"path","description":"Importer type (products / customers / tax_rates).","required":true,"schema":{"type":"string","example":"products"}},{"name":"format","in":"path","description":"Sample format (csv / xls / xlsx / xml).","required":true,"schema":{"type":"string","example":"csv"}}],"responses":{"200":{"description":"The sample file is downloaded.","content":{"application/octet-stream":{"schema":[]}}},"404":{"description":"Unknown type or missing sample."},"422":{"description":"Unsupported sample format."}},"operationId":"api_apiadminsettingsdata-transferimportssample_type_format_get"}},"/settings/data-transfer/imports/{id}/index":{"post":{"tags":["Admin Settings: Data Transfer"],"summary":"Index an import batch","description":"Indexes the next linked batch and returns stats + the refreshed import. Permission: settings.data_transfer.imports.edit.","parameters":[{"name":"id","in":"path","description":"Settings data transfer import index ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminSettingsDataTransferImportIndex resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Batch indexed; stats + refreshed import.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Nothing to import / not valid."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.edit."},"404":{"description":"Import not found."},"422":{"description":"Validation Error"}},"operationId":"api_apiadminsettingsdata-transferimports_idindex_post"}},"/settings/data-transfer/imports/{id}/link":{"post":{"tags":["Admin Settings: Data Transfer"],"summary":"Link an import batch","description":"Links the next processed batch and returns stats + the refreshed import. Permission: settings.data_transfer.imports.edit.","parameters":[{"name":"id","in":"path","description":"Settings data transfer import link ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminSettingsDataTransferImportLink resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Batch linked; stats + refreshed import.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Nothing to import / not valid."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.edit."},"404":{"description":"Import not found."},"422":{"description":"Validation Error"}},"operationId":"api_apiadminsettingsdata-transferimports_idlink_post"}},"/settings/data-transfer/imports/{id}/start":{"post":{"tags":["Admin Settings: Data Transfer"],"summary":"Start an import batch","description":"Processes the next pending batch (or dispatches the queue). Returns stats + the refreshed import. Permission: settings.data_transfer.imports.edit.","parameters":[{"name":"id","in":"path","description":"Settings data transfer import start ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminSettingsDataTransferImportStart resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Batch processed; stats + refreshed import.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Nothing to import / not valid / queue not configured."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.edit."},"404":{"description":"Import not found."},"422":{"description":"Validation Error"}},"operationId":"api_apiadminsettingsdata-transferimports_idstart_post"}},"/settings/data-transfer/imports/{id}/stats":{"get":{"tags":["Admin Settings: Data Transfer"],"summary":"Import stats","description":"Returns the per-batch progress + summary for the requested state (default processed) plus the refreshed import.","parameters":[{"name":"id","in":"path","description":"Import ID.","required":true,"schema":{"type":"integer","example":3}},{"name":"state","in":"query","description":"Batch state to summarise (default processed).","schema":{"type":"string","example":"processed"}}],"responses":{"200":{"description":"Stats + refreshed import.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"401":{"description":"Missing or invalid admin token."},"404":{"description":"Import not found."}},"operationId":"api_apiadminsettingsdata-transferimports_idstats_get"}},"/settings/data-transfer/imports/{id}/validate":{"post":{"tags":["Admin Settings: Data Transfer"],"summary":"Validate an import","description":"Validates the uploaded file and returns is_valid plus the refreshed import. Permission: settings.data_transfer.imports.edit.","parameters":[{"name":"id","in":"path","description":"Settings data transfer import validate ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The new AdminSettingsDataTransferImportValidate resource","content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Validation result + refreshed import.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks settings.data_transfer.imports.edit."},"404":{"description":"Import not found."},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminsettingsdata-transferimports_idvalidate_post"}},"/settings/exchange-rates":{"get":{"tags":["Admin Settings: Exchange Rates"],"summary":"List exchange rates","description":"Paginated, filterable, sortable list of currency exchange rates. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"target_currency","in":"query","description":"Filter by target currency ID.","schema":{"type":"integer","example":2}},{"name":"rate_from","in":"query","description":"Minimum rate (inclusive).","schema":{"type":"number","example":0.5}},{"name":"rate_to","in":"query","description":"Maximum rate (inclusive).","schema":{"type":"number","example":2}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","target_currency","rate"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingsexchange-rates_get_collection"},"post":{"tags":["Admin Settings: Exchange Rates"],"summary":"Create a new exchange rate","description":"Creates a target_currency \u2192 rate mapping. Composite uniqueness is enforced on target_currency (one exchange rate per currency).","requestBody":{"description":"The new AdminSettingsExchangeRate resource","content":{"application/json":{"schema":{"type":"object","required":["target_currency","rate"],"properties":{"target_currency":{"type":"integer","example":2,"description":"Currency ID (target)."},"rate":{"type":"number","format":"float","example":1.085}}}}},"required":true},"responses":{"201":{"description":"Exchange rate created.","content":{"application/json":{"example":{"id":4,"targetCurrency":2,"targetCurrencyCode":"EUR","targetCurrencyName":"Euro","rate":1.085,"createdAt":"2026-05-22T08:15:00+00:00","updatedAt":"2026-05-22T08:15:00+00:00"}}}},"422":{"description":"Validation failure (missing fields, unknown currency, duplicate pair, non-positive rate)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsexchange-rates_post"}},"/settings/exchange-rates/{id}":{"get":{"tags":["Admin Settings: Exchange Rates"],"summary":"Exchange rate detail","description":"Exchange rate detail","parameters":[{"name":"id","in":"path","description":"Exchange rate ID.","required":true,"schema":{"type":"integer","example":4}}],"responses":{"200":{"description":"Single exchange rate row.","content":{"application/json":{"example":{"id":4,"targetCurrency":2,"targetCurrencyCode":"EUR","targetCurrencyName":"Euro","rate":1.085,"createdAt":"2026-05-22T08:15:00+00:00","updatedAt":"2026-05-22T08:15:00+00:00"}}}},"404":{"description":"Exchange rate not found."}},"operationId":"api_apiadminsettingsexchange-rates_id_get"},"put":{"tags":["Admin Settings: Exchange Rates"],"summary":"Update an exchange rate","description":"Updates target_currency and/or rate. Composite-uniqueness excludes self.","parameters":[{"name":"id","in":"path","description":"Exchange rate ID.","required":true,"schema":{"type":"integer","example":4}}],"requestBody":{"description":"The updated AdminSettingsExchangeRate resource","content":{"application/json":{"schema":{"type":"object","properties":{"target_currency":{"type":"integer","example":2},"rate":{"type":"number","format":"float","example":1.09}}}}},"required":true},"responses":{"200":{"description":"Exchange rate updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Exchange rate not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsexchange-rates_id_put"},"delete":{"tags":["Admin Settings: Exchange Rates"],"summary":"Delete an exchange rate","description":"Delete an exchange rate","parameters":[{"name":"id","in":"path","description":"Exchange rate ID.","required":true,"schema":{"type":"integer","example":4}}],"responses":{"200":{"description":"Exchange rate deleted.","content":{"application/json":{"example":{"message":"Exchange rate deleted successfully."}}}},"404":{"description":"Exchange rate not found."}},"operationId":"api_apiadminsettingsexchange-rates_id_delete"}},"/settings/exchange-rates/mass-delete":{"post":{"tags":["Admin Settings: Exchange Rates"],"summary":"Mass delete exchange rates","description":"Deletes a batch of exchange rates. Non-existent IDs are silently skipped.","requestBody":{"description":"The new AdminSettingsExchangeRateMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[4,7]}}}}},"required":true},"responses":{"200":{"description":"Exchange rates deleted.","content":{"application/json":{"example":{"deleted":[4,7],"message":"Exchange rates deleted successfully."}}}},"422":{"description":"Empty indices."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsexchange-ratesmass-delete_post"}},"/settings/exchange-rates/update-rates":{"post":{"tags":["Admin Settings: Exchange Rates"],"summary":"Update (auto-sync) exchange rates from the external provider","description":"Refreshes every non-base currency exchange rate from the configured external rate provider (the admin \"Update Rates\" action). Takes no body. Provider/network errors return 422 with the provider message.","requestBody":{"description":"The new AdminSettingsExchangeRateUpdateRates resource","content":{"application/json":{"schema":{"type":"object","properties":[]},"example":{}}}},"responses":{"200":{"description":"Rates refreshed.","content":{"application/json":{"example":{"success":true,"updated":3,"message":"Exchange rates updated successfully."}}}},"422":{"description":"External provider failure (e.g. missing/invalid API key)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsexchange-ratesupdate-rates_post"}},"/settings/inventory-sources":{"get":{"tags":["Admin Settings: Inventory Sources"],"summary":"List inventory sources","description":"Paginated, filterable, sortable list of inventory sources. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"code","in":"query","description":"Filter by code (partial match).","schema":{"type":"string"}},{"name":"name","in":"query","description":"Filter by name (partial match).","schema":{"type":"string"}},{"name":"status","in":"query","description":"0 or 1.","schema":{"type":"integer","enum":[0,1]}},{"name":"country","in":"query","description":"Exact country code.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","code","name","priority","status"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingsinventory-sources_get_collection"},"post":{"tags":["Admin Settings: Inventory Sources"],"summary":"Create a new inventory source","description":"Create a new inventory source","requestBody":{"description":"The new AdminSettingsInventorySource resource","content":{"application/json":{"schema":{"type":"object","required":["code","name","contact_name","contact_email","contact_number","country","state","city","street","postcode"],"properties":{"code":{"type":"string","example":"warehouse-1"},"name":{"type":"string","example":"Warehouse 1"},"description":{"type":"string","example":"Primary warehouse."},"contact_name":{"type":"string","example":"Jane Doe"},"contact_email":{"type":"string","example":"jane@example.com"},"contact_number":{"type":"string","example":"1234567890"},"contact_fax":{"type":"string","example":null},"country":{"type":"string","example":"US"},"state":{"type":"string","example":"CA"},"city":{"type":"string","example":"Los Angeles"},"street":{"type":"string","example":"123 Main St"},"postcode":{"type":"string","example":"90001"},"priority":{"type":"integer","example":0},"latitude":{"type":"number","format":"float","example":34.05},"longitude":{"type":"number","format":"float","example":-118.24},"status":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"201":{"description":"Inventory source created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsinventory-sources_post"}},"/settings/inventory-sources/{id}":{"get":{"tags":["Admin Settings: Inventory Sources"],"summary":"Inventory source detail","description":"Inventory source detail","parameters":[{"name":"id","in":"path","description":"Inventory source ID.","required":true,"schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"Single inventory source.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Inventory source not found."}},"operationId":"api_apiadminsettingsinventory-sources_id_get"},"put":{"tags":["Admin Settings: Inventory Sources"],"summary":"Update an inventory source","description":"Update an inventory source","parameters":[{"name":"id","in":"path","description":"Inventory source ID.","required":true,"schema":{"type":"integer","example":1}}],"requestBody":{"description":"The updated AdminSettingsInventorySource resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Warehouse 1 (renamed)"},"priority":{"type":"integer","example":5},"status":{"type":"integer","enum":[0,1],"example":0}}}}},"required":true},"responses":{"200":{"description":"Inventory source updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Inventory source not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsinventory-sources_id_put"},"delete":{"tags":["Admin Settings: Inventory Sources"],"summary":"Delete an inventory source","description":"Delete an inventory source","parameters":[{"name":"id","in":"path","description":"Inventory source ID.","required":true,"schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"Inventory source deleted.","content":{"application/json":{"example":{"message":"Inventory source deleted successfully."}}}},"400":{"description":"Last remaining source, or referenced by product_inventories."},"404":{"description":"Inventory source not found."}},"operationId":"api_apiadminsettingsinventory-sources_id_delete"}},"/settings/inventory-sources/mass-delete":{"post":{"tags":["Admin Settings: Inventory Sources"],"summary":"Mass delete inventory sources","description":"Mass delete inventory sources","requestBody":{"description":"The new AdminSettingsInventorySourceMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[2,3]}}}}},"required":true},"responses":{"200":{"description":"Inventory sources deleted.","content":{"application/json":{"example":{"deleted":[2,3],"message":"Inventory sources deleted successfully."}}}},"400":{"description":"Would leave zero sources, or one of the IDs is in use."},"422":{"description":"Empty indices."}},"operationId":"api_apiadminsettingsinventory-sourcesmass-delete_post"}},"/settings/locales":{"get":{"tags":["Admin Settings: Locales"],"summary":"List locales","description":"Paginated, filterable, sortable list of locales. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by id (exact). Accepts a single id or a comma-separated list, e.g. 1,10,35.","schema":{"type":"string","example":"1"}},{"name":"code","in":"query","description":"Filter by code (partial match).","schema":{"type":"string","example":"en"}},{"name":"name","in":"query","description":"Filter by name (partial match).","schema":{"type":"string","example":"Eng"}},{"name":"direction","in":"query","description":"Filter by direction (ltr/rtl).","schema":{"type":"string","enum":["ltr","rtl"]}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","code","name"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"asc"}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":1,"code":"en","name":"English","direction":"ltr","logoPath":"locales/en.png","logoUrl":"https://your-domain.com/storage/locales/en.png","createdAt":null,"updatedAt":null},{"id":10,"code":"ar","name":"Arabic","direction":"rtl","logoPath":null,"logoUrl":null,"createdAt":"2026-05-22T08:15:00+00:00","updatedAt":"2026-05-22T08:15:00+00:00"}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":2,"from":1,"to":2}}}}}},"operationId":"api_apiadminsettingslocales_get_collection"},"post":{"tags":["Admin Settings: Locales"],"summary":"Create a new locale","description":"Creates a locale. Code must be unique and consist of lowercase letters/digits.","requestBody":{"description":"The new AdminSettingsLocale resource","content":{"application/json":{"schema":{"type":"object","required":["code","name","direction"],"properties":{"code":{"type":"string","example":"fr"},"name":{"type":"string","example":"French"},"direction":{"type":"string","enum":["ltr","rtl"],"example":"ltr"},"logo_path":{"type":"string","nullable":true,"example":"locales/fr.png"}}}}},"required":true},"responses":{"201":{"description":"Locale created.","content":{"application/json":{"example":{"id":5,"code":"fr","name":"French","direction":"ltr","logoPath":null,"logoUrl":null,"createdAt":"2026-05-22T08:15:00+00:00","updatedAt":"2026-05-22T08:15:00+00:00"}}}},"422":{"description":"Validation failure (missing/duplicate code, invalid direction)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingslocales_post"}},"/settings/locales/{id}":{"get":{"tags":["Admin Settings: Locales"],"summary":"Locale detail","description":"Locale detail","parameters":[{"name":"id","in":"path","description":"Locale ID.","required":true,"schema":{"type":"integer","example":5}}],"responses":{"200":{"description":"Single locale row.","content":{"application/json":{"example":{"id":5,"code":"fr","name":"French","direction":"ltr","logoPath":null,"logoUrl":null,"createdAt":"2026-05-22T08:15:00+00:00","updatedAt":"2026-05-22T08:15:00+00:00"}}}},"404":{"description":"Locale not found."}},"operationId":"api_apiadminsettingslocales_id_get"},"put":{"tags":["Admin Settings: Locales"],"summary":"Update a locale","description":"Updates a locale. Code uniqueness excludes self.","parameters":[{"name":"id","in":"path","description":"Locale ID.","required":true,"schema":{"type":"integer","example":5}}],"requestBody":{"description":"The updated AdminSettingsLocale resource","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","example":"fr"},"name":{"type":"string","example":"French (FR)"},"direction":{"type":"string","enum":["ltr","rtl"],"example":"ltr"},"logo_path":{"type":"string","nullable":true}}}}},"required":true},"responses":{"200":{"description":"Locale updated.","content":{"application/json":{"example":{"id":5,"code":"fr","name":"French (FR)","direction":"ltr","logoPath":"locales/fr.png","logoUrl":"https://your-domain.com/storage/locales/fr.png","createdAt":"2026-05-22T08:15:00+00:00","updatedAt":"2026-05-25T09:30:00+00:00"}}}},"404":{"description":"Locale not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingslocales_id_put"},"delete":{"tags":["Admin Settings: Locales"],"summary":"Delete a locale","description":"Refuses if this is the only remaining locale or if a channel uses it as its default locale.","parameters":[{"name":"id","in":"path","description":"Locale ID.","required":true,"schema":{"type":"integer","example":5}}],"responses":{"200":{"description":"Locale deleted.","content":{"application/json":{"example":{"message":"Locale deleted successfully."}}}},"400":{"description":"Refused \u2014 last locale or channel default."},"404":{"description":"Locale not found."}},"operationId":"api_apiadminsettingslocales_id_delete"}},"/settings/locales/mass-delete":{"post":{"tags":["Admin Settings: Locales"],"summary":"Mass delete locales","description":"Deletes a batch of locales. Non-existent IDs are silently skipped; locales that are last-remaining or channel defaults are skipped with a reason in the response.","requestBody":{"description":"The new AdminSettingsLocaleMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[5,7]}}}}},"required":true},"responses":{"200":{"description":"Locales deleted.","content":{"application/json":{"example":{"deleted":[5,7],"message":"Locales deleted successfully."}}}},"422":{"description":"Empty indices."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingslocalesmass-delete_post"}},"/settings/roles":{"get":{"tags":["Admin Settings: Roles"],"summary":"List roles","description":"Datagrid-parity listing. Filters: name (LIKE), permission_type. Sort: id (default desc), name.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"permission_type","in":"query","description":"Filter by permission_type.","schema":{"type":"string","enum":["all","custom"]}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list in { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingsroles_get_collection"},"post":{"tags":["Admin Settings: Roles"],"summary":"Create a new role","description":"Validates name, description, permission_type (all|custom). When permission_type=custom, permissions array is required.","requestBody":{"description":"The new AdminSettingsRole resource","content":{"application/json":{"schema":{"type":"object","required":["name","description","permission_type"],"properties":{"name":{"type":"string","example":"Catalog Manager"},"description":{"type":"string","example":"Can manage catalog only"},"permission_type":{"type":"string","enum":["all","custom"],"example":"custom"},"permissions":{"type":"array","items":{"type":"string"},"example":["catalog.products","catalog.categories"]}}}}},"required":true},"responses":{"201":{"description":"Role created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsroles_post"}},"/settings/roles/{id}":{"get":{"tags":["Admin Settings: Roles"],"summary":"Role detail","description":"Role detail","parameters":[{"name":"id","in":"path","description":"Role ID.","required":true,"schema":{"type":"integer","example":2}}],"responses":{"200":{"description":"Single role.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Role not found."}},"operationId":"api_apiadminsettingsroles_id_get"},"put":{"tags":["Admin Settings: Roles"],"summary":"Update a role","description":"Update a role","parameters":[{"name":"id","in":"path","description":"Role ID.","required":true,"schema":{"type":"integer","example":2}}],"requestBody":{"description":"The updated AdminSettingsRole resource","content":{"application/json":{"schema":{"type":"object","required":["name","description","permission_type"],"properties":{"name":{"type":"string","example":"Catalog Manager"},"description":{"type":"string","example":"Updated description"},"permission_type":{"type":"string","enum":["all","custom"],"example":"custom"},"permissions":{"type":"array","items":{"type":"string"},"example":["catalog.products"]}}}}},"required":true},"responses":{"200":{"description":"Role updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Role not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsroles_id_put"},"delete":{"tags":["Admin Settings: Roles"],"summary":"Delete a role","description":"Refuses with HTTP 400 when the role is assigned to any admin (admins.role_id), or when it is the only remaining role.","parameters":[{"name":"id","in":"path","description":"Role ID.","required":true,"schema":{"type":"integer","example":2}}],"responses":{"200":{"description":"Role deleted."},"400":{"description":"In use or last remaining role."},"404":{"description":"Role not found."}},"operationId":"api_apiadminsettingsroles_id_delete"}},"/settings/tax-categories":{"get":{"tags":["Admin Settings: Tax Categories"],"summary":"List tax categories (datagrid parity)","description":"Paginated, filterable, sortable tax categories list. Filters: code, name (LIKE). Sort: id (default desc), code, name.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"code","in":"query","description":"Partial code match.","schema":{"type":"string"}},{"name":"name","in":"query","description":"Partial name match.","schema":{"type":"string"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","code","name"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingstax-categories_get_collection"},"post":{"tags":["Admin Settings: Tax Categories"],"summary":"Create a tax category","description":"Create a tax category","requestBody":{"description":"The new AdminSettingsTaxCategory resource","content":{"application/json":{"schema":{"type":"object","required":["code","name","description","taxrates"],"properties":{"code":{"type":"string","example":"reduced-rate"},"name":{"type":"string","example":"Reduced Rate"},"description":{"type":"string","example":"Reduced VAT for essentials"},"taxrates":{"type":"array","items":{"type":"integer"},"example":[1,2]}}}}},"required":true},"responses":{"201":{"description":"Tax category created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingstax-categories_post"}},"/settings/tax-categories/{id}":{"get":{"tags":["Admin Settings: Tax Categories"],"summary":"Tax category detail","description":"Tax category detail","parameters":[{"name":"id","in":"path","description":"Settings tax category ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single tax category including attached tax_rates.","content":{"application/json":{"example":{"id":1,"code":"reduced-rate","name":"Reduced Rate","description":"Reduced VAT for essentials","taxRates":[{"id":1,"identifier":"IN-VAT-5","taxRate":5}],"createdAt":"2026-04-30T14:20:09+00:00","updatedAt":"2026-04-30T14:20:09+00:00"}}}},"404":{"description":"Tax category not found."}},"operationId":"api_apiadminsettingstax-categories_id_get"},"put":{"tags":["Admin Settings: Tax Categories"],"summary":"Update a tax category","description":"Code uniqueness excludes the current id. Re-syncs the tax_rates pivot to the supplied taxrates list.","parameters":[{"name":"id","in":"path","description":"Settings tax category ID","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The updated AdminSettingsTaxCategory resource","content":{"application/json":{"schema":{"type":"object","required":["code","name","description","taxrates"],"properties":{"code":{"type":"string","example":"reduced-rate"},"name":{"type":"string","example":"Reduced Rate"},"description":{"type":"string","example":"Reduced VAT for essentials"},"taxrates":{"type":"array","items":{"type":"integer"},"example":[1]}}}}},"required":true},"responses":{"200":{"description":"Tax category updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Tax category not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingstax-categories_id_put"},"delete":{"tags":["Admin Settings: Tax Categories"],"summary":"Delete a tax category","description":"Mirrors monolith TaxCategoryController::destroy \u2014 refuses with HTTP 400 if any tax_rates are still attached to the category.","parameters":[{"name":"id","in":"path","description":"Settings tax category ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Tax category deleted."},"400":{"description":"Cannot delete \u2014 tax rates still attached."},"404":{"description":"Tax category not found."}},"operationId":"api_apiadminsettingstax-categories_id_delete"}},"/settings/tax-rates":{"get":{"tags":["Admin Settings: Tax Rates"],"summary":"List tax rates","description":"Paginated, filterable, sortable list. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"identifier","in":"query","description":"Partial match on identifier.","schema":{"type":"string"}},{"name":"country","in":"query","description":"Country code exact.","schema":{"type":"string"}},{"name":"state","in":"query","description":"State exact.","schema":{"type":"string"}},{"name":"tax_rate_from","in":"query","description":"Minimum tax rate (inclusive).","schema":{"type":"number"}},{"name":"tax_rate_to","in":"query","description":"Maximum tax rate (inclusive).","schema":{"type":"number"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","identifier","tax_rate"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingstax-rates_get_collection"},"post":{"tags":["Admin Settings: Tax Rates"],"summary":"Create a new tax rate","description":"Create a new tax rate","requestBody":{"description":"The new AdminSettingsTaxRate resource","content":{"application/json":{"schema":{"type":"object","required":["identifier","country","tax_rate","is_zip"],"properties":{"identifier":{"type":"string","example":"US-CA-SF"},"is_zip":{"type":"boolean","example":false},"zip_code":{"type":"string","example":"94103"},"zip_from":{"type":"string","example":"94100"},"zip_to":{"type":"string","example":"94199"},"state":{"type":"string","example":"CA"},"country":{"type":"string","example":"US"},"tax_rate":{"type":"number","format":"float","example":8.5}}},"examples":{"specific-zip":{"summary":"Specific zip (is_zip=false)","value":{"identifier":"US-CA-SF","is_zip":false,"zip_code":"94103","state":"CA","country":"US","tax_rate":8.5}},"zip-range":{"summary":"Zip range (is_zip=true)","value":{"identifier":"US-CA-BAY","is_zip":true,"zip_from":"94000","zip_to":"94999","state":"CA","country":"US","tax_rate":8.25}}}}},"required":true},"responses":{"201":{"description":"Tax rate created.","content":{"application/json":{"example":{"id":4,"identifier":"US-CA-SF","isZip":false,"zipCode":"94103","zipFrom":null,"zipTo":null,"state":"CA","country":"US","taxRate":8.5,"createdAt":"2026-05-25T08:15:00+00:00","updatedAt":"2026-05-25T08:15:00+00:00"}}}},"422":{"description":"Validation failure (missing field, duplicate identifier, conditional zip rules)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingstax-rates_post"}},"/settings/tax-rates/{id}":{"get":{"tags":["Admin Settings: Tax Rates"],"summary":"Tax rate detail","description":"Tax rate detail","parameters":[{"name":"id","in":"path","description":"Tax rate ID.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Single tax rate row.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Tax rate not found."}},"operationId":"api_apiadminsettingstax-rates_id_get"},"put":{"tags":["Admin Settings: Tax Rates"],"summary":"Update a tax rate","description":"Partial update; identifier uniqueness excludes self.","parameters":[{"name":"id","in":"path","description":"Tax rate ID.","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminSettingsTaxRate resource","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}},"required":true},"responses":{"200":{"description":"Tax rate updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Tax rate not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingstax-rates_id_put"},"delete":{"tags":["Admin Settings: Tax Rates"],"summary":"Delete a tax rate","description":"Delete a tax rate","parameters":[{"name":"id","in":"path","description":"Tax rate ID.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Tax rate deleted (pivot to tax_categories cascades).","content":{"application/json":{"example":{"message":"Tax rate deleted successfully."}}}},"404":{"description":"Tax rate not found."}},"operationId":"api_apiadminsettingstax-rates_id_delete"}},"/settings/tax-rates/export":{"get":{"tags":["Admin Settings: Tax Rates"],"summary":"Export tax rates as csv, xls or xlsx","description":"Streams the tax-rate datagrid as a csv, xls or xlsx download (the admin Export button). Honours the same filters as the listing. REST only; send the Accept header matching the requested format.","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"example":"csv"}},{"name":"identifier","in":"query","description":"Partial match on identifier.","schema":{"type":"string"}},{"name":"country","in":"query","description":"Country code exact.","schema":{"type":"string"}},{"name":"state","in":"query","description":"State exact.","schema":{"type":"string"}},{"name":"tax_rate_from","in":"query","description":"Minimum tax rate (inclusive).","schema":{"type":"number"}},{"name":"tax_rate_to","in":"query","description":"Maximum tax rate (inclusive).","schema":{"type":"number"}}],"responses":{"200":{"description":"Export file downloaded as an attachment (tax-rates.csv, .xls or .xlsx).","content":{"text/csv":{"schema":[]},"application/vnd.ms-excel":{"schema":[]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":[]}}},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadminsettingstax-ratesexport_get"}},"/settings/themes":{"get":{"tags":["Admin Settings: Themes"],"summary":"List theme customizations","description":"Paginated, filterable, sortable list of theme customizations. Returns the standard { data, meta } admin envelope.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"name","in":"query","description":"Filter by name (partial match).","schema":{"type":"string"}},{"name":"type","in":"query","description":"Filter by type (exact).","schema":{"type":"string"}},{"name":"theme_code","in":"query","description":"Filter by theme_code (exact).","schema":{"type":"string"}},{"name":"channel_id","in":"query","description":"Filter by channel id.","schema":{"type":"integer"}},{"name":"status","in":"query","description":"Filter by status (0/1).","schema":{"type":"integer"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name","type","sort_order","theme_code","channel_id","status"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list in the { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingsthemes_get_collection"},"post":{"tags":["Admin Settings: Themes"],"summary":"Create a theme customization","description":"Step-1 create: name, sort_order, type, channel_id, theme_code. Per-locale `options` are configured via PUT.","requestBody":{"description":"The new AdminSettingsTheme resource","content":{"application/json":{"schema":{"type":"object","required":["name","sort_order","type","channel_id","theme_code"],"properties":{"name":{"type":"string","example":"Homepage Banner"},"sort_order":{"type":"integer","example":1},"type":{"type":"string","enum":["product_carousel","category_carousel","static_content","image_carousel","footer_links","services_content"],"example":"image_carousel"},"channel_id":{"type":"integer","example":1},"theme_code":{"type":"string","example":"default"},"status":{"type":"boolean","example":true}}}}},"required":true},"responses":{"201":{"description":"Theme customization created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Validation failure (missing field, invalid type, unknown channel_id)."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsthemes_post"}},"/settings/themes/{id}":{"get":{"tags":["Admin Settings: Themes"],"summary":"Theme customization detail","description":"Theme customization detail","parameters":[{"name":"id","in":"path","description":"Theme customization ID.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Single theme row with per-locale translations inlined.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Theme not found."}},"operationId":"api_apiadminsettingsthemes_id_get"},"put":{"tags":["Admin Settings: Themes"],"summary":"Update a theme customization","description":"Updates a theme customization. Pass `locale` + `options` to write per-locale options.","parameters":[{"name":"id","in":"path","description":"Theme customization ID.","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The updated AdminSettingsTheme resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"sort_order":{"type":"integer"},"type":{"type":"string"},"channel_id":{"type":"integer"},"theme_code":{"type":"string"},"status":{"type":"boolean"},"locale":{"type":"string","example":"en"},"options":{"type":"object"}}}}},"required":true},"responses":{"200":{"description":"Theme updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Theme not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsthemes_id_put"},"delete":{"tags":["Admin Settings: Themes"],"summary":"Delete a theme customization","description":"Delete a theme customization","parameters":[{"name":"id","in":"path","description":"Theme customization ID.","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Theme deleted."},"404":{"description":"Theme not found."}},"operationId":"api_apiadminsettingsthemes_id_delete"}},"/settings/themes/mass-delete":{"post":{"tags":["Admin Settings: Themes"],"summary":"Mass delete theme customizations","description":"Mass delete theme customizations","requestBody":{"description":"The new AdminSettingsThemeMassDelete resource","content":{"application/json":{"schema":{"type":"object","required":["indices"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[3,4]}}}}},"required":true},"responses":{"200":{"description":"Themes deleted.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Empty indices."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsthemesmass-delete_post"}},"/settings/themes/mass-update-status":{"post":{"tags":["Admin Settings: Themes"],"summary":"Mass update status of theme customizations","description":"Mass update status of theme customizations","requestBody":{"description":"The new AdminSettingsThemeMassUpdateStatus resource","content":{"application/json":{"schema":{"type":"object","required":["indices","value"],"properties":{"indices":{"type":"array","items":{"type":"integer"},"example":[3,4]},"value":{"type":"integer","enum":[0,1],"example":1}}}}},"required":true},"responses":{"200":{"description":"Statuses updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Invalid input."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsthemesmass-update-status_post"}},"/settings/users":{"get":{"tags":["Admin Settings: Users"],"summary":"List admin users","description":"List admin users","parameters":[{"name":"page","in":"query","description":"Page (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"name","in":"query","description":"Filter by name (partial match).","schema":{"type":"string"}},{"name":"email","in":"query","description":"Filter by email (partial match).","schema":{"type":"string"}},{"name":"role_id","in":"query","description":"Filter by role ID.","schema":{"type":"integer"}},{"name":"status","in":"query","description":"Filter by status (0/1).","schema":{"type":"integer","enum":[0,1]}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","name","email"],"example":"id"}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"],"example":"desc"}}],"responses":{"200":{"description":"Paginated list in { data, meta } envelope.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}}},"operationId":"api_apiadminsettingsusers_get_collection"},"post":{"tags":["Admin Settings: Users"],"summary":"Create a new admin user","description":"Create a new admin user","requestBody":{"description":"The new AdminSettingsUser resource","content":{"application/json":{"schema":{"type":"object","required":["name","email","password","role_id"],"properties":{"name":{"type":"string","example":"Jane Doe"},"email":{"type":"string","example":"jane@example.com"},"password":{"type":"string","example":"secret123"},"role_id":{"type":"integer","example":1},"status":{"type":"integer","enum":[0,1],"example":1},"image":{"type":"string","nullable":true,"example":"admins/jane.png"}}}}},"required":true},"responses":{"201":{"description":"Admin created.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsusers_post"}},"/settings/users/{id}":{"get":{"tags":["Admin Settings: Users"],"summary":"Admin user detail","description":"Admin user detail","parameters":[{"name":"id","in":"path","description":"Admin ID.","required":true,"schema":{"type":"integer","example":5}}],"responses":{"200":{"description":"Single admin row.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Admin not found."}},"operationId":"api_apiadminsettingsusers_id_get"},"put":{"tags":["Admin Settings: Users"],"summary":"Update an admin user","description":"Update an admin user","parameters":[{"name":"id","in":"path","description":"Admin ID.","required":true,"schema":{"type":"integer","example":5}}],"requestBody":{"description":"The updated AdminSettingsUser resource","content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"password":{"type":"string","nullable":true},"role_id":{"type":"integer"},"status":{"type":"integer","enum":[0,1]},"image":{"type":"string","nullable":true}}}}},"required":true},"responses":{"200":{"description":"Admin updated.","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Admin not found."},"422":{"description":"Validation failure."},"400":{"description":"Invalid input"}},"operationId":"api_apiadminsettingsusers_id_put"},"delete":{"tags":["Admin Settings: Users"],"summary":"Delete an admin user","description":"Refuses if the caller is deleting themselves or if this is the last admin.","parameters":[{"name":"id","in":"path","description":"Admin ID.","required":true,"schema":{"type":"integer","example":5}}],"responses":{"200":{"description":"Admin deleted."},"400":{"description":"Refused \u2014 self-delete or last admin."},"404":{"description":"Admin not found."}},"operationId":"api_apiadminsettingsusers_id_delete"}},"/settings/users/delete-self":{"post":{"tags":["Admin Settings: Users"],"summary":"Delete your own admin account (password-confirmed)","description":"Deletes the authenticated admin (the owner of the calling token) after re-confirming their password. Refuses if this is the last remaining admin (400) or the password is wrong (422).","requestBody":{"description":"The new AdminSettingsUserDeleteSelf resource","content":{"application/json":{"schema":{"type":"object","required":["password"],"properties":{"password":{"type":"string","example":"current-password"}}}}},"required":true},"responses":{"200":{"description":"Account deleted.","content":{"application/json":{"example":{"success":true,"message":"Your admin account has been deleted."}}}},"400":{"description":"Last remaining admin cannot be deleted."},"422":{"description":"Missing or incorrect password."}},"operationId":"api_apiadminsettingsusersdelete-self_post"}},"/shipments":{"get":{"tags":["Admin Sales: Shipments"],"summary":"List shipments (datagrid parity)","description":"Paginated shipments listing mirroring the admin Sales \u2192 Shipments datagrid. Every shipment column plus the order/customer context and billing/shipping addresses is populated on each row (line items are detail-only). Returns a `{ data, meta }` envelope. Requires `sales.shipments.view` permission.","parameters":[{"name":"page","in":"query","description":"Page number (1-based).","schema":{"type":"integer","example":1}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer","example":10}},{"name":"id","in":"query","description":"Filter by shipment id (integer or comma-list).","schema":{"type":"string","example":"7"}},{"name":"order_id","in":"query","description":"Partial order increment_id match.","schema":{"type":"string"}},{"name":"total_qty","in":"query","description":"Exact total quantity.","schema":{"type":"integer"}},{"name":"inventory_source_name","in":"query","description":"Partial inventory source name.","schema":{"type":"string"}},{"name":"shipped_to","in":"query","description":"Partial shipped-to name match.","schema":{"type":"string"}},{"name":"order_date_from","in":"query","description":"Order created after.","schema":{"type":"string","format":"date"}},{"name":"order_date_to","in":"query","description":"Order created before.","schema":{"type":"string","format":"date"}},{"name":"created_at_from","in":"query","description":"Shipment created after.","schema":{"type":"string","format":"date"}},{"name":"created_at_to","in":"query","description":"Shipment created before.","schema":{"type":"string","format":"date"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","order_id","total_qty","inventory_source_name","shipped_to","order_date","created_at"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated list of shipments in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":7,"orderId":8,"orderIncrementId":"00000000008","shippedTo":"John Doe","orderDate":"2026-05-20 10:00:00","orderStatus":"processing","orderStatusLabel":"Processing","channelName":"Default","customerName":"John Doe","customerEmail":"john.doe@example.com","paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","orderCurrencyCode":"USD","shippingMethod":"flatrate_flatrate","shippingTitle":"Flat Rate - Flat Rate","baseShippingAmount":30,"formattedBaseShippingAmount":"$30.00","status":null,"totalQty":2,"totalWeight":null,"carrierCode":null,"carrierTitle":"UPS","trackNumber":"1Z999AA1","emailSent":false,"inventorySourceId":1,"inventorySourceName":"Default","billingAddress":{"id":16,"addressType":"order_billing","firstName":"John","lastName":"Doe","city":"Los Angeles","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"shippingAddress":{"id":15,"addressType":"order_shipping","firstName":"John","lastName":"Doe","city":"Los Angeles","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"createdAt":"2026-05-20 12:00:00","updatedAt":"2026-05-20 12:00:00","items":[]}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadminshipments_get_collection"}},"/shipments/{id}":{"get":{"tags":["Admin Sales: Shipments"],"summary":"Get shipment detail","description":"Returns a single shipment \u2014 every column, the order/customer context, billing & shipping addresses, the inventory source, and the shipped line items. Requires `sales.shipments.view` permission.","parameters":[{"name":"id","in":"path","description":"Shipment ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The shipment.","content":{"application/json":{"example":{"id":7,"orderId":8,"orderIncrementId":"00000000008","shippedTo":"John Doe","orderDate":"2026-05-20 10:00:00","orderStatus":"processing","orderStatusLabel":"Processing","channelName":"Default","customerName":"John Doe","customerEmail":"john.doe@example.com","paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","orderCurrencyCode":"USD","shippingMethod":"flatrate_flatrate","shippingTitle":"Flat Rate - Flat Rate","baseShippingAmount":30,"formattedBaseShippingAmount":"$30.00","status":null,"totalQty":2,"totalWeight":null,"carrierCode":null,"carrierTitle":"UPS","trackNumber":"1Z999AA1","emailSent":false,"inventorySourceId":1,"inventorySourceName":"Default","billingAddress":{"id":16,"addressType":"order_billing","firstName":"John","lastName":"Doe","city":"Los Angeles","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"shippingAddress":{"id":15,"addressType":"order_shipping","firstName":"John","lastName":"Doe","city":"Los Angeles","country":"US","postcode":"90001","email":"john.doe@example.com","phone":"5551234567"},"createdAt":"2026-05-20 12:00:00","updatedAt":"2026-05-20 12:00:00","items":[{"id":11,"orderItemId":42,"sku":"TSHIRT-RED-M","name":"Red T-Shirt","qty":2}]}}}},"404":{"description":"Unknown shipment id."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.shipments.view."}},"operationId":"api_apiadminshipments_id_get"}},"/orders/{orderId}/shipments":{"post":{"tags":["Admin Sales: Orders"],"summary":"Create a shipment for an order","description":"Create a shipment for an order","parameters":[{"name":"orderId","in":"path","description":"Order ID","required":true,"schema":{"type":"integer"}}],"requestBody":{"description":"The new AdminShipment resource","content":{"application/json":{"schema":{"type":"object"},"example":{"source":1,"items":[{"orderItemId":42,"inventorySourceId":1,"quantity":3}],"carrierTitle":"UPS","trackNumber":"1Z999AA1"}}},"required":true},"responses":{"201":{"description":"AdminShipment resource created","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"400":{"description":"Invalid input"},"422":{"description":"Validation Error"}},"operationId":"api_apiadminorders_orderIdshipments_post"}},"/shipments/export":{"get":{"tags":["Admin Sales: Shipments"],"summary":"Export shipments as csv, xls or xlsx","description":"Downloads the shipments datagrid as a csv, xls or xlsx file \u2014 the same data the admin Export button produces. Honours the same filters as the listing. Binary download, not JSON. Pick the file type with ?format=csv|xls|xlsx (default csv).","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}}],"responses":{"200":{"description":"Export file downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks the view permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadminshipmentsexport_get"}},"/transactions":{"get":{"tags":["Admin Sales: Transactions"],"summary":"List order transactions (datagrid parity)","description":"Paginated transactions listing mirroring the admin Sales \u2192 Transactions datagrid. Every transaction column plus the raw gateway `data` blob and the linked order summary is populated on each row. Returns a `{ data, meta }` envelope. Requires `sales.transactions.view` permission.","parameters":[{"name":"page","in":"query","description":"Page number.","schema":{"type":"integer"}},{"name":"per_page","in":"query","description":"Items per page (default 10, max 50).","schema":{"type":"integer"}},{"name":"id","in":"query","description":"Filter by transaction row id (integer or comma-list).","schema":{"type":"string"}},{"name":"transaction_id","in":"query","description":"Partial gateway transaction id.","schema":{"type":"string"}},{"name":"invoice_id","in":"query","description":"Filter by invoice id.","schema":{"type":"integer"}},{"name":"order_id","in":"query","description":"Partial order increment_id.","schema":{"type":"string"}},{"name":"status","in":"query","description":"Transaction status.","schema":{"type":"string","enum":["paid","pending","COMPLETED"]}},{"name":"created_at_from","in":"query","description":"Created after.","schema":{"type":"string","format":"date"}},{"name":"created_at_to","in":"query","description":"Created before.","schema":{"type":"string","format":"date"}},{"name":"sort","in":"query","description":"Sort column.","schema":{"type":"string","enum":["id","transaction_id","amount","invoice_id","order_id","status","created_at"]}},{"name":"order","in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Paginated transactions in the { data, meta } envelope.","content":{"application/json":{"example":{"data":[{"id":4,"transactionId":"pi_3PqXyz9aBcD","invoiceId":12,"orderId":8,"orderIncrementId":"00000000008","amount":99.99,"formattedAmount":"$99.99","status":"paid","type":"capture","paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","data":{"gateway":"offline","captured":true},"createdAt":"2026-05-20 12:35:00","updatedAt":"2026-05-20 12:35:00","order":{"id":8,"incrementId":"00000000008","status":"processing","customerName":"John Doe","customerEmail":"john.doe@example.com","grandTotal":99.99,"orderCurrencyCode":"USD"}}],"meta":{"currentPage":1,"perPage":10,"lastPage":1,"total":1,"from":1,"to":1}}}}}},"operationId":"api_apiadmintransactions_get_collection"},"post":{"tags":["Admin Sales: Transactions"],"summary":"Record a payment (create transaction)","description":"Records a manual payment against an invoice \u2014 the admin Sales \u2192 Transactions \"Record Payment\" action. Inserts a paid `order_transactions` row; when the cumulative payments reach the invoice grand total it marks the invoice paid and advances the order to completed (if a shipment exists) or processing. Returns the created transaction. Requires `sales.transactions.view` permission. Errors: 422 (missing/non-numeric fields), 400 (unknown invoice, invoice already paid, amount \u2264 0, or amount would exceed the invoice grand total).","requestBody":{"description":"The new AdminTransaction resource","content":{"application/json":{"schema":{"type":"object","required":["invoiceId","paymentMethod","amount"],"properties":{"invoiceId":{"type":"integer","example":12},"paymentMethod":{"type":"string","example":"cashondelivery"},"amount":{"type":"number","example":99.99}}},"example":{"invoiceId":12,"paymentMethod":"cashondelivery","amount":99.99}}},"required":true},"responses":{"201":{"description":"The created transaction.","content":{"application/json":{"example":{"id":4,"transactionId":"pi_3PqXyz9aBcD","invoiceId":12,"orderId":8,"orderIncrementId":"00000000008","amount":99.99,"formattedAmount":"$99.99","status":"paid","type":"capture","paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","data":{"gateway":"offline","captured":true},"createdAt":"2026-05-20 12:35:00","updatedAt":"2026-05-20 12:35:00","order":{"id":8,"incrementId":"00000000008","status":"processing","customerName":"John Doe","customerEmail":"john.doe@example.com","grandTotal":99.99,"orderCurrencyCode":"USD"}}}}},"400":{"description":"Unknown invoice, invoice already paid, amount \u2264 0, or amount exceeds the invoice grand total."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.transactions.view."},"422":{"description":"Missing or non-numeric invoiceId / paymentMethod / amount."}},"operationId":"api_apiadmintransactions_post"}},"/transactions/{id}":{"get":{"tags":["Admin Sales: Transactions"],"summary":"Get a transaction by id","description":"Returns a single payment transaction \u2014 every column, the raw gateway `data` blob, and a slim summary of the linked order. Requires `sales.transactions.view` permission.","parameters":[{"name":"id","in":"path","description":"Transaction row ID","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"The transaction.","content":{"application/json":{"example":{"id":4,"transactionId":"pi_3PqXyz9aBcD","invoiceId":12,"orderId":8,"orderIncrementId":"00000000008","amount":99.99,"formattedAmount":"$99.99","status":"paid","type":"capture","paymentMethod":"cashondelivery","paymentTitle":"Cash On Delivery","data":{"gateway":"offline","captured":true},"createdAt":"2026-05-20 12:35:00","updatedAt":"2026-05-20 12:35:00","order":{"id":8,"incrementId":"00000000008","status":"processing","customerName":"John Doe","customerEmail":"john.doe@example.com","grandTotal":99.99,"orderCurrencyCode":"USD"}}}}},"404":{"description":"Unknown transaction id."},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks sales.transactions.view."}},"operationId":"api_apiadmintransactions_id_get"}},"/transactions/export":{"get":{"tags":["Admin Sales: Transactions"],"summary":"Export transactions as csv, xls or xlsx","description":"Downloads the transactions datagrid as a csv, xls or xlsx file \u2014 the same data the admin Export button produces. Honours the same filters as the listing. Binary download, not JSON. Pick the file type with ?format=csv|xls|xlsx (default csv).","parameters":[{"name":"format","in":"query","description":"Export format: csv, xls or xlsx. Defaults to csv.","schema":{"type":"string","enum":["csv","xls","xlsx"],"default":"csv"}}],"responses":{"200":{"description":"Export file downloaded as an attachment.","content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.ms-excel":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Missing or invalid admin token."},"403":{"description":"Admin role lacks the view permission."},"422":{"description":"Unsupported format (csv, xls and xlsx only)."},"404":{"description":"Not found"}},"operationId":"api_apiadmintransactionsexport_get"}},"/orders/{id}":{"get":{"tags":["Admin Sales: Orders"],"summary":"Get order detail","description":"Full order-view payload \u2014 flat order fields plus embedded customer, billing/shipping addresses, items, invoices, shipments, refunds, and comments. Over GraphQL the nested collections are field-selectable connections (items { edges { node } }) and the to-one objects are typed (customer { name }); over REST they are flat arrays/objects.","parameters":[{"name":"id","in":"path","description":"Order detail ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"AdminOrderDetail resource","content":{"application/json":{"schema":[]},"text/html":{"schema":[]}}},"404":{"description":"Not found"}},"operationId":"api_apiadminorders_id_get"}}},"components":{"schemas":{"AdminCancelOrder.OrderDetailRestDto":[],"AdminCancelOrder.OrderDetailRestDto.html":[],"AdminCart":[],"AdminCart.html":[],"AdminCatalogProductCustomerGroupPrice":[],"AdminCatalogProductCustomerGroupPrice.html":[],"AdminCmsPage.AdminCmsPageDetailDto":[],"AdminCmsPage.AdminCmsPageDetailDto.html":[],"AdminEuWithdrawal":[],"AdminEuWithdrawal.html":[],"AdminInvoice.AdminInvoiceRestDto":[],"AdminInvoice.AdminInvoiceRestDto.html":[],"AdminOrderComment":[],"AdminOrderComment.html":[],"AdminOrderDetail.OrderDetailRestDto":[],"AdminOrderDetail.OrderDetailRestDto.html":[],"AdminRefund":[],"AdminRefund.RefundTotalsSummary":[],"AdminRefund.RefundTotalsSummary.html":[],"AdminRefund.html":[],"AdminReportingCustomers":[],"AdminReportingCustomers.csv":[],"AdminReportingCustomers.html":[],"AdminReportingCustomers.xls":[],"AdminReportingCustomers.xlsx":[],"AdminReportingOverview":[],"AdminReportingOverview.html":[],"AdminReportingProducts":[],"AdminReportingProducts.csv":[],"AdminReportingProducts.html":[],"AdminReportingProducts.xls":[],"AdminReportingProducts.xlsx":[],"AdminReportingSales":[],"AdminReportingSales.csv":[],"AdminReportingSales.html":[],"AdminReportingSales.xls":[],"AdminReportingSales.xlsx":[],"AdminReturn":[],"AdminReturn.html":[],"AdminRmaCustomFieldMassDelete":[],"AdminRmaCustomFieldMassDelete.html":[],"AdminRmaCustomFieldMassUpdateStatus":[],"AdminRmaCustomFieldMassUpdateStatus.html":[],"AdminRmaReasonMassDelete":[],"AdminRmaReasonMassDelete.html":[],"AdminRmaReasonMassUpdateStatus":[],"AdminRmaReasonMassUpdateStatus.html":[],"AdminRmaRuleMassDelete":[],"AdminRmaRuleMassDelete.html":[],"AdminRmaRuleMassUpdateStatus":[],"AdminRmaRuleMassUpdateStatus.html":[],"AdminRmaStatusMassDelete":[],"AdminRmaStatusMassDelete.html":[],"AdminRmaStatusMassUpdateStatus":[],"AdminRmaStatusMassUpdateStatus.html":[],"AdminSettingsChannel.AdminSettingsChannelRestDto":[],"AdminSettingsChannel.AdminSettingsChannelRestDto.html":[],"AdminSettingsCurrency":[],"AdminSettingsCurrency.html":[],"AdminSettingsDataTransferImport":[],"AdminSettingsDataTransferImport.html":[],"AdminSettingsDataTransferImportDownload.binary":[],"AdminSettingsDataTransferImportIndex.AdminSettingsDataTransferImport":[],"AdminSettingsDataTransferImportIndex.AdminSettingsDataTransferImport.html":[],"AdminSettingsDataTransferImportLink.AdminSettingsDataTransferImport":[],"AdminSettingsDataTransferImportLink.AdminSettingsDataTransferImport.html":[],"AdminSettingsDataTransferImportStart.AdminSettingsDataTransferImport":[],"AdminSettingsDataTransferImportStart.AdminSettingsDataTransferImport.html":[],"AdminSettingsDataTransferImportStats.AdminSettingsDataTransferImport":[],"AdminSettingsDataTransferImportStats.AdminSettingsDataTransferImport.html":[],"AdminSettingsDataTransferImportValidate.AdminSettingsDataTransferImport":[],"AdminSettingsDataTransferImportValidate.AdminSettingsDataTransferImport.html":[],"AdminSettingsExchangeRate":[],"AdminSettingsExchangeRate.html":[],"AdminSettingsInventorySource":[],"AdminSettingsInventorySource.html":[],"AdminSettingsRole":[],"AdminSettingsRole.html":[],"AdminSettingsTaxCategory":[],"AdminSettingsTaxCategory.AdminSettingsTaxCategoryRestDto":[],"AdminSettingsTaxCategory.AdminSettingsTaxCategoryRestDto.html":[],"AdminSettingsTaxCategory.html":[],"AdminSettingsTaxRate":[],"AdminSettingsTaxRate.AdminSettingsTaxRateUpdateInput":[],"AdminSettingsTaxRate.csv":[],"AdminSettingsTaxRate.html":[],"AdminSettingsTaxRate.xls":[],"AdminSettingsTaxRate.xlsx":[],"AdminSettingsTheme":[],"AdminSettingsTheme.AdminSettingsThemeRestDto":[],"AdminSettingsTheme.AdminSettingsThemeRestDto.html":[],"AdminSettingsTheme.html":[],"AdminSettingsThemeMassDelete":[],"AdminSettingsThemeMassDelete.html":[],"AdminSettingsThemeMassUpdateStatus":[],"AdminSettingsThemeMassUpdateStatus.html":[],"AdminSettingsUser":[],"AdminSettingsUser.html":[],"AdminShipment":[],"AdminShipment.html":[]},"responses":[],"parameters":[],"requestBodies":[],"securitySchemes":{"bearerAuth":{"type":"http","description":"Value for the http bearer parameter.","scheme":"bearer","bearerFormat":"UUID"}}},"security":[{"bearerAuth":[]}]}