> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.brevo.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.brevo.com/_mcp/server.

# Return all your products

GET https://api.brevo.com/v3/products

Retrieve a paginated list of all ecommerce products stored in your Brevo account. Results are sorted by creation date in descending order by default, and can be filtered by product IDs, name (minimum 3 characters), price range, category IDs, modification date, creation date, or deletion status. Use the `search` parameter to query across SKU, name, and ID simultaneously — results are prioritized as exact SKU match > SKU prefix match > name match > ID match. Pagination defaults to 50 products per page (maximum 1000), and the response includes a `count` field with the total number of matching products.

Reference: https://developers.brevo.com/reference/get-products

## Authentication

- `api-key` header (required) — The API key should be passed in the request headers as `api-key` for authentication.

## Request

### Query parameters

- `limit` (long, optional, default: 50) — Number of documents per page
- `offset` (long, optional, default: 0) — Index of the first document in the page
- `sort` (enum, optional, default: desc) — Sort the results in the ascending/descending order of record creation. Default order is **descending** if `sort` is not passed
  - Allowed values: `asc`, `desc`
- `ids` (list of string, optional) — Filter by product ids
- `search` (string, optional) — Search products simultaneously across SKU, name, and ID fields. Results are returned in the following priority order: **exact SKU match** > **SKU prefix match** > **name match** > **ID match**. For example, `?search=123` on products with `{sku: "123"}` and `{sku: "123456"}` returns the exact SKU match first.
- `name` (string, optional) — Filter by product name, minimum 3 characters should be present for search.
- `price[lte]` (double, optional) — Price filter for products less than and equals to particular amount
- `price[gte]` (double, optional) — Price filter for products greater than and equals to particular amount
- `price[lt]` (double, optional) — Price filter for products less than particular amount
- `price[gt]` (double, optional) — Price filter for products greater than particular amount
- `price[eq]` (double, optional) — Price filter for products equals to particular amount
- `price[ne]` (double, optional) — Price filter for products not equals to particular amount
- `alternativePrice[lte]` (double, optional) — Alternative price filter for products less than and equals to particular amount
- `alternativePrice[gte]` (double, optional) — Alternative price filter for products greater than and equals to particular amount
- `alternativePrice[lt]` (double, optional) — Alternative price filter for products less than particular amount
- `alternativePrice[gt]` (double, optional) — Alternative price filter for products greater than particular amount
- `alternativePrice[eq]` (double, optional) — Alternative price filter for products equals to particular amount
- `alternativePrice[ne]` (double, optional) — Alternative price filter for products not equals to particular amount
- `categories` (list of string, optional) — Filter by categories ids
- `modifiedSince` (string, optional) — Filter (urlencoded) the products modified after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). **Prefer to pass your timezone in date-time format for accurate result.**
- `createdSince` (string, optional) — Filter (urlencoded) the products created after a given UTC date-time (YYYY-MM-DDTHH:mm:ss.SSSZ). **Prefer to pass your timezone in date-time format for accurate result.**
- `sortByField` (enum, optional) — Sort the results by a specific field. Default sort field is `created_at` when not passed.
  - Allowed values: `created_at`, `name`, `price`, `id`
- `isDeleted` (string, optional) — Filter products by their deletion status. If `false` is passed, only products that are not deleted will be returned.

## Response

### 200

All products listed

- `count` (long, required) — Number of products
- `products` (list of object, required)
  - `createdAt` (string, required) — Creation UTC date-time of the product (YYYY-MM-DDTHH:mm:ss.SSSZ)
  - `id` (string, required) — Product ID for which you requested the details
  - `modifiedAt` (string, required) — Last modification UTC date-time of the product (YYYY-MM-DDTHH:mm:ss.SSSZ)
  - `name` (string, required) — Name of the product for which you requested the details
  - `s3ThumbAnalytics` (string, required) — S3 thumbnail url of original image in 120x120 dimension for analytics section
  - `s3ThumbEditor` (string, required) — S3 thumbnail url of original image in 600x400 dimension for editor section
  - `brand` (string, optional) — Brand of the product
  - `categories` (list of string, optional) — Category ID-s of the product
  - `description` (string, optional) — Description of the product
  - `imageUrl` (string, optional) — Absolute URL to the cover image of the product
  - `isDeleted` (boolean, optional) — Product deleted from the shop's database but not from Brevo
  - `metaInfo` (object, optional) — Meta data of product such as description, vendor, producer, stock level, etc.
  - `parentId` (string, optional) — Parent product id of the product
  - `price` (float, optional) — Price of the product
  - `alternativePrice` (float, optional) — Alternative price of the product
  - `s3Original` (string, optional) — S3 url of original image
  - `sku` (string, optional) — Product identifier from the shop
  - `stock` (double, optional) — Current stock value of the product from the shop's database
  - `url` (string, optional) — URL to the product

