# List products (/api/products/list-products)

`GET https://api.comecero.com/api/v1/products`

Returns your products, sorted by name unless you choose another `sort_by`. Deleted products are left out unless you send `deleted=true`. Prices come back in one currency: the cart's or invoice's currency when you send `cart_id` or `invoice_id`, else the `currency` you send, else a currency guessed from `country` or the shopper's IP address, else the account's default. Secret, trusted and limited tokens may call it. This is the one list a limited token may read, so a shop can show its catalog before anyone signs in. For a limited token the list always holds only active, visible, not deleted products, whatever filters you send.

## Parameters

- `offset` (query): For offset-based lists, how many items to skip before the page starts. Use `next_page_offset` or `previous_page_offset` from the page you have. A value that is not a whole number is a `400`.
- `limit` (query): How many items to return on one page, from 1 to 100. The default is 100. A value outside 1 to 100, or one that is not a whole number, is a `400`.
- `sort_by` (query): The field to sort by. The default is `name`.
- `desc` (query): Sort in descending order (newest, largest or last first) when `true`. The default is `false`. A value other than `true` or `false` is a `400`.
- `expand` (query): Comma-separated child objects to return in full instead of as a URL, for example `customer,payments`. Use dot notation for nested objects (`items.product`), up to four levels deep. A single object takes up to 12 paths; a list takes up to 2, applied to every item. Extra paths are dropped without an error. See [Expanding objects](https://docs.comecero.com/docs/basic-concepts/expanding-objects).
- `show` (query): Comma-separated fields to return; all others are left out. Use dot notation for child fields (`customer.email`). You cannot send `show` and `hide` together (`400`). See [Customizing output](https://docs.comecero.com/docs/basic-concepts/customizing-output).
- `hide` (query): Comma-separated fields to leave out of the response. Use dot notation for child fields (`customer.email`). You cannot send `show` and `hide` together (`400`). See [Customizing output](https://docs.comecero.com/docs/basic-concepts/customizing-output).
- `formatted` (query): When `true`, the object also has a `formatted` child with amounts and dates as display text in the shopper's language and currency (for example `$19.99` or `November 7, 2026`). The default is `false`. See [Localized formatting](https://docs.comecero.com/docs/basic-concepts/localized-formatting).
- `q` (query): Search text. An exact product id returns that product; otherwise products whose name contains the text (any case) are returned.
- `active` (query): Only products with this `active` value. Always `true` for a limited token.
- `hidden` (query): Only products with this `hidden` value. Always `false` for a limited token.
- `deleted` (query): Send `true` to include deleted products as well. Any other value, or none, leaves them out. Always `false` for a limited token.
- `currency` (query): The ISO 4217 currency to price the products in. It must be a currency the account can take payment in, or the request fails with `400`.
- `country` (query): A two-letter ISO country code. Prices come back in that country's currency when the account supports it, else in the account's default currency.
- `cart_id` (query): Price the products in this cart's currency and exchange rate, so the list matches what the shopper will pay. Ignored if the token may not read the cart.
- `invoice_id` (query): Price the products in this invoice's currency and exchange rate. Ignored if the token may not read the invoice.
- `user_locale` (query): The shopper's language, such as `de` or `ja-JP`, used to pick a translation. When left out, the `Accept-Language` header is used for limited and trusted tokens.

Responses: 200, 400, 401, 403, 500.

Full schemas: operation `list_products` in /openapi.json.