# Product Search Endpoint

## Pre-requisites

This endpoint performs product search queries using Elasticsearch. Make sure your product documents are indexed before using this route:

```
php artisan aero:search:reindex --type=product
```

<p class="callout info">You must run this command **after** installing the API.</p>

## Structure

See [<span class="s1">View Product Endpoint</span>](https://support.aerocommerce.com/books/api/page/view-product-endpoint) for the structure of the order payload inside the data array.

<table border="1" id="bkmrk-name-description-exa" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr><td>**Name**  
</td><td>**Description**  
</td><td>**Example**  
</td></tr><tr><td>`active`</td><td>Only return active products</td><td>`?scope=active`</td></tr><tr><td>`inactive`</td><td>Only return inactive products</td><td>`?scope=inactive`</td></tr><tr><td>`visible`</td><td>Only return visible products</td><td>`?scope=visible`</td></tr><tr><td>`hidden`</td><td>Only return hidden products</td><td>`?scope=hidden`</td></tr><tr><td>`categorised`</td><td>Only return products that are in a category</td><td>`?scope=categorised`</td></tr><tr><td>`un-categorised`</td><td>Only return products that aren't in a category</td><td>`?scope=un-categorised`</td></tr><tr><td>`published`</td><td>Only return published products</td><td>`?scope=published`</td></tr><tr><td>`unpublished`</td><td>Only return unpublished products</td><td>`?scope=unpublished`</td></tr><tr><td>`scheduled`</td><td>Only return scheduled to be published products</td><td>`?scope=scheduled`</td></tr><tr><td>`has-stock`</td><td>Only return products that have stock</td><td>`?scope=has-stock`</td></tr><tr><td>`out-of-stock`</td><td>Only return products that don't have stock</td><td>`?scope=out-of-stock`</td></tr><tr><td>`not-tracking-stock`</td><td>Only return products that aren't tracking stock</td><td>`?scope=not-tracking-stock`</td></tr><tr><td>`reduced`</td><td>Only return reduced products</td><td>`?scope=reduced`</td></tr><tr><td>`not-reduced`</td><td>Only return non-reduced products</td><td>`?scope=not-reduced`</td></tr><tr><td>`has-images`</td><td>Only return products that have images</td><td>`?scope=has-images`</td></tr><tr><td>`no-images`</td><td>Only return products that don't have images</td><td>`?scope=no-images`</td></tr></tbody></table>

## Filters

<table border="1" id="bkmrk-name-description-exa-1" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr><td>**Name**  
</td><td>**Description**  
</td><td>**Example**  
</td></tr><tr><td>`manufacturers`</td><td>Only return products with specific manufacturer ids (or names)</td><td>`?manufacturers=1,burberry`</td></tr><tr><td>`tags`</td><td>Only return products with specific tag ids (or names formatted as `group|name`)</td><td>`?tags=1,colour|red`</td></tr><tr><td>`barcodes`</td><td>Only return products with specific barcodes</td><td>`?barcodes=123,abc`</td></tr><tr><td>`references`</td><td>Only return products with specific references</td><td>`?references=123,abc`</td></tr><tr><td>`price`</td><td>Only return products with specific price in whole units (e.g. pounds, not pence)</td><td>`?price=123`</td></tr><tr><td>`min_price`</td><td>Only return products with price above min price in whole units (e.g. pounds, not pence)</td><td>`?min_price=123`</td></tr><tr><td>`max_price`</td><td>Only return products with price below max price in whole units (e.g. pounds, not pence)</td><td>`?max_price=123`</td></tr><tr><td>`stock_level`</td><td>Only return products with specific stock level</td><td>`?stock_level=1`</td></tr><tr><td>`min_stock_level`</td><td>Only return products with stock above specific stock level</td><td>`?min_stock_level=1`</td></tr><tr><td>`max_stock_level`</td><td>Only return products with stock below specific stock level</td><td>`?max_stock_level=10`</td></tr><tr><td>`type`</td><td>Only return products of a certain type (e.g. simple or variant)</td><td>`?type=variant`</td></tr><tr><td>`models`</td><td>Only return products with specific models</td><td>`?models=ABC,DEF`</td></tr><tr><td>`skus`</td><td>Only return products with variants that have specific SKUs</td><td>`?skus=ABC-123,DEF-456`</td></tr></tbody></table>

<p class="callout info">The `tags` filter applies AND logic across groups and OR logic within groups:  
  
- `?tags=size|small,colour|red` = small **and** red.  
- `?tags=colour|red,colour|green` = red **or** green.</p>

<p class="callout info">Plural filters can also be used in singular form, e.g. `?manufacturer=burberry` for `?manufacturers=burberry`.</p>

## Example Request

```
GET /api/products/search?per_page=2&min_updated_at=2023-08-30%2010:36:23&min_stock_level=1&max_stock_level=10
```

## Example Response

```json
{
    "current_page": 1,
    "data": [
        //...
    ],
    "first_page_url": "http://aero.test/api/products?page=1",
    "from": 1,
    "last_page": 16,
    "last_page_url": "http://aero.test/api/products?page=16",
    "next_page_url": "http://aero.test/api/products?page=2",
    "path": "http://aero.test/api/products",
    "per_page": 2,
    "prev_page_url": null,
    "to": 2,
    "total": 32
}
```