> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trychannel3.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Search with Filters

Pass a `filters` object to `products.search`. Every field is optional — combine as many as you need.

| Filter     | SDK page                                    |
| ---------- | ------------------------------------------- |
| Price      | [Price filter](/sdk/filters/price)          |
| Color      | [Color filter](/sdk/filters/color)          |
| Dimensions | [Dimension filter](/sdk/filters/dimensions) |
| Brand      | [Brand filter](/sdk/filters/brand)          |
| Website    | [Website filter](/sdk/filters/website)      |
| Attributes | [Attribute filter](/sdk/filters/attributes) |

## Combined example

<CodeGroup>
  ```typescript TypeScript theme={null}
  import Channel3 from "@channel3/sdk";

  const client = new Channel3();

  async function main() {
    const response = await client.products.search({
      query: "running shoes",
      filters: {
        brand_ids: ["brand_id_1", "brand_id_2"],
        gender: "unisex",
        price: { min_price: 50.0, max_price: 150.0 },
        availability: ["InStock", "LimitedAvailability"],
      },
      limit: 20,
    });
    console.log(response.products[0]?.offers[0]?.price);
  }

  main();
  ```

  ```python Python theme={null}
  from channel3_sdk import Channel3

  client = Channel3()

  def main():
      response = client.products.search(
          query="running shoes",
          filters={
              "availability": ["InStock"],
              "price": {"min_price": 10, "max_price": 50},
              "gender": "male",
          },
          limit=20,
      )
      print(response.products[0].offers[0].price)

  if __name__ == "__main__":
      main()
  ```
</CodeGroup>

Price and buy links are on **offers** — see [Offer](/concepts/offer).