## Errors

### 400 Bad Request Error

bad request

- `code` (enum, required) — Error code displayed in case of a failure
  - Allowed values: `invalid_parameter`, `missing_parameter`, `out_of_range`, `campaign_processing`, `campaign_sent`, `document_not_found`, `not_enough_credits`, `permission_denied`, `duplicate_parameter`, `duplicate_request`, `method_not_allowed`, `unauthorized`, `account_under_validation`, `not_acceptable`, `bad_request`, `unprocessable_entity`, `Domain does not exist`, `Contact email not found`, `Attribute not found`, `Category id not found`, `Invalid parameters passed`, `Record(s) for identifier not found`, `Returned when query params are invalid`, `Returned when invalid data posted`, `Feed not found`, `Campaign ID not found`, `api-key not found`, `DMARC policy requires domain authentication`, `DNS records not properly configured`, `Invalid OTP code provided`, `OTP code has expired`, `Domain already exists in your account`, `The sum of all IP weights must equal 100`, `Authentication failed`, `Insufficient credits`, `Request already processed`
- `message` (string, required) — Readable message associated to the failure

## Examples

**Response**

```json
{
  "count": 2,
  "products": [
    {
      "createdAt": "2022-06-30T10:29:16.078Z",
      "id": "7498033266862",
      "modifiedAt": "2022-06-30T10:29:16.078Z",
      "name": "Alpina Panoma Classic",
      "s3ThumbAnalytics": "https://img-ecom.mailinblue.com/path-to-analytics/img.jpg",
      "s3ThumbEditor": "https://img-ecom.mailinblue.com/path-to-editor/img.jpg",
      "categories": [
        "279638835374",
        "279502848174"
      ],
      "imageUrl": "http://mydomain.com/product-absoulte-url/img.jpeg",
      "isDeleted": true,
      "price": 49.95,
      "alternativePrice": 39.95,
      "s3Original": "https://img-ecom.mailinblue.com/path-to-original/img.jpg",
      "sku": "186622-9",
      "stock": 100,
      "url": "https://mydomain.com/products/alpina-panoma-classic"
    },
    {
      "createdAt": "2022-06-30T10:29:16.078Z",
      "id": "7498033266862",
      "modifiedAt": "2022-06-30T10:29:16.078Z",
      "name": "Alpina Panoma Classic2",
      "s3ThumbAnalytics": "https://img-ecom.mailinblue.com/path-to-analytics/img.jpg",
      "s3ThumbEditor": "https://img-ecom.mailinblue.com/path-to-editor/img.jpg",
      "categories": [
        "2d79638835374",
        "27d9502848174"
      ],
      "imageUrl": "http://mydomain.com/product-absoulte-url/img.jpeg",
      "isDeleted": true,
      "metaInfo": {
        "brand": "addidas",
        "description": "Shoes for sports"
      },
      "price": 49.95,
      "alternativePrice": 44.95,
      "s3Original": "https://img-ecom.mailinblue.com/path-to-original/img.jpg",
      "sku": "186622-9",
      "stock": 350,
      "url": "https://mydomain.com/products/alpina-panoma-classic2"
    }
  ]
}
```

**SDK Code**

```typescript response
import { BrevoClient } from "@getbrevo/brevo";

async function main() {
    const client = new BrevoClient({
        apiKey: "YOUR_API_KEY_HERE",
    });
    await client.ecommerce.getProducts({});
}
main();

```

```python response
from brevo import Brevo

client = Brevo(
    api_key="YOUR_API_KEY_HERE",
)

client.ecommerce.get_products()

```

```php response
<?php

namespace Example;

use Brevo\Brevo;
use Brevo\Ecommerce\Requests\GetProductsRequest;

$client = new Brevo(
    apiKey: 'YOUR_API_KEY_HERE',
);
$client->ecommerce->getProducts(
    new GetProductsRequest([]),
);

```

```go response
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.brevo.com/v3/products"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("api-key", "<apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby response
require 'uri'
require 'net/http'

url = URI("https://api.brevo.com/v3/products")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["api-key"] = '<apiKey>'

response = http.request(request)
puts response.read_body
```

```java response
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.brevo.com/v3/products")
  .header("api-key", "<apiKey>")
  .asString();
```

```csharp response
using RestSharp;

var client = new RestClient("https://api.brevo.com/v3/products");
var request = new RestRequest(Method.GET);
request.AddHeader("api-key", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift response
import Foundation

let headers = ["api-key": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.brevo.com/v3/products")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```